diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 4eb4ffac5..18ad16e4b 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -8,6 +8,6 @@ Please include a summary of the changes and which issue is fixed / feature is ad
 
 - [ ] Initial Manual Tests Passed
 - [ ] Double check modified code and verify it with the feature/task requirements
-- [ ] Formate code
+- [ ] Format code
 - [ ] Look for code duplication
 - [ ] Clear naming for variables and methods
diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml
index 682afc8f8..04b53714c 100644
--- a/.github/workflows/pr_test_build.yml
+++ b/.github/workflows/pr_test_build.yml
@@ -100,6 +100,7 @@ jobs:
           echo "const backupSalt = '${{ secrets.BACKUP_SALT }}';" >> lib/.secrets.g.dart
           echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
           echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
+          echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
           echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart
           echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart
           echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart
@@ -108,6 +109,7 @@ jobs:
           echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
           echo "const sideShiftApiKey = '${{ secrets.SIDE_SHIFT_API_KEY }}';" >> lib/.secrets.g.dart
           echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart
+          echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
           echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
           echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart
           echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
diff --git a/.gitignore b/.gitignore
index 20c65dbc2..8b8030448 100644
--- a/.gitignore
+++ b/.gitignore
@@ -136,3 +136,8 @@ assets/images/app_logo.png
 /pubspec.lock
 /android/app.properties
 /android/app/src/main/AndroidManifest.xml
+
+
+macos/Runner/Info.plist
+macos/Runner/DebugProfile.entitlements
+macos/Runner/Release.entitlements
\ No newline at end of file
diff --git a/.metadata b/.metadata
index e0236519d..cdddb9350 100644
--- a/.metadata
+++ b/.metadata
@@ -1,10 +1,30 @@
 # This file tracks properties of this Flutter project.
 # Used by Flutter tool to assess capabilities and perform upgrades etc.
 #
-# This file should be version controlled and should not be manually edited.
+# This file should be version controlled.
 
 version:
-  revision: 20e59316b8b8474554b38493b8ca888794b0234a
+  revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
   channel: stable
 
 project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+  platforms:
+    - platform: root
+      create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+      base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+    - platform: macos
+      create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+      base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+
+  # User provided section
+
+  # List of Local paths (relative to this file) that should be
+  # ignored by the migrate tool.
+  #
+  # Files that are not part of the templates will be ignored by default.
+  unmanaged_files:
+    - 'lib/main.dart'
+    - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
index 141c26944..edaaefeb2 100644
--- a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
+++ b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
@@ -11,6 +11,7 @@ import io.flutter.plugin.common.MethodChannel;
 
 import android.os.AsyncTask;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.view.WindowManager;
@@ -23,6 +24,7 @@ import java.security.SecureRandom;
 public class MainActivity extends FlutterFragmentActivity {
     final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
     final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
+    boolean isAppSecure = false;
 
     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
@@ -40,14 +42,6 @@ public class MainActivity extends FlutterFragmentActivity {
 
         try {
             switch (call.method) {
-                case "enableWakeScreen":
-                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
-                case "disableWakeScreen":
-                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
                 case "sec_random":
                     int count = call.argument("count");
                     SecureRandom random = new SecureRandom();
@@ -56,13 +50,21 @@ public class MainActivity extends FlutterFragmentActivity {
                     handler.post(() -> result.success(bytes));
                     break;
                 case "getUnstoppableDomainAddress":
-                    int  version = Build.VERSION.SDK_INT;
+                    int version = Build.VERSION.SDK_INT;
                     if (version >= UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK) {
                         getUnstoppableDomainAddress(call, result);
                     } else {
                         handler.post(() -> result.success(""));
                     }
                     break;
+                case "setIsAppSecure":
+                    isAppSecure = call.argument("isAppSecure");
+                    if (isAppSecure) {
+                        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
+                    } else {
+                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
+                    }
+                    break;
                 default:
                     handler.post(() -> result.notImplemented());
             }
diff --git a/android/app/src/main/java/com/cakewallet/haven/MainActivity.java b/android/app/src/main/java/com/cakewallet/haven/MainActivity.java
index 065af9318..8c13d1f8d 100644
--- a/android/app/src/main/java/com/cakewallet/haven/MainActivity.java
+++ b/android/app/src/main/java/com/cakewallet/haven/MainActivity.java
@@ -40,14 +40,6 @@ public class MainActivity extends FlutterFragmentActivity {
 
         try {
             switch (call.method) {
-                case "enableWakeScreen":
-                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
-                case "disableWakeScreen":
-                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
                 case "sec_random":
                     int count = call.argument("count");
                     SecureRandom random = new SecureRandom();
diff --git a/android/app/src/main/java/com/monero/app/MainActivity.java b/android/app/src/main/java/com/monero/app/MainActivity.java
index 385932b38..73914c43c 100644
--- a/android/app/src/main/java/com/monero/app/MainActivity.java
+++ b/android/app/src/main/java/com/monero/app/MainActivity.java
@@ -23,6 +23,7 @@ import java.security.SecureRandom;
 public class MainActivity extends FlutterFragmentActivity {
     final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
     final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
+    boolean isAppSecure = false;
 
     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
@@ -40,14 +41,6 @@ public class MainActivity extends FlutterFragmentActivity {
 
         try {
             switch (call.method) {
-                case "enableWakeScreen":
-                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
-                case "disableWakeScreen":
-                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    handler.post(() -> result.success(true));
-                    break;
                 case "sec_random":
                     int count = call.argument("count");
                     SecureRandom random = new SecureRandom();
@@ -56,13 +49,21 @@ public class MainActivity extends FlutterFragmentActivity {
                     handler.post(() -> result.success(bytes));
                     break;
                 case "getUnstoppableDomainAddress":
-                    int  version = Build.VERSION.SDK_INT;
+                    int version = Build.VERSION.SDK_INT;
                     if (version >= UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK) {
                         getUnstoppableDomainAddress(call, result);
                     } else {
                         handler.post(() -> result.success(""));
                     }
                     break;
+                case "setIsAppSecure":
+                    isAppSecure = call.argument("isAppSecure");
+                    if (isAppSecure) {
+                        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
+                    } else {
+                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
+                    }
+                    break;
                 default:
                     handler.post(() -> result.notImplemented());
             }
diff --git a/assets/images/desktop_transactions_outline_icon.png b/assets/images/desktop_transactions_outline_icon.png
new file mode 100644
index 000000000..38fc38866
Binary files /dev/null and b/assets/images/desktop_transactions_outline_icon.png differ
diff --git a/assets/images/desktop_transactions_solid_icon.png b/assets/images/desktop_transactions_solid_icon.png
new file mode 100644
index 000000000..d793803da
Binary files /dev/null and b/assets/images/desktop_transactions_solid_icon.png differ
diff --git a/assets/images/settings_outline.png b/assets/images/settings_outline.png
new file mode 100644
index 000000000..3230f00c4
Binary files /dev/null and b/assets/images/settings_outline.png differ
diff --git a/assets/images/support_icon.png b/assets/images/support_icon.png
new file mode 100644
index 000000000..0d6ec99fd
Binary files /dev/null and b/assets/images/support_icon.png differ
diff --git a/assets/images/wallet_outline.png b/assets/images/wallet_outline.png
new file mode 100644
index 000000000..e75131b05
Binary files /dev/null and b/assets/images/wallet_outline.png differ
diff --git a/assets/images/wallet_solid.png b/assets/images/wallet_solid.png
new file mode 100644
index 000000000..0997221f2
Binary files /dev/null and b/assets/images/wallet_solid.png differ
diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt
new file mode 100644
index 000000000..be218630d
--- /dev/null
+++ b/assets/text/Monerocom_Release_Notes.txt
@@ -0,0 +1 @@
+Fix Restore from QR code
\ No newline at end of file
diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt
new file mode 100644
index 000000000..d9acd464f
--- /dev/null
+++ b/assets/text/Release_Notes.txt
@@ -0,0 +1,4 @@
+Fix for QR codes
+Fix for creating sub-addresses
+Fix Add/Edit nodes
+Fix issues with text/amount fields
\ No newline at end of file
diff --git a/cw_bitcoin/lib/bitcoin_transaction_wrong_balance_exception.dart b/cw_bitcoin/lib/bitcoin_transaction_wrong_balance_exception.dart
index 9960d6c65..3f379bea0 100644
--- a/cw_bitcoin/lib/bitcoin_transaction_wrong_balance_exception.dart
+++ b/cw_bitcoin/lib/bitcoin_transaction_wrong_balance_exception.dart
@@ -6,5 +6,5 @@ class BitcoinTransactionWrongBalanceException implements Exception {
   final CryptoCurrency currency;
 
   @override
-  String toString() => 'Wrong balance. Not enough ${currency.title} on your balance.';
+  String toString() => 'You do not have enough ${currency.title} to send this amount.';
 }
\ No newline at end of file
diff --git a/cw_bitcoin/lib/electrum.dart b/cw_bitcoin/lib/electrum.dart
index d50f280f6..81f2da161 100644
--- a/cw_bitcoin/lib/electrum.dart
+++ b/cw_bitcoin/lib/electrum.dart
@@ -410,7 +410,7 @@ class ElectrumClient {
     switch (method) {
       case 'blockchain.scripthash.subscribe':
         final params = request['params'] as List<dynamic>;
-        final scripthash = params.first as String;
+        final scripthash = params.first as String?;
         final id = 'blockchain.scripthash.subscribe:$scripthash';
 
         _tasks[id]?.subject?.add(params.last);
@@ -430,15 +430,17 @@ class ElectrumClient {
 
   void _handleResponse(Map<String, dynamic> response) {
     final method = response['method'];
-    final id = response['id'] as String;
+    final id = response['id'] as String?;
     final result = response['result'];
 
     if (method is String) {
       _methodHandler(method: method, request: response);
       return;
     }
-
-    _finish(id, result);
+    
+    if (id != null){
+      _finish(id, result);
+    }
   }
 }
 
diff --git a/cw_bitcoin/lib/electrum_balance.dart b/cw_bitcoin/lib/electrum_balance.dart
index a26b79ddb..0a9a33d54 100644
--- a/cw_bitcoin/lib/electrum_balance.dart
+++ b/cw_bitcoin/lib/electrum_balance.dart
@@ -4,7 +4,7 @@ import 'package:cw_bitcoin/bitcoin_amount_format.dart';
 import 'package:cw_core/balance.dart';
 
 class ElectrumBalance extends Balance {
-  const ElectrumBalance({required this.confirmed, required this.unconfirmed})
+  const ElectrumBalance({required this.confirmed, required this.unconfirmed, required this.frozen})
       : super(confirmed, unconfirmed);
 
   static ElectrumBalance? fromJSON(String? jsonSource) {
@@ -16,20 +16,25 @@ class ElectrumBalance extends Balance {
 
     return ElectrumBalance(
         confirmed: decoded['confirmed'] as int? ?? 0,
-        unconfirmed: decoded['unconfirmed'] as int? ?? 0);
+        unconfirmed: decoded['unconfirmed'] as int? ?? 0,
+        frozen: decoded['frozen'] as int? ?? 0);
   }
 
   final int confirmed;
   final int unconfirmed;
+  final int frozen;
 
   @override
-  String get formattedAvailableBalance =>
-      bitcoinAmountToString(amount: confirmed);
+  String get formattedAvailableBalance => bitcoinAmountToString(amount: confirmed - frozen);
 
   @override
-  String get formattedAdditionalBalance =>
-      bitcoinAmountToString(amount: unconfirmed);
+  String get formattedAdditionalBalance => bitcoinAmountToString(amount: unconfirmed);
+
+  String get formattedFrozenBalance {
+    final frozenFormatted = bitcoinAmountToString(amount: frozen);
+    return frozenFormatted == '0.0' ? '' : frozenFormatted;
+  }
 
   String toJSON() =>
-      json.encode({'confirmed': confirmed, 'unconfirmed': unconfirmed});
+      json.encode({'confirmed': confirmed, 'unconfirmed': unconfirmed, 'frozen': frozen});
 }
diff --git a/cw_bitcoin/lib/electrum_transaction_info.dart b/cw_bitcoin/lib/electrum_transaction_info.dart
index 8d6ef0fea..b034c06b1 100644
--- a/cw_bitcoin/lib/electrum_transaction_info.dart
+++ b/cw_bitcoin/lib/electrum_transaction_info.dart
@@ -136,7 +136,7 @@ class ElectrumTransactionInfo extends TransactionInfo {
     return ElectrumTransactionInfo(type,
         id: bundle.originalTransaction.getId(),
         height: height,
-        isPending: false,
+        isPending: bundle.confirmations == 0,
         fee: fee,
         direction: direction,
         amount: amount,
diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart
index f31db7bb8..eac05378f 100644
--- a/cw_bitcoin/lib/electrum_wallet.dart
+++ b/cw_bitcoin/lib/electrum_wallet.dart
@@ -63,7 +63,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
         _scripthashesUpdateSubject = {},
         balance = ObservableMap<CryptoCurrency, ElectrumBalance>.of(
           currency != null
-           ? {currency: initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0)}
+           ? {currency: initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0,
+          frozen: 0)}
            : {}),
         this.unspentCoinsInfo = unspentCoinsInfo,
         super(walletInfo) {
@@ -133,8 +134,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
       await walletAddresses.discoverAddresses();
       await updateTransactions();
       _subscribeForUpdates();
-      await _updateBalance();
       await updateUnspent();
+      await updateBalance();
       _feeRates = await electrumClient.feeRates();
 
       Timer.periodic(const Duration(minutes: 1),
@@ -343,7 +344,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
         electrumClient: electrumClient, amount: amount, fee: fee)
       ..addListener((transaction) async {
         transactionHistory.addOne(transaction);
-        await _updateBalance();
+        await updateBalance();
       });
   }
 
@@ -497,7 +498,10 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
         hash: coin.hash,
         isFrozen: coin.isFrozen,
         isSending: coin.isSending,
-        noteRaw: coin.note
+        noteRaw: coin.note,
+        address: coin.address.address,
+        value: coin.value,
+        vout: coin.vout,
     );
 
     await unspentCoinsInfo.add(newInfo);
@@ -533,8 +537,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
     final transactionHex = verboseTransaction['hex'] as String;
     final original = bitcoin.Transaction.fromHex(transactionHex);
     final ins = <bitcoin.Transaction>[];
-    final time = verboseTransaction['time'] as int;
-    final confirmations = verboseTransaction['confirmations'] as int ?? 0;
+    final time = verboseTransaction['time'] as int?;
+    final confirmations = verboseTransaction['confirmations'] as int? ?? 0;
 
     for (final vin in original.ins) {
       final id = HEX.encode(vin.hash!.reversed.toList());
@@ -634,8 +638,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
       _scripthashesUpdateSubject[sh] = electrumClient.scripthashUpdate(sh);
       _scripthashesUpdateSubject[sh]?.listen((event) async {
         try {
-          await _updateBalance();
           await updateUnspent();
+          await updateBalance();
           await updateTransactions();
         } catch (e) {
           print(e.toString());
@@ -653,7 +657,17 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
       final sh = scriptHash(addressRecord.address, networkType: networkType);
       final balanceFuture = electrumClient.getBalance(sh);
       balanceFutures.add(balanceFuture);
-    } 
+    }
+
+    var totalFrozen = 0;
+    unspentCoinsInfo.values.forEach((info) {
+      unspentCoins.forEach((element) {
+        if (element.hash == info.hash && info.isFrozen && element.address.address == info.address
+            && element.value == info.value) {
+          totalFrozen += element.value;
+        }
+      });
+    });
 
     final balances = await Future.wait(balanceFutures);
     var totalConfirmed = 0;
@@ -672,10 +686,11 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
       }
     }
 
-    return ElectrumBalance(confirmed: totalConfirmed, unconfirmed: totalUnconfirmed);
+    return ElectrumBalance(confirmed: totalConfirmed, unconfirmed: totalUnconfirmed,
+    frozen: totalFrozen);
   }
 
-  Future<void> _updateBalance() async {
+  Future<void> updateBalance() async {
     balance[currency] = await _fetchBalances();
     await save();
   }
diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart
index eb7a0f61e..741c2fe1c 100644
--- a/cw_bitcoin/lib/electrum_wallet_addresses.dart
+++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart
@@ -48,7 +48,13 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
 
   @override
   @computed
-  String get address => receiveAddresses.first.address;
+  String get address {
+    if (receiveAddresses.isEmpty) {
+      return generateNewAddress().address;
+    }
+
+    return receiveAddresses.first.address;
+  }
 
   @override
   set address(String addr) => null;
@@ -121,8 +127,8 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
     return address;
   }
 
-  Future<BitcoinAddressRecord> generateNewAddress(
-      {bitcoin.HDWallet? hd, bool isHidden = false}) async {
+  BitcoinAddressRecord generateNewAddress(
+      {bitcoin.HDWallet? hd, bool isHidden = false}) {
     currentReceiveAddressIndex += 1;
     // FIX-ME: Check logic for whichi HD should be used here  ???
     final address = BitcoinAddressRecord(
@@ -165,7 +171,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
   Future<void> _discoverAddresses(bitcoin.HDWallet hd, bool isHidden) async {
     var hasAddrUse = true;
     List<BitcoinAddressRecord> addrs;
-    
+
     if (addresses.isNotEmpty) {
       addrs = addresses
         .where((addr) => addr.isHidden == isHidden)
@@ -179,7 +185,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
           hd: hd,
           isHidden: isHidden);
     }
-    
+
     while(hasAddrUse) {
       final addr = addrs.last.address;
       hasAddrUse = await _hasAddressUsed(addr);
diff --git a/cw_bitcoin/lib/electrum_wallet_snapshot.dart b/cw_bitcoin/lib/electrum_wallet_snapshot.dart
index 3755e7d18..6db0c23f2 100644
--- a/cw_bitcoin/lib/electrum_wallet_snapshot.dart
+++ b/cw_bitcoin/lib/electrum_wallet_snapshot.dart
@@ -37,7 +37,7 @@ class ElectrumWallletSnapshot {
         .map((addr) => BitcoinAddressRecord.fromJSON(addr))
         .toList();
     final balance = ElectrumBalance.fromJSON(data['balance'] as String) ??
-        ElectrumBalance(confirmed: 0, unconfirmed: 0);
+        ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0);
     var regularAddressIndex = 0;
     var changeAddressIndex = 0;
 
diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock
index bfcd9e5a6..4d864059f 100644
--- a/cw_bitcoin/pubspec.lock
+++ b/cw_bitcoin/pubspec.lock
@@ -746,5 +746,5 @@ packages:
     source: hosted
     version: "3.1.1"
 sdks:
-  dart: ">=2.19.0 <3.0.0"
+  dart: ">=2.19.0 <4.0.0"
   flutter: ">=3.0.0"
diff --git a/cw_core/lib/balance.dart b/cw_core/lib/balance.dart
index cf98f9e0f..6145411c4 100644
--- a/cw_core/lib/balance.dart
+++ b/cw_core/lib/balance.dart
@@ -8,4 +8,6 @@ abstract class Balance {
   String get formattedAvailableBalance;
 
   String get formattedAdditionalBalance;
+
+  String get formattedFrozenBalance => '';
 }
diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart
index 3d076f6e9..da9b7f9e9 100644
--- a/cw_core/lib/crypto_currency.dart
+++ b/cw_core/lib/crypto_currency.dart
@@ -66,6 +66,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
     CryptoCurrency.scrt,
     CryptoCurrency.uni,
     CryptoCurrency.stx,
+    CryptoCurrency.btcln,
   ];
 
   static const havenCurrencies = [
@@ -150,6 +151,8 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
   static const scrt = CryptoCurrency(title: 'SCRT', fullName: 'Secret Network', raw: 59, name: 'scrt', iconPath: 'assets/images/scrt_icon.png');
   static const uni = CryptoCurrency(title: 'UNI', tag: 'ETH', fullName: 'Uniswap', raw: 60, name: 'uni', iconPath: 'assets/images/uni_icon.png');
   static const stx = CryptoCurrency(title: 'STX', fullName: 'Stacks', raw: 61, name: 'stx', iconPath: 'assets/images/stx_icon.png');
+  static const btcln = CryptoCurrency(title: 'BTC', tag: 'LN', fullName: 'Bitcoin Lightning Network', raw: 62, name: 'btcln', iconPath: 'assets/images/btc.png');
+
 
   static final Map<int, CryptoCurrency> _rawCurrencyMap =
     [...all, ...havenCurrencies].fold<Map<int, CryptoCurrency>>(<int, CryptoCurrency>{}, (acc, item) {
diff --git a/cw_core/lib/node.dart b/cw_core/lib/node.dart
index d88d3e40f..fef5f0ecb 100644
--- a/cw_core/lib/node.dart
+++ b/cw_core/lib/node.dart
@@ -75,6 +75,25 @@ class Node extends HiveObject with Keyable {
     }
   }
 
+  @override
+  bool operator ==(other) =>
+      other is Node &&
+          (other.uriRaw == uriRaw &&
+              other.login == login &&
+              other.password == password &&
+              other.typeRaw == typeRaw &&
+              other.useSSL == useSSL &&
+              other.trusted == trusted);
+
+  @override
+  int get hashCode =>
+      uriRaw.hashCode ^
+      login.hashCode ^
+      password.hashCode ^
+      typeRaw.hashCode ^
+      useSSL.hashCode ^
+      trusted.hashCode;
+
   @override
   dynamic get keyIndex {
     _keyIndex ??= key;
diff --git a/cw_core/lib/set_app_secure_native.dart b/cw_core/lib/set_app_secure_native.dart
new file mode 100644
index 000000000..2f2e9a9c9
--- /dev/null
+++ b/cw_core/lib/set_app_secure_native.dart
@@ -0,0 +1,6 @@
+import 'package:flutter/services.dart';
+
+const utils = const MethodChannel('com.cake_wallet/native_utils');
+
+void setIsAppSecureNative(bool isAppSecure) =>
+    utils.invokeMethod<Uint8List>('setIsAppSecure', {'isAppSecure': isAppSecure});
diff --git a/cw_core/lib/unspent_coins_info.dart b/cw_core/lib/unspent_coins_info.dart
index d825db279..75c13f2cd 100644
--- a/cw_core/lib/unspent_coins_info.dart
+++ b/cw_core/lib/unspent_coins_info.dart
@@ -9,7 +9,10 @@ class UnspentCoinsInfo extends HiveObject {
     required this.hash,
     required this.isFrozen,
     required this.isSending,
-    required this.noteRaw});
+    required this.noteRaw,
+    required this.address,
+    required this.vout,
+    required this.value});
 
   static const typeId = 9;
   static const boxName = 'Unspent';
@@ -30,6 +33,15 @@ class UnspentCoinsInfo extends HiveObject {
   @HiveField(4)
   String? noteRaw;
 
+  @HiveField(5, defaultValue: '')
+  String address;
+
+  @HiveField(6, defaultValue: 0)
+  int value;
+
+  @HiveField(7, defaultValue: 0)
+  int vout;
+
   String get note => noteRaw ?? '';
 
   set note(String value) => noteRaw = value;
diff --git a/cw_core/lib/wallet_base.dart b/cw_core/lib/wallet_base.dart
index 1983e62b7..93821448c 100644
--- a/cw_core/lib/wallet_base.dart
+++ b/cw_core/lib/wallet_base.dart
@@ -71,4 +71,6 @@ abstract class WalletBase<
   void close();
 
   Future<void> changePassword(String password);
+
+  Future<void>? updateBalance();
 }
diff --git a/cw_core/pubspec.lock b/cw_core/pubspec.lock
index 01e19dda4..70652ec35 100644
--- a/cw_core/pubspec.lock
+++ b/cw_core/pubspec.lock
@@ -665,5 +665,5 @@ packages:
     source: hosted
     version: "3.1.1"
 sdks:
-  dart: ">=2.19.0 <3.0.0"
+  dart: ">=2.19.0 <4.0.0"
   flutter: ">=3.0.0"
diff --git a/cw_haven/lib/haven_wallet.dart b/cw_haven/lib/haven_wallet.dart
index a4b949d8f..2a72f078f 100644
--- a/cw_haven/lib/haven_wallet.dart
+++ b/cw_haven/lib/haven_wallet.dart
@@ -104,6 +104,9 @@ abstract class HavenWalletBase extends WalletBase<MoneroBalance,
        (_) async => await save());
   }
 
+  @override
+  Future<void>? updateBalance() => null;
+
   @override
   void close() {
     _listener?.stop();
@@ -166,14 +169,14 @@ abstract class HavenWalletBase extends WalletBase<MoneroBalance,
     if (hasMultiDestination) {
       if (outputs.any((item) => item.sendAll
           || (item.formattedCryptoAmount ?? 0) <= 0)) {
-        throw HavenTransactionCreationException('Wrong balance. Not enough XMR on your balance.');
+        throw HavenTransactionCreationException('You do not have enough coins to send this amount.');
       }
 
       final int totalAmount = outputs.fold(0, (acc, value) =>
           acc + (value.formattedCryptoAmount ?? 0));
 
       if (unlockedBalance < totalAmount) {
-        throw HavenTransactionCreationException('Wrong balance. Not enough XMR on your balance.');
+        throw HavenTransactionCreationException('You do not have enough coins to send this amount.');
       }
 
       final moneroOutputs = outputs.map((output) =>
@@ -204,7 +207,7 @@ abstract class HavenWalletBase extends WalletBase<MoneroBalance,
         final formattedBalance = moneroAmountToString(amount: unlockedBalance);
 
         throw HavenTransactionCreationException(
-            'Incorrect unlocked balance. Unlocked: $formattedBalance. Transaction amount: ${output.cryptoAmount}.');
+            'You do not have enough unlocked balance. Unlocked: $formattedBalance. Transaction amount: ${output.cryptoAmount}.');
       }
 
       pendingTransactionDescription =
diff --git a/cw_monero/.gitignore b/cw_monero/.gitignore
index c8bb78494..ebb19df82 100644
--- a/cw_monero/.gitignore
+++ b/cw_monero/.gitignore
@@ -8,4 +8,7 @@ build/
 
 ios/External/
 android/.externalNativeBuild/
-android/.cxx/
\ No newline at end of file
+android/.cxx/
+
+macos/cw_monero.podspec
+macos/External/
\ No newline at end of file
diff --git a/cw_monero/.metadata b/cw_monero/.metadata
index 36ba765ff..46a2f7f6f 100644
--- a/cw_monero/.metadata
+++ b/cw_monero/.metadata
@@ -1,10 +1,30 @@
 # This file tracks properties of this Flutter project.
 # Used by Flutter tool to assess capabilities and perform upgrades etc.
 #
-# This file should be version controlled and should not be manually edited.
+# This file should be version controlled.
 
 version:
-  revision: 798e4272a2e43d7daab75f225a13442e384ee0cd
-  channel: dev
+  revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+  channel: stable
 
 project_type: plugin
+
+# Tracks metadata for the flutter migrate command
+migration:
+  platforms:
+    - platform: root
+      create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+      base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+    - platform: macos
+      create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+      base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+
+  # User provided section
+
+  # List of Local paths (relative to this file) that should be
+  # ignored by the migrate tool.
+  #
+  # Files that are not part of the templates will be ignored by default.
+  unmanaged_files:
+    - 'lib/main.dart'
+    - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/cw_monero/analysis_options.yaml b/cw_monero/analysis_options.yaml
new file mode 100644
index 000000000..a5744c1cf
--- /dev/null
+++ b/cw_monero/analysis_options.yaml
@@ -0,0 +1,4 @@
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/cw_monero/example/.gitignore b/cw_monero/example/.gitignore
new file mode 100644
index 000000000..24476c5d1
--- /dev/null
+++ b/cw_monero/example/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/cw_monero/example/README.md b/cw_monero/example/README.md
new file mode 100644
index 000000000..18cf6d109
--- /dev/null
+++ b/cw_monero/example/README.md
@@ -0,0 +1,16 @@
+# cw_monero_example
+
+Demonstrates how to use the cw_monero plugin.
+
+## Getting Started
+
+This project is a starting point for a Flutter application.
+
+A few resources to get you started if this is your first Flutter project:
+
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+
+For help getting started with Flutter development, view the
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/cw_monero/example/analysis_options.yaml b/cw_monero/example/analysis_options.yaml
new file mode 100644
index 000000000..61b6c4de1
--- /dev/null
+++ b/cw_monero/example/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+  # The lint rules applied to this project can be customized in the
+  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+  # included above or to enable additional rules. A list of all available lints
+  # and their documentation is published at
+  # https://dart-lang.github.io/linter/lints/index.html.
+  #
+  # Instead of disabling a lint rule for the entire project in the
+  # section below, it can also be suppressed for a single line of code
+  # or a specific dart file by using the `// ignore: name_of_lint` and
+  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+  # producing the lint.
+  rules:
+    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
+    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/cw_monero/example/lib/main.dart b/cw_monero/example/lib/main.dart
new file mode 100644
index 000000000..e4374f097
--- /dev/null
+++ b/cw_monero/example/lib/main.dart
@@ -0,0 +1,63 @@
+import 'package:flutter/material.dart';
+import 'dart:async';
+
+import 'package:flutter/services.dart';
+import 'package:cw_monero/cw_monero.dart';
+
+void main() {
+  runApp(const MyApp());
+}
+
+class MyApp extends StatefulWidget {
+  const MyApp({super.key});
+
+  @override
+  State<MyApp> createState() => _MyAppState();
+}
+
+class _MyAppState extends State<MyApp> {
+  String _platformVersion = 'Unknown';
+  final _cwMoneroPlugin = CwMonero();
+
+  @override
+  void initState() {
+    super.initState();
+    initPlatformState();
+  }
+
+  // Platform messages are asynchronous, so we initialize in an async method.
+  Future<void> initPlatformState() async {
+    String platformVersion;
+    // Platform messages may fail, so we use a try/catch PlatformException.
+    // We also handle the message potentially returning null.
+    try {
+      platformVersion =
+          await _cwMoneroPlugin.getPlatformVersion() ?? 'Unknown platform version';
+    } on PlatformException {
+      platformVersion = 'Failed to get platform version.';
+    }
+
+    // If the widget was removed from the tree while the asynchronous platform
+    // message was in flight, we want to discard the reply rather than calling
+    // setState to update our non-existent appearance.
+    if (!mounted) return;
+
+    setState(() {
+      _platformVersion = platformVersion;
+    });
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return MaterialApp(
+      home: Scaffold(
+        appBar: AppBar(
+          title: const Text('Plugin example app'),
+        ),
+        body: Center(
+          child: Text('Running on: $_platformVersion\n'),
+        ),
+      ),
+    );
+  }
+}
diff --git a/cw_monero/example/macos/.gitignore b/cw_monero/example/macos/.gitignore
new file mode 100644
index 000000000..746adbb6b
--- /dev/null
+++ b/cw_monero/example/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/cw_monero/example/macos/Flutter/Flutter-Debug.xcconfig b/cw_monero/example/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 000000000..4b81f9b2d
--- /dev/null
+++ b/cw_monero/example/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/cw_monero/example/macos/Flutter/Flutter-Release.xcconfig b/cw_monero/example/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 000000000..5caa9d157
--- /dev/null
+++ b/cw_monero/example/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/cw_monero/example/macos/Flutter/GeneratedPluginRegistrant.swift b/cw_monero/example/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 000000000..e25d64097
--- /dev/null
+++ b/cw_monero/example/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,14 @@
+//
+//  Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import cw_monero
+import path_provider_foundation
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+  CwMoneroPlugin.register(with: registry.registrar(forPlugin: "CwMoneroPlugin"))
+  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+}
diff --git a/cw_monero/example/macos/Podfile b/cw_monero/example/macos/Podfile
new file mode 100644
index 000000000..dade8dfad
--- /dev/null
+++ b/cw_monero/example/macos/Podfile
@@ -0,0 +1,40 @@
+platform :osx, '10.11'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+  use_frameworks!
+  use_modular_headers!
+
+  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_macos_build_settings(target)
+  end
+end
diff --git a/cw_monero/example/macos/Podfile.lock b/cw_monero/example/macos/Podfile.lock
new file mode 100644
index 000000000..692176b30
--- /dev/null
+++ b/cw_monero/example/macos/Podfile.lock
@@ -0,0 +1,22 @@
+PODS:
+  - FlutterMacOS (1.0.0)
+  - path_provider_macos (0.0.1):
+    - FlutterMacOS
+
+DEPENDENCIES:
+  - FlutterMacOS (from `Flutter/ephemeral`)
+  - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
+
+EXTERNAL SOURCES:
+  FlutterMacOS:
+    :path: Flutter/ephemeral
+  path_provider_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
+
+SPEC CHECKSUMS:
+  FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
+  path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
+
+PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
+
+COCOAPODS: 1.11.2
diff --git a/cw_monero/example/macos/Runner.xcodeproj/project.pbxproj b/cw_monero/example/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..472859e8c
--- /dev/null
+++ b/cw_monero/example/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,632 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 51;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+			buildPhases = (
+				33CC111E2044C6BF0003C045 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "Flutter Assemble";
+			productName = FLX;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+		33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+		33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+		33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+		428E7496E2068D0AB138F295 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+			remoteInfo = FLX;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		33CC110E2044A8840003C045 /* Bundle Framework */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+			);
+			name = "Bundle Framework";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
+		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
+		33CC10ED2044A3C60003C045 /* cw_monero_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cw_monero_example.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
+		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
+		33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
+		33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
+		33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
+		33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
+		33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
+		33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
+		33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
+		33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
+		A9CDA1605413332AB9056C23 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		E434913D71DC2682EF8E9059 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
+		EEF09839C86335F78056F812 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		33CC10EA2044A3C60003C045 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				428E7496E2068D0AB138F295 /* Pods_Runner.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		33BA886A226E78AF003329D5 /* Configs */ = {
+			isa = PBXGroup;
+			children = (
+				33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+			);
+			path = Configs;
+			sourceTree = "<group>";
+		};
+		33CC10E42044A3C60003C045 = {
+			isa = PBXGroup;
+			children = (
+				33FAB671232836740065AC1E /* Runner */,
+				33CEB47122A05771004F2AC0 /* Flutter */,
+				33CC10EE2044A3C60003C045 /* Products */,
+				D73912EC22F37F3D000D13A0 /* Frameworks */,
+				77870A4C94A9AB6EEC2EE261 /* Pods */,
+			);
+			sourceTree = "<group>";
+		};
+		33CC10EE2044A3C60003C045 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10ED2044A3C60003C045 /* cw_monero_example.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		33CC11242044D66E0003C045 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F22044A3C60003C045 /* Assets.xcassets */,
+				33CC10F42044A3C60003C045 /* MainMenu.xib */,
+				33CC10F72044A3C60003C045 /* Info.plist */,
+			);
+			name = Resources;
+			path = ..;
+			sourceTree = "<group>";
+		};
+		33CEB47122A05771004F2AC0 /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+				33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+				33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+				33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+			);
+			path = Flutter;
+			sourceTree = "<group>";
+		};
+		33FAB671232836740065AC1E /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+				33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+				33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+				33E51914231749380026EE4D /* Release.entitlements */,
+				33CC11242044D66E0003C045 /* Resources */,
+				33BA886A226E78AF003329D5 /* Configs */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+		77870A4C94A9AB6EEC2EE261 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				EEF09839C86335F78056F812 /* Pods-Runner.debug.xcconfig */,
+				A9CDA1605413332AB9056C23 /* Pods-Runner.release.xcconfig */,
+				E434913D71DC2682EF8E9059 /* Pods-Runner.profile.xcconfig */,
+			);
+			name = Pods;
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				C29B2253BA962B7A415DBA77 /* Pods_Runner.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		33CC10EC2044A3C60003C045 /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				0A239C1738C005E3F6E4DFC6 /* [CP] Check Pods Manifest.lock */,
+				33CC10E92044A3C60003C045 /* Sources */,
+				33CC10EA2044A3C60003C045 /* Frameworks */,
+				33CC10EB2044A3C60003C045 /* Resources */,
+				33CC110E2044A8840003C045 /* Bundle Framework */,
+				3399D490228B24CF009A79C7 /* ShellScript */,
+				0CEAA82AE8A029C31B39F234 /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				33CC11202044C79F0003C045 /* PBXTargetDependency */,
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 33CC10ED2044A3C60003C045 /* cw_monero_example.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		33CC10E52044A3C60003C045 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 0920;
+				LastUpgradeCheck = 1300;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					33CC10EC2044A3C60003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						LastSwiftMigration = 1100;
+						ProvisioningStyle = Automatic;
+						SystemCapabilities = {
+							com.apple.Sandbox = {
+								enabled = 1;
+							};
+						};
+					};
+					33CC111A2044C6BA0003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						ProvisioningStyle = Manual;
+					};
+				};
+			};
+			buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 33CC10E42044A3C60003C045;
+			productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				33CC10EC2044A3C60003C045 /* Runner */,
+				33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		33CC10EB2044A3C60003C045 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		0A239C1738C005E3F6E4DFC6 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		0CEAA82AE8A029C31B39F234 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		3399D490228B24CF009A79C7 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+		};
+		33CC111E2044C6BF0003C045 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				Flutter/ephemeral/FlutterInputs.xcfilelist,
+			);
+			inputPaths = (
+				Flutter/ephemeral/tripwire,
+			);
+			outputFileListPaths = (
+				Flutter/ephemeral/FlutterOutputs.xcfilelist,
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		33CC10E92044A3C60003C045 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+				33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+				335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+			targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				33CC10F52044A3C60003C045 /* Base */,
+			);
+			name = MainMenu.xib;
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		338D0CE9231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Profile;
+		};
+		338D0CEA231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Profile;
+		};
+		338D0CEB231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Profile;
+		};
+		33CC10F92044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		33CC10FA2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Release;
+		};
+		33CC10FC2044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		33CC10FD2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		33CC111C2044C6BA0003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		33CC111D2044C6BA0003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10F92044A3C60003C045 /* Debug */,
+				33CC10FA2044A3C60003C045 /* Release */,
+				338D0CE9231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10FC2044A3C60003C045 /* Debug */,
+				33CC10FD2044A3C60003C045 /* Release */,
+				338D0CEA231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC111C2044C6BA0003C045 /* Debug */,
+				33CC111D2044C6BA0003C045 /* Release */,
+				338D0CEB231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/cw_monero/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/cw_monero/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/cw_monero/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/cw_monero/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/cw_monero/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 000000000..4e44b7ced
--- /dev/null
+++ b/cw_monero/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1300"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+               BuildableName = "cw_monero_example.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "cw_monero_example.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "cw_monero_example.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "cw_monero_example.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/cw_monero/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/cw_monero/example/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..21a3cc14c
--- /dev/null
+++ b/cw_monero/example/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/cw_monero/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/cw_monero/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/cw_monero/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/cw_monero/example/macos/Runner/AppDelegate.swift b/cw_monero/example/macos/Runner/AppDelegate.swift
new file mode 100644
index 000000000..d53ef6437
--- /dev/null
+++ b/cw_monero/example/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+    return true
+  }
+}
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..a2ec33f19
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+  "images" : [
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "app_icon_16.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "app_icon_32.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "app_icon_32.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "app_icon_64.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "app_icon_128.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "app_icon_256.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "app_icon_256.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "app_icon_512.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "app_icon_512.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "app_icon_1024.png",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 000000000..82b6f9d9a
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 000000000..13b35eba5
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 000000000..0a3f5fa40
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 000000000..bdb57226d
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 000000000..f083318e0
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 000000000..326c0e72c
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 000000000..2f1632cfd
Binary files /dev/null and b/cw_monero/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/cw_monero/example/macos/Runner/Base.lproj/MainMenu.xib b/cw_monero/example/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000..80e867a4e
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+            <connections>
+                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
+            <connections>
+                <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
+                <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
+        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
+            <items>
+                <menuItem title="APP_NAME" id="1Xt-HY-uBw">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
+                        <items>
+                            <menuItem title="About APP_NAME" id="5kV-Vb-QxS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
+                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
+                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
+                            <menuItem title="Services" id="NMo-om-nkz">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
+                            <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
+                                <connections>
+                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Show All" id="Kd2-mp-pUS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
+                            <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
+                                <connections>
+                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Edit" id="5QF-Oa-p0T">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
+                        <items>
+                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
+                                <connections>
+                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
+                                <connections>
+                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
+                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
+                                <connections>
+                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
+                                <connections>
+                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
+                                <connections>
+                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Delete" id="pa3-QI-u2k">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
+                                <connections>
+                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
+                            <menuItem title="Find" id="4EN-yA-p0u">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
+                                    <items>
+                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
+                                            <connections>
+                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
+                                    <items>
+                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
+                                            <connections>
+                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
+                                            <connections>
+                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
+                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Substitutions" id="9ic-FL-obx">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
+                                    <items>
+                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
+                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Links" id="cwL-P1-jid">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
+                                    <items>
+                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Speech" id="xrE-MZ-jX0">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
+                                    <items>
+                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="View" id="H8h-7b-M4v">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="View" id="HyV-fh-RgO">
+                        <items>
+                            <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
+                                <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
+                                <connections>
+                                    <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Window" id="aUF-d1-5bR">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
+                        <items>
+                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
+                                <connections>
+                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Zoom" id="R4o-n2-Eq4">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
+                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Help" id="EPT-qC-fAb">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/>
+                </menuItem>
+            </items>
+            <point key="canvasLocation" x="142" y="-258"/>
+        </menu>
+        <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <rect key="contentRect" x="335" y="390" width="800" height="600"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
+                <rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </view>
+        </window>
+    </objects>
+</document>
diff --git a/cw_monero/example/macos/Runner/Configs/AppInfo.xcconfig b/cw_monero/example/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 000000000..a80a25602
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = cw_monero_example
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.cwMoneroExample
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2022 com.cakewallet. All rights reserved.
diff --git a/cw_monero/example/macos/Runner/Configs/Debug.xcconfig b/cw_monero/example/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 000000000..36b0fd946
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/cw_monero/example/macos/Runner/Configs/Release.xcconfig b/cw_monero/example/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 000000000..dff4f4956
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/cw_monero/example/macos/Runner/Configs/Warnings.xcconfig b/cw_monero/example/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 000000000..42bcbf478
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/cw_monero/example/macos/Runner/DebugProfile.entitlements b/cw_monero/example/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 000000000..dddb8a30c
--- /dev/null
+++ b/cw_monero/example/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+	<key>com.apple.security.cs.allow-jit</key>
+	<true/>
+	<key>com.apple.security.network.server</key>
+	<true/>
+</dict>
+</plist>
diff --git a/cw_monero/example/macos/Runner/Info.plist b/cw_monero/example/macos/Runner/Info.plist
new file mode 100644
index 000000000..4789daa6a
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>$(FLUTTER_BUILD_NAME)</string>
+	<key>CFBundleVersion</key>
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>$(PRODUCT_COPYRIGHT)</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+</dict>
+</plist>
diff --git a/cw_monero/example/macos/Runner/MainFlutterWindow.swift b/cw_monero/example/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 000000000..2722837ec
--- /dev/null
+++ b/cw_monero/example/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+  override func awakeFromNib() {
+    let flutterViewController = FlutterViewController.init()
+    let windowFrame = self.frame
+    self.contentViewController = flutterViewController
+    self.setFrame(windowFrame, display: true)
+
+    RegisterGeneratedPlugins(registry: flutterViewController)
+
+    super.awakeFromNib()
+  }
+}
diff --git a/cw_monero/example/macos/Runner/Release.entitlements b/cw_monero/example/macos/Runner/Release.entitlements
new file mode 100644
index 000000000..852fa1a47
--- /dev/null
+++ b/cw_monero/example/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+</dict>
+</plist>
diff --git a/cw_monero/example/pubspec.lock b/cw_monero/example/pubspec.lock
new file mode 100644
index 000000000..19d9cef8f
--- /dev/null
+++ b/cw_monero/example/pubspec.lock
@@ -0,0 +1,403 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+  args:
+    dependency: transitive
+    description:
+      name: args
+      sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.2"
+  asn1lib:
+    dependency: transitive
+    description:
+      name: asn1lib
+      sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.4.0"
+  async:
+    dependency: transitive
+    description:
+      name: async
+      sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.10.0"
+  boolean_selector:
+    dependency: transitive
+    description:
+      name: boolean_selector
+      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  characters:
+    dependency: transitive
+    description:
+      name: characters
+      sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.1"
+  clock:
+    dependency: transitive
+    description:
+      name: clock
+      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.1"
+  collection:
+    dependency: transitive
+    description:
+      name: collection
+      sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.17.0"
+  convert:
+    dependency: transitive
+    description:
+      name: convert
+      sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.1"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.2"
+  cupertino_icons:
+    dependency: "direct main"
+    description:
+      name: cupertino_icons
+      sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.5"
+  cw_core:
+    dependency: transitive
+    description:
+      path: "../../cw_core"
+      relative: true
+    source: path
+    version: "0.0.1"
+  cw_monero:
+    dependency: "direct main"
+    description:
+      path: ".."
+      relative: true
+    source: path
+    version: "0.0.1"
+  encrypt:
+    dependency: transitive
+    description:
+      name: encrypt
+      sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.0.1"
+  fake_async:
+    dependency: transitive
+    description:
+      name: fake_async
+      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.1"
+  ffi:
+    dependency: transitive
+    description:
+      name: ffi
+      sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "6.1.4"
+  flutter:
+    dependency: "direct main"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  flutter_lints:
+    dependency: "direct dev"
+    description:
+      name: flutter_lints
+      sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
+  flutter_mobx:
+    dependency: transitive
+    description:
+      name: flutter_mobx
+      sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.6+5"
+  flutter_test:
+    dependency: "direct dev"
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  http:
+    dependency: transitive
+    description:
+      name: http
+      sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.13.5"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.0.2"
+  intl:
+    dependency: transitive
+    description:
+      name: intl
+      sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.17.0"
+  js:
+    dependency: transitive
+    description:
+      name: js
+      sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.6.5"
+  lints:
+    dependency: transitive
+    description:
+      name: lints
+      sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
+  matcher:
+    dependency: transitive
+    description:
+      name: matcher
+      sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.12.13"
+  material_color_utilities:
+    dependency: transitive
+    description:
+      name: material_color_utilities
+      sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0"
+  meta:
+    dependency: transitive
+    description:
+      name: meta
+      sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.8.0"
+  mobx:
+    dependency: transitive
+    description:
+      name: mobx
+      sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.3+1"
+  path:
+    dependency: transitive
+    description:
+      name: path
+      sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.8.2"
+  path_provider:
+    dependency: transitive
+    description:
+      name: path_provider
+      sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.12"
+  path_provider_android:
+    dependency: transitive
+    description:
+      name: path_provider_android
+      sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.22"
+  path_provider_foundation:
+    dependency: transitive
+    description:
+      name: path_provider_foundation
+      sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  path_provider_linux:
+    dependency: transitive
+    description:
+      name: path_provider_linux
+      sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.7"
+  path_provider_platform_interface:
+    dependency: transitive
+    description:
+      name: path_provider_platform_interface
+      sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.5"
+  path_provider_windows:
+    dependency: transitive
+    description:
+      name: path_provider_windows
+      sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.5"
+  platform:
+    dependency: transitive
+    description:
+      name: platform
+      sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.0"
+  plugin_platform_interface:
+    dependency: transitive
+    description:
+      name: plugin_platform_interface
+      sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.3"
+  pointycastle:
+    dependency: transitive
+    description:
+      name: pointycastle
+      sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.6.2"
+  process:
+    dependency: transitive
+    description:
+      name: process
+      sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.2.4"
+  sky_engine:
+    dependency: transitive
+    description: flutter
+    source: sdk
+    version: "0.0.99"
+  source_span:
+    dependency: transitive
+    description:
+      name: source_span
+      sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.9.1"
+  stack_trace:
+    dependency: transitive
+    description:
+      name: stack_trace
+      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.11.0"
+  stream_channel:
+    dependency: transitive
+    description:
+      name: stream_channel
+      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  string_scanner:
+    dependency: transitive
+    description:
+      name: string_scanner
+      sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
+  term_glyph:
+    dependency: transitive
+    description:
+      name: term_glyph
+      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.1"
+  test_api:
+    dependency: transitive
+    description:
+      name: test_api
+      sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.16"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.1"
+  vector_math:
+    dependency: transitive
+    description:
+      name: vector_math
+      sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.4"
+  win32:
+    dependency: transitive
+    description:
+      name: win32
+      sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.4"
+  xdg_directories:
+    dependency: transitive
+    description:
+      name: xdg_directories
+      sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.0+3"
+sdks:
+  dart: ">=2.18.1 <4.0.0"
+  flutter: ">=3.0.0"
diff --git a/cw_monero/example/pubspec.yaml b/cw_monero/example/pubspec.yaml
new file mode 100644
index 000000000..2dee5337f
--- /dev/null
+++ b/cw_monero/example/pubspec.yaml
@@ -0,0 +1,84 @@
+name: cw_monero_example
+description: Demonstrates how to use the cw_monero plugin.
+
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+environment:
+  sdk: '>=2.18.1 <3.0.0'
+
+# Dependencies specify other packages that your package needs in order to work.
+# To automatically upgrade your package dependencies to the latest versions
+# consider running `flutter pub upgrade --major-versions`. Alternatively,
+# dependencies can be manually updated by changing the version numbers below to
+# the latest version available on pub.dev. To see which dependencies have newer
+# versions available, run `flutter pub outdated`.
+dependencies:
+  flutter:
+    sdk: flutter
+
+  cw_monero:
+    # When depending on this package from a real application you should use:
+    #   cw_monero: ^x.y.z
+    # See https://dart.dev/tools/pub/dependencies#version-constraints
+    # The example app is bundled with the plugin so we use a path dependency on
+    # the parent directory to use the current plugin's version.
+    path: ../
+
+  # The following adds the Cupertino Icons font to your application.
+  # Use with the CupertinoIcons class for iOS style icons.
+  cupertino_icons: ^1.0.2
+
+dev_dependencies:
+  flutter_test:
+    sdk: flutter
+
+  # The "flutter_lints" package below contains a set of recommended lints to
+  # encourage good coding practices. The lint set provided by the package is
+  # activated in the `analysis_options.yaml` file located at the root of your
+  # package. See that file for information about deactivating specific lint
+  # rules and activating additional ones.
+  flutter_lints: ^2.0.0
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter packages.
+flutter:
+
+  # The following line ensures that the Material Icons font is
+  # included with your application, so that you can use the icons in
+  # the material Icons class.
+  uses-material-design: true
+
+  # To add assets to your application, add an assets section, like this:
+  # assets:
+  #   - images/a_dot_burr.jpeg
+  #   - images/a_dot_ham.jpeg
+
+  # An image asset can refer to one or more resolution-specific "variants", see
+  # https://flutter.dev/assets-and-images/#resolution-aware
+
+  # For details regarding adding assets from package dependencies, see
+  # https://flutter.dev/assets-and-images/#from-packages
+
+  # To add custom fonts to your application, add a fonts section here,
+  # in this "flutter" section. Each entry in this list should have a
+  # "family" key with the font family name, and a "fonts" key with a
+  # list giving the asset and other descriptors for the font. For
+  # example:
+  # fonts:
+  #   - family: Schyler
+  #     fonts:
+  #       - asset: fonts/Schyler-Regular.ttf
+  #       - asset: fonts/Schyler-Italic.ttf
+  #         style: italic
+  #   - family: Trajan Pro
+  #     fonts:
+  #       - asset: fonts/TrajanPro.ttf
+  #       - asset: fonts/TrajanPro_Bold.ttf
+  #         weight: 700
+  #
+  # For details regarding fonts from package dependencies,
+  # see https://flutter.dev/custom-fonts/#from-packages
diff --git a/cw_monero/example/test/widget_test.dart b/cw_monero/example/test/widget_test.dart
new file mode 100644
index 000000000..b37e6313d
--- /dev/null
+++ b/cw_monero/example/test/widget_test.dart
@@ -0,0 +1,27 @@
+// This is a basic Flutter widget test.
+//
+// To perform an interaction with a widget in your test, use the WidgetTester
+// utility in the flutter_test package. For example, you can send tap and scroll
+// gestures. You can also use WidgetTester to find child widgets in the widget
+// tree, read text, and verify that the values of widget properties are correct.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:cw_monero_example/main.dart';
+
+void main() {
+  testWidgets('Verify Platform version', (WidgetTester tester) async {
+    // Build our app and trigger a frame.
+    await tester.pumpWidget(const MyApp());
+
+    // Verify that platform version is retrieved.
+    expect(
+      find.byWidgetPredicate(
+        (Widget widget) => widget is Text &&
+                           widget.data!.startsWith('Running on:'),
+      ),
+      findsOneWidget,
+    );
+  });
+}
diff --git a/cw_monero/lib/cw_monero.dart b/cw_monero/lib/cw_monero.dart
new file mode 100644
index 000000000..7945a020e
--- /dev/null
+++ b/cw_monero/lib/cw_monero.dart
@@ -0,0 +1,8 @@
+
+import 'cw_monero_platform_interface.dart';
+
+class CwMonero {
+  Future<String?> getPlatformVersion() {
+    return CwMoneroPlatform.instance.getPlatformVersion();
+  }
+}
diff --git a/cw_monero/lib/cw_monero_method_channel.dart b/cw_monero/lib/cw_monero_method_channel.dart
new file mode 100644
index 000000000..1cbca9f2c
--- /dev/null
+++ b/cw_monero/lib/cw_monero_method_channel.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+import 'cw_monero_platform_interface.dart';
+
+/// An implementation of [CwMoneroPlatform] that uses method channels.
+class MethodChannelCwMonero extends CwMoneroPlatform {
+  /// The method channel used to interact with the native platform.
+  @visibleForTesting
+  final methodChannel = const MethodChannel('cw_monero');
+
+  @override
+  Future<String?> getPlatformVersion() async {
+    final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
+    return version;
+  }
+}
diff --git a/cw_monero/lib/cw_monero_platform_interface.dart b/cw_monero/lib/cw_monero_platform_interface.dart
new file mode 100644
index 000000000..6c9b20a25
--- /dev/null
+++ b/cw_monero/lib/cw_monero_platform_interface.dart
@@ -0,0 +1,29 @@
+import 'package:plugin_platform_interface/plugin_platform_interface.dart';
+
+import 'cw_monero_method_channel.dart';
+
+abstract class CwMoneroPlatform extends PlatformInterface {
+  /// Constructs a CwMoneroPlatform.
+  CwMoneroPlatform() : super(token: _token);
+
+  static final Object _token = Object();
+
+  static CwMoneroPlatform _instance = MethodChannelCwMonero();
+
+  /// The default instance of [CwMoneroPlatform] to use.
+  ///
+  /// Defaults to [MethodChannelCwMonero].
+  static CwMoneroPlatform get instance => _instance;
+
+  /// Platform-specific implementations should set this with their own
+  /// platform-specific class that extends [CwMoneroPlatform] when
+  /// they register themselves.
+  static set instance(CwMoneroPlatform instance) {
+    PlatformInterface.verifyToken(instance, _token);
+    _instance = instance;
+  }
+
+  Future<String?> getPlatformVersion() {
+    throw UnimplementedError('platformVersion() has not been implemented.');
+  }
+}
diff --git a/cw_monero/lib/monero_wallet.dart b/cw_monero/lib/monero_wallet.dart
index a9d708c05..eea490ba9 100644
--- a/cw_monero/lib/monero_wallet.dart
+++ b/cw_monero/lib/monero_wallet.dart
@@ -118,6 +118,8 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
        Duration(seconds: _autoSaveInterval),
        (_) async => await save());
   }
+  @override
+  Future<void>? updateBalance() => null;
 
   @override
   void close() {
@@ -180,14 +182,14 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
     if (hasMultiDestination) {
       if (outputs.any((item) => item.sendAll
           || (item.formattedCryptoAmount ?? 0) <= 0)) {
-        throw MoneroTransactionCreationException('Wrong balance. Not enough XMR on your balance.');
+        throw MoneroTransactionCreationException('You do not have enough XMR to send this amount.');
       }
 
       final int totalAmount = outputs.fold(0, (acc, value) =>
           acc + (value.formattedCryptoAmount ?? 0));
 
       if (unlockedBalance < totalAmount) {
-        throw MoneroTransactionCreationException('Wrong balance. Not enough XMR on your balance.');
+        throw MoneroTransactionCreationException('You do not have enough XMR to send this amount.');
       }
 
       final moneroOutputs = outputs.map((output) {
@@ -222,7 +224,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
         final formattedBalance = moneroAmountToString(amount: unlockedBalance);
 
         throw MoneroTransactionCreationException(
-            'Incorrect unlocked balance. Unlocked: $formattedBalance. Transaction amount: ${output.cryptoAmount}.');
+            'You do not have enough unlocked balance. Unlocked: $formattedBalance. Transaction amount: ${output.cryptoAmount}.');
       }
 
       pendingTransactionDescription =
diff --git a/cw_monero/macos/Classes/CwMoneroPlugin.swift b/cw_monero/macos/Classes/CwMoneroPlugin.swift
new file mode 100644
index 000000000..d4ff81e1c
--- /dev/null
+++ b/cw_monero/macos/Classes/CwMoneroPlugin.swift
@@ -0,0 +1,19 @@
+import Cocoa
+import FlutterMacOS
+
+public class CwMoneroPlugin: NSObject, FlutterPlugin {
+  public static func register(with registrar: FlutterPluginRegistrar) {
+    let channel = FlutterMethodChannel(name: "cw_monero", binaryMessenger: registrar.messenger)
+    let instance = CwMoneroPlugin()
+    registrar.addMethodCallDelegate(instance, channel: channel)
+  }
+
+  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+    switch call.method {
+    case "getPlatformVersion":
+      result("macOS " + ProcessInfo.processInfo.operatingSystemVersionString)
+    default:
+      result(FlutterMethodNotImplemented)
+    }
+  }
+}
diff --git a/cw_monero/macos/Classes/CwWalletListener.h b/cw_monero/macos/Classes/CwWalletListener.h
new file mode 100644
index 000000000..cbfcb0c4e
--- /dev/null
+++ b/cw_monero/macos/Classes/CwWalletListener.h
@@ -0,0 +1,23 @@
+#include <stdint.h>
+
+struct CWMoneroWalletListener;
+
+typedef int8_t (*on_new_block_callback)(uint64_t height);
+typedef int8_t (*on_need_to_refresh_callback)();
+
+typedef struct CWMoneroWalletListener
+{
+    // on_money_spent_callback *on_money_spent;
+    // on_money_received_callback *on_money_received;
+    // on_unconfirmed_money_received_callback *on_unconfirmed_money_received;
+    // on_new_block_callback *on_new_block;
+    // on_updated_callback *on_updated;
+    // on_refreshed_callback *on_refreshed;
+
+    on_new_block_callback on_new_block;
+} CWMoneroWalletListener;
+
+struct TestListener {
+    // int8_t x;
+    on_new_block_callback on_new_block;
+};
\ No newline at end of file
diff --git a/cw_monero/macos/Classes/monero_api.cpp b/cw_monero/macos/Classes/monero_api.cpp
new file mode 100644
index 000000000..56548e79e
--- /dev/null
+++ b/cw_monero/macos/Classes/monero_api.cpp
@@ -0,0 +1,798 @@
+#include <stdint.h>
+#include "cstdlib"
+#include <chrono>
+#include <functional>
+#include <iostream>
+#include <unistd.h>
+#include <mutex>
+#include "thread"
+#include "CwWalletListener.h"
+#if __APPLE__
+// Fix for randomx on ios
+void __clear_cache(void* start, void* end) { }
+#include "../External/macos/include/wallet2_api.h"
+#else
+#include "../External/android/include/wallet2_api.h"
+#endif
+
+using namespace std::chrono_literals;
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+    const uint64_t MONERO_BLOCK_SIZE = 1000;
+
+    struct Utf8Box
+    {
+        char *value;
+
+        Utf8Box(char *_value)
+        {
+            value = _value;
+        }
+    };
+
+    struct SubaddressRow
+    {
+        uint64_t id;
+        char *address;
+        char *label;
+
+        SubaddressRow(std::size_t _id, char *_address, char *_label)
+        {
+            id = static_cast<uint64_t>(_id);
+            address = _address;
+            label = _label;
+        }
+    };
+
+    struct AccountRow
+    {
+        uint64_t id;
+        char *label;
+
+        AccountRow(std::size_t _id, char *_label)
+        {
+            id = static_cast<uint64_t>(_id);
+            label = _label;
+        }
+    };
+
+    struct MoneroWalletListener : Monero::WalletListener
+    {
+        uint64_t m_height;
+        bool m_need_to_refresh;
+        bool m_new_transaction;
+
+        MoneroWalletListener()
+        {
+            m_height = 0;
+            m_need_to_refresh = false;
+            m_new_transaction = false;
+        }
+
+        void moneySpent(const std::string &txId, uint64_t amount)
+        {
+            m_new_transaction = true;
+        }
+
+        void moneyReceived(const std::string &txId, uint64_t amount)
+        {
+            m_new_transaction = true;
+        }
+
+        void unconfirmedMoneyReceived(const std::string &txId, uint64_t amount)
+        {
+            m_new_transaction = true;
+        }
+
+        void newBlock(uint64_t height)
+        {
+            m_height = height;
+        }
+
+        void updated()
+        {
+            m_new_transaction = true;
+        }
+
+        void refreshed()
+        {
+            m_need_to_refresh = true;
+        }
+
+        void resetNeedToRefresh()
+        {
+            m_need_to_refresh = false;
+        }
+
+        bool isNeedToRefresh()
+        {
+            return m_need_to_refresh;
+        }
+
+        bool isNewTransactionExist()
+        {
+            return m_new_transaction;
+        }
+
+        void resetIsNewTransactionExist()
+        {
+            m_new_transaction = false;
+        }
+
+        uint64_t height()
+        {
+            return m_height;
+        }
+    };
+
+    struct TransactionInfoRow
+    {
+        uint64_t amount;
+        uint64_t fee;
+        uint64_t blockHeight;
+        uint64_t confirmations;
+        uint32_t subaddrAccount;
+        int8_t direction;
+        int8_t isPending;
+        uint32_t subaddrIndex;
+        
+        char *hash;
+        char *paymentId;
+
+        int64_t datetime;
+
+        TransactionInfoRow(Monero::TransactionInfo *transaction)
+        {
+            amount = transaction->amount();
+            fee = transaction->fee();
+            blockHeight = transaction->blockHeight();
+            subaddrAccount = transaction->subaddrAccount();
+            std::set<uint32_t>::iterator it = transaction->subaddrIndex().begin();
+            subaddrIndex = *it;
+            confirmations = transaction->confirmations();
+            datetime = static_cast<int64_t>(transaction->timestamp());            
+            direction = transaction->direction();
+            isPending = static_cast<int8_t>(transaction->isPending());
+            std::string *hash_str = new std::string(transaction->hash());
+            hash = strdup(hash_str->c_str());
+            paymentId = strdup(transaction->paymentId().c_str());
+        }
+    };
+
+    struct PendingTransactionRaw
+    {
+        uint64_t amount;
+        uint64_t fee;
+        char *hash;
+        char *hex;
+        char *txKey;
+        Monero::PendingTransaction *transaction;
+
+        PendingTransactionRaw(Monero::PendingTransaction *_transaction)
+        {
+            transaction = _transaction;
+            amount = _transaction->amount();
+            fee = _transaction->fee();
+            hash = strdup(_transaction->txid()[0].c_str());
+            hex = strdup(_transaction->hex()[0].c_str());
+            txKey = strdup(_transaction->txKey()[0].c_str());
+        }
+    };
+
+    Monero::Wallet *m_wallet;
+    Monero::TransactionHistory *m_transaction_history;
+    MoneroWalletListener *m_listener;
+    Monero::Subaddress *m_subaddress;
+    Monero::SubaddressAccount *m_account;
+    uint64_t m_last_known_wallet_height;
+    uint64_t m_cached_syncing_blockchain_height = 0;
+    std::mutex store_lock;
+    bool is_storing = false;
+
+    void change_current_wallet(Monero::Wallet *wallet)
+    {
+        m_wallet = wallet;
+        m_listener = nullptr;
+        
+
+        if (wallet != nullptr)
+        {
+            m_transaction_history = wallet->history();
+        }
+        else
+        {
+            m_transaction_history = nullptr;
+        }
+
+        if (wallet != nullptr)
+        {
+            m_account = wallet->subaddressAccount();
+        }
+        else
+        {
+            m_account = nullptr;
+        }
+
+        if (wallet != nullptr)
+        {
+            m_subaddress = wallet->subaddress();
+        }
+        else
+        {
+            m_subaddress = nullptr;
+        }
+    }
+
+    Monero::Wallet *get_current_wallet()
+    {
+        return m_wallet;
+    }
+
+    bool create_wallet(char *path, char *password, char *language, int32_t networkType, char *error)
+    {
+        Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
+        Monero::WalletManager *walletManager = Monero::WalletManagerFactory::getWalletManager();
+        Monero::Wallet *wallet = walletManager->createWallet(path, password, language, _networkType);
+
+        int status;
+        std::string errorString;
+
+        wallet->statusWithErrorString(status, errorString);
+
+        if (wallet->status() != Monero::Wallet::Status_Ok)
+        {
+            error = strdup(wallet->errorString().c_str());
+            return false;
+        }
+
+        change_current_wallet(wallet);
+
+        return true;
+    }
+
+    bool restore_wallet_from_seed(char *path, char *password, char *seed, int32_t networkType, uint64_t restoreHeight, char *error)
+    {
+        Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
+        Monero::Wallet *wallet = Monero::WalletManagerFactory::getWalletManager()->recoveryWallet(
+            std::string(path),
+            std::string(password),
+            std::string(seed),
+            _networkType,
+            (uint64_t)restoreHeight);
+
+        int status;
+        std::string errorString;
+
+        wallet->statusWithErrorString(status, errorString);
+
+        if (status != Monero::Wallet::Status_Ok || !errorString.empty())
+        {
+            error = strdup(errorString.c_str());
+            return false;
+        }
+
+        change_current_wallet(wallet);
+        return true;
+    }
+
+    bool restore_wallet_from_keys(char *path, char *password, char *language, char *address, char *viewKey, char *spendKey, int32_t networkType, uint64_t restoreHeight, char *error)
+    {
+        Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
+        Monero::Wallet *wallet = Monero::WalletManagerFactory::getWalletManager()->createWalletFromKeys(
+            std::string(path),
+            std::string(password),
+            std::string(language),
+            _networkType,
+            (uint64_t)restoreHeight,
+            std::string(address),
+            std::string(viewKey),
+            std::string(spendKey));
+
+        int status;
+        std::string errorString;
+
+        wallet->statusWithErrorString(status, errorString);
+
+        if (status != Monero::Wallet::Status_Ok || !errorString.empty())
+        {
+            error = strdup(errorString.c_str());
+            return false;
+        }
+
+        change_current_wallet(wallet);
+        return true;
+    }
+
+    bool load_wallet(char *path, char *password, int32_t nettype)
+    {
+        nice(19);
+        Monero::NetworkType networkType = static_cast<Monero::NetworkType>(nettype);
+        Monero::WalletManager *walletManager = Monero::WalletManagerFactory::getWalletManager();
+        Monero::Wallet *wallet = walletManager->openWallet(std::string(path), std::string(password), networkType);
+        int status;
+        std::string errorString;
+
+        wallet->statusWithErrorString(status, errorString);
+        change_current_wallet(wallet);
+
+        return !(status != Monero::Wallet::Status_Ok || !errorString.empty());
+    }
+
+    char *error_string() {
+        return strdup(get_current_wallet()->errorString().c_str());
+    }
+
+
+    bool is_wallet_exist(char *path)
+    {
+        return Monero::WalletManagerFactory::getWalletManager()->walletExists(std::string(path));
+    }
+
+    void close_current_wallet()
+    {
+        Monero::WalletManagerFactory::getWalletManager()->closeWallet(get_current_wallet());
+        change_current_wallet(nullptr);
+    }
+
+    char *get_filename()
+    {
+        return strdup(get_current_wallet()->filename().c_str());
+    }
+
+    char *secret_view_key()
+    {
+        return strdup(get_current_wallet()->secretViewKey().c_str());
+    }
+
+    char *public_view_key()
+    {
+        return strdup(get_current_wallet()->publicViewKey().c_str());
+    }
+
+    char *secret_spend_key()
+    {
+        return strdup(get_current_wallet()->secretSpendKey().c_str());
+    }
+
+    char *public_spend_key()
+    {
+        return strdup(get_current_wallet()->publicSpendKey().c_str());
+    }
+
+    char *get_address(uint32_t account_index, uint32_t address_index)
+    {
+        return strdup(get_current_wallet()->address(account_index, address_index).c_str());
+    }
+
+
+    const char *seed()
+    {
+        return strdup(get_current_wallet()->seed().c_str());
+    }
+
+    uint64_t get_full_balance(uint32_t account_index)
+    {
+        return get_current_wallet()->balance(account_index);
+    }
+
+    uint64_t get_unlocked_balance(uint32_t account_index)
+    {
+        return get_current_wallet()->unlockedBalance(account_index);
+    }
+
+    uint64_t get_current_height()
+    {
+        return get_current_wallet()->blockChainHeight();
+    }
+
+    uint64_t get_node_height()
+    {
+        return get_current_wallet()->daemonBlockChainHeight();
+    }
+
+    bool connect_to_node(char *error)
+    {
+        nice(19);
+        bool is_connected = get_current_wallet()->connectToDaemon();
+
+        if (!is_connected)
+        {
+            error = strdup(get_current_wallet()->errorString().c_str());
+        }
+
+        return is_connected;
+    }
+
+    bool setup_node(char *address, char *login, char *password, bool use_ssl, bool is_light_wallet, char *error)
+    {
+        nice(19);
+        Monero::Wallet *wallet = get_current_wallet();
+        
+        std::string _login = "";
+        std::string _password = "";
+
+        if (login != nullptr)
+        {
+            _login = std::string(login);
+        }
+
+        if (password != nullptr)
+        {
+            _password = std::string(password);
+        }
+
+        bool inited = wallet->init(std::string(address), 0, _login, _password, use_ssl, is_light_wallet);
+
+        if (!inited)
+        {
+            error = strdup(wallet->errorString().c_str());
+        } else if (!wallet->connectToDaemon()) {
+            error = strdup(wallet->errorString().c_str());
+        }
+
+        return inited;
+    }
+
+    bool is_connected()
+    {
+        return get_current_wallet()->connected();
+    }
+
+    void start_refresh()
+    {
+        get_current_wallet()->refreshAsync();
+        get_current_wallet()->startRefresh();
+    }
+
+    void set_refresh_from_block_height(uint64_t height)
+    {
+        get_current_wallet()->setRefreshFromBlockHeight(height);
+    }
+
+    void set_recovering_from_seed(bool is_recovery)
+    {
+        get_current_wallet()->setRecoveringFromSeed(is_recovery);
+    }
+
+    void store(char *path)
+    {
+        store_lock.lock();
+        if (is_storing) {
+            return;
+        }
+
+        is_storing = true;
+        get_current_wallet()->store(std::string(path));
+        is_storing = false;
+        store_lock.unlock();
+    }
+
+    bool set_password(char *password, Utf8Box &error) {
+        bool is_changed = get_current_wallet()->setPassword(std::string(password));
+
+        if (!is_changed) {
+            error = Utf8Box(strdup(get_current_wallet()->errorString().c_str()));
+        }
+
+        return is_changed;
+    }
+
+    bool transaction_create(char *address, char *payment_id, char *amount,
+                                              uint8_t priority_raw, uint32_t subaddr_account, Utf8Box &error, PendingTransactionRaw &pendingTransaction)
+    {
+        nice(19);
+        
+        auto priority = static_cast<Monero::PendingTransaction::Priority>(priority_raw);
+        std::string _payment_id;
+        Monero::PendingTransaction *transaction;
+
+        if (payment_id != nullptr)
+        {
+            _payment_id = std::string(payment_id);
+        }
+
+        if (amount != nullptr)
+        {
+            uint64_t _amount = Monero::Wallet::amountFromString(std::string(amount));
+            transaction = m_wallet->createTransaction(std::string(address), _payment_id, _amount, m_wallet->defaultMixin(), priority, subaddr_account);
+        }
+        else
+        {
+            transaction = m_wallet->createTransaction(std::string(address), _payment_id, Monero::optional<uint64_t>(), m_wallet->defaultMixin(), priority, subaddr_account);
+        }
+        
+        int status = transaction->status();
+
+        if (status == Monero::PendingTransaction::Status::Status_Error || status == Monero::PendingTransaction::Status::Status_Critical)
+        {
+            error = Utf8Box(strdup(transaction->errorString().c_str()));
+            return false;
+        }
+
+        if (m_listener != nullptr) {
+            m_listener->m_new_transaction = true;
+        }
+
+        pendingTransaction = PendingTransactionRaw(transaction);
+        return true;
+    }
+
+    bool transaction_create_mult_dest(char **addresses, char *payment_id, char **amounts, uint32_t size,
+                                                  uint8_t priority_raw, uint32_t subaddr_account, Utf8Box &error, PendingTransactionRaw &pendingTransaction)
+    {
+        nice(19);
+
+        std::vector<std::string> _addresses;
+        std::vector<uint64_t> _amounts;
+
+        for (int i = 0; i < size; i++) {
+            _addresses.push_back(std::string(*addresses));
+            _amounts.push_back(Monero::Wallet::amountFromString(std::string(*amounts)));
+            addresses++;
+            amounts++;
+        }
+
+        auto priority = static_cast<Monero::PendingTransaction::Priority>(priority_raw);
+        std::string _payment_id;
+        Monero::PendingTransaction *transaction;
+
+        if (payment_id != nullptr)
+        {
+            _payment_id = std::string(payment_id);
+        }
+
+        transaction = m_wallet->createTransactionMultDest(_addresses, _payment_id, _amounts, m_wallet->defaultMixin(), priority, subaddr_account);
+
+        int status = transaction->status();
+
+        if (status == Monero::PendingTransaction::Status::Status_Error || status == Monero::PendingTransaction::Status::Status_Critical)
+        {
+            error = Utf8Box(strdup(transaction->errorString().c_str()));
+            return false;
+        }
+
+        if (m_listener != nullptr) {
+            m_listener->m_new_transaction = true;
+        }
+
+        pendingTransaction = PendingTransactionRaw(transaction);
+        return true;
+    }
+
+    bool transaction_commit(PendingTransactionRaw *transaction, Utf8Box &error)
+    {
+        bool committed = transaction->transaction->commit();
+
+        if (!committed)
+        {
+            error = Utf8Box(strdup(transaction->transaction->errorString().c_str()));
+        } else if (m_listener != nullptr) {
+            m_listener->m_new_transaction = true;
+        }
+
+        return committed;
+    }
+
+    uint64_t get_node_height_or_update(uint64_t base_eight)
+    {
+        if (m_cached_syncing_blockchain_height < base_eight) {
+            m_cached_syncing_blockchain_height = base_eight;
+        }
+
+        return m_cached_syncing_blockchain_height;
+    }
+
+    uint64_t get_syncing_height()
+    {
+        if (m_listener == nullptr) {
+            return 0;
+        }
+
+        uint64_t height = m_listener->height();
+
+        if (height <= 1) {
+            return 0;
+        }
+
+        if (height != m_last_known_wallet_height)
+        {
+            m_last_known_wallet_height = height;
+        }
+
+        return height;
+    }
+
+    uint64_t is_needed_to_refresh()
+    {
+        if (m_listener == nullptr) {
+            return false;
+        }
+
+        bool should_refresh = m_listener->isNeedToRefresh();
+
+        if (should_refresh) {
+            m_listener->resetNeedToRefresh();
+        }
+
+        return should_refresh;
+    }
+
+    uint8_t is_new_transaction_exist()
+    {
+        if (m_listener == nullptr) {
+            return false;
+        }
+
+        bool is_new_transaction_exist = m_listener->isNewTransactionExist();
+
+        if (is_new_transaction_exist)
+        {
+            m_listener->resetIsNewTransactionExist();
+        }
+
+        return is_new_transaction_exist;
+    }
+
+    void set_listener()
+    {
+        m_last_known_wallet_height = 0;
+
+        if (m_listener != nullptr)
+        {
+             free(m_listener);
+        }
+
+        m_listener = new MoneroWalletListener();
+        get_current_wallet()->setListener(m_listener);
+    }
+
+    int64_t *subaddrress_get_all()
+    {
+        std::vector<Monero::SubaddressRow *> _subaddresses = m_subaddress->getAll();
+        size_t size = _subaddresses.size();
+        int64_t *subaddresses = (int64_t *)malloc(size * sizeof(int64_t));
+
+        for (int i = 0; i < size; i++)
+        {
+            Monero::SubaddressRow *row = _subaddresses[i];
+            SubaddressRow *_row = new SubaddressRow(row->getRowId(), strdup(row->getAddress().c_str()), strdup(row->getLabel().c_str()));
+            subaddresses[i] = reinterpret_cast<int64_t>(_row);
+        }
+
+        return subaddresses;
+    }
+
+    int32_t subaddrress_size()
+    {
+        std::vector<Monero::SubaddressRow *> _subaddresses = m_subaddress->getAll();
+        return _subaddresses.size();
+    }
+
+    void subaddress_add_row(uint32_t accountIndex, char *label)
+    {
+        m_subaddress->addRow(accountIndex, std::string(label));
+    }
+
+    void subaddress_set_label(uint32_t accountIndex, uint32_t addressIndex, char *label)
+    {
+        m_subaddress->setLabel(accountIndex, addressIndex, std::string(label));
+    }
+
+    void subaddress_refresh(uint32_t accountIndex)
+    {
+        m_subaddress->refresh(accountIndex);
+    }
+
+    int32_t account_size()
+    {
+        std::vector<Monero::SubaddressAccountRow *> _accocunts = m_account->getAll();
+        return _accocunts.size();
+    }
+
+    int64_t *account_get_all()
+    {
+        std::vector<Monero::SubaddressAccountRow *> _accocunts = m_account->getAll();
+        size_t size = _accocunts.size();
+        int64_t *accocunts = (int64_t *)malloc(size * sizeof(int64_t));
+
+        for (int i = 0; i < size; i++)
+        {
+            Monero::SubaddressAccountRow *row = _accocunts[i];
+            AccountRow *_row = new AccountRow(row->getRowId(), strdup(row->getLabel().c_str()));
+            accocunts[i] = reinterpret_cast<int64_t>(_row);
+        }
+
+        return accocunts;
+    }
+
+    void account_add_row(char *label)
+    {
+        m_account->addRow(std::string(label));
+    }
+
+    void account_set_label_row(uint32_t account_index, char *label)
+    {
+        m_account->setLabel(account_index, label);
+    }
+
+    void account_refresh()
+    {
+        m_account->refresh();
+    }
+
+    int64_t *transactions_get_all()
+    {
+        std::vector<Monero::TransactionInfo *> transactions = m_transaction_history->getAll();
+        size_t size = transactions.size();
+        int64_t *transactionAddresses = (int64_t *)malloc(size * sizeof(int64_t));
+
+        for (int i = 0; i < size; i++)
+        {
+            Monero::TransactionInfo *row = transactions[i];
+            TransactionInfoRow *tx = new TransactionInfoRow(row);
+            transactionAddresses[i] = reinterpret_cast<int64_t>(tx);
+        }
+
+        return transactionAddresses;
+    }
+
+    void transactions_refresh()
+    {
+        m_transaction_history->refresh();
+    }
+
+    int64_t transactions_count()
+    {
+        return m_transaction_history->count();
+    }
+
+    int LedgerExchange(
+        unsigned char *command,
+        unsigned int cmd_len,
+        unsigned char *response,
+        unsigned int max_resp_len)
+    {
+        return -1;
+    }
+
+    int LedgerFind(char *buffer, size_t len)
+    {
+        return -1;
+    }
+
+    void on_startup()
+    {
+        Monero::Utils::onStartup();
+        Monero::WalletManagerFactory::setLogLevel(0);
+    }
+
+    void rescan_blockchain()
+    {
+        m_wallet->rescanBlockchainAsync();
+    }
+
+    char * get_tx_key(char * txId)
+    {
+        return strdup(m_wallet->getTxKey(std::string(txId)).c_str());
+    }
+
+    char *get_subaddress_label(uint32_t accountIndex, uint32_t addressIndex)
+    {
+        return strdup(get_current_wallet()->getSubaddressLabel(accountIndex, addressIndex).c_str());
+    }
+
+    void set_trusted_daemon(bool arg)
+    {
+        m_wallet->setTrustedDaemon(arg);
+    }
+
+    bool trusted_daemon()
+    {
+        return m_wallet->trustedDaemon();
+    }
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cw_monero/macos/Classes/monero_api.h b/cw_monero/macos/Classes/monero_api.h
new file mode 100644
index 000000000..74258ba4c
--- /dev/null
+++ b/cw_monero/macos/Classes/monero_api.h
@@ -0,0 +1,38 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include "CwWalletListener.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool create_wallet(char *path, char *password, char *language, int32_t networkType, char *error);
+bool restore_wallet_from_seed(char *path, char *password, char *seed, int32_t networkType, uint64_t restoreHeight, char *error);
+bool restore_wallet_from_keys(char *path, char *password, char *language, char *address, char *viewKey, char *spendKey, int32_t networkType, uint64_t restoreHeight, char *error);
+void load_wallet(char *path, char *password, int32_t nettype);
+bool is_wallet_exist(char *path);
+
+char *get_filename();
+const char *seed();
+char *get_address(uint32_t account_index, uint32_t address_index);
+uint64_t get_full_balance(uint32_t account_index);
+uint64_t get_unlocked_balance(uint32_t account_index);
+uint64_t get_current_height();
+uint64_t get_node_height();
+
+bool is_connected();
+
+bool setup_node(char *address, char *login, char *password, bool use_ssl, bool is_light_wallet, char *error);
+bool connect_to_node(char *error);
+void start_refresh();
+void set_refresh_from_block_height(uint64_t height);
+void set_recovering_from_seed(bool is_recovery);
+void store(char *path);
+
+void set_trusted_daemon(bool arg);
+bool trusted_daemon();
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/cw_monero/macos/cw_monero_base.podspec b/cw_monero/macos/cw_monero_base.podspec
new file mode 100644
index 000000000..aac972c0f
--- /dev/null
+++ b/cw_monero/macos/cw_monero_base.podspec
@@ -0,0 +1,56 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
+# Run `pod lib lint cw_monero.podspec` to validate before publishing.
+#
+Pod::Spec.new do |s|
+  s.name             = 'cw_monero'
+  s.version          = '0.0.1'
+  s.summary          = 'CW Monero'
+  s.description      = 'Cake Wallet wrapper over Monero project.'
+  s.homepage         = 'http://cakewallet.com'
+  s.license          = { :file => '../LICENSE' }
+  s.author           = { 'CakeWallet' => 'support@cakewallet.com' }
+  s.source           = { :path => '.' }
+  s.source_files     = 'Classes/**/*'
+  s.dependency 'FlutterMacOS'
+  s.public_header_files = 'Classes/**/*.h, Classes/*.h, External/macos/libs/monero/include/External/ios/**/*.h'
+  s.platform = :osx, '10.11'
+  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => '#___VALID_ARCHS___#', 'ENABLE_BITCODE' => 'NO' }
+  s.swift_version = '5.0'
+  s.libraries = 'iconv'
+
+  s.subspec 'OpenSSL' do |openssl|
+    openssl.preserve_paths = '../../../../../cw_shared_external/ios/External/macos/include/**/*.h'
+    openssl.vendored_libraries = '../../../../../cw_shared_external/ios/External/macos/lib/libcrypto.a', '../../../../../cw_shared_external/ios/External/ios/lib/libssl.a'
+    openssl.libraries = 'ssl', 'crypto'
+    openssl.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/macos/include/**" }
+  end
+
+  s.subspec 'Sodium' do |sodium|
+    sodium.preserve_paths = '../../../../../cw_shared_external/ios/External/macos/include/**/*.h'
+    sodium.vendored_libraries = '../../../../../cw_shared_external/ios/External/macos/lib/libsodium.a'
+    sodium.libraries = 'sodium'
+    sodium.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/macos/include/**" }
+  end
+
+  s.subspec 'Unbound' do |unbound|
+    unbound.preserve_paths = '../../../../../cw_shared_external/ios/External/macos/include/**/*.h'
+    unbound.vendored_libraries = '../../../../../cw_shared_external/ios/External/macos/lib/libunbound.a'
+    unbound.libraries = 'unbound'
+    unbound.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/macos/include/**" }
+  end
+
+  s.subspec 'Boost' do |boost|
+    boost.preserve_paths = '../../../../../cw_shared_external/ios/External/macos/include/**/*.h',
+    boost.vendored_libraries =  '../../../../../cw_shared_external/ios/External/macos/lib/libboost.a',
+    boost.libraries = 'boost'
+    boost.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/macos/include/**" }
+  end
+
+  s.subspec 'Monero' do |monero|
+    monero.preserve_paths = 'External/macos/include/**/*.h'
+    monero.vendored_libraries = 'External/macos/lib/libmonero.a'
+    monero.libraries = 'monero'
+    monero.xcconfig = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/External/macos/include" }
+  end
+end
diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock
index 437184a7d..1e33631d5 100644
--- a/cw_monero/pubspec.lock
+++ b/cw_monero/pubspec.lock
@@ -672,5 +672,5 @@ packages:
     source: hosted
     version: "3.1.1"
 sdks:
-  dart: ">=2.19.0 <3.0.0"
+  dart: ">=2.19.0 <4.0.0"
   flutter: ">=3.0.0"
diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml
index 6d5041dfa..066a0d4c3 100644
--- a/cw_monero/pubspec.yaml
+++ b/cw_monero/pubspec.yaml
@@ -40,8 +40,15 @@ flutter:
   # be modified. They are used by the tooling to maintain consistency when
   # adding or updating assets for this project.
   plugin:
-    androidPackage: com.cakewallet.monero
-    pluginClass: CwMoneroPlugin
+    platforms:
+      android:
+        package: com.cakewallet.monero
+        pluginClass: CwMoneroPlugin
+      ios:
+        pluginClass: CwMoneroPlugin
+
+      macos:
+        pluginClass: CwMoneroPlugin
 
   # To add assets to your plugin package, add an assets section, like this:
   # assets:
diff --git a/cw_monero/test/cw_monero_method_channel_test.dart b/cw_monero/test/cw_monero_method_channel_test.dart
new file mode 100644
index 000000000..8c1f329f0
--- /dev/null
+++ b/cw_monero/test/cw_monero_method_channel_test.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:cw_monero/cw_monero_method_channel.dart';
+
+void main() {
+  MethodChannelCwMonero platform = MethodChannelCwMonero();
+  const MethodChannel channel = MethodChannel('cw_monero');
+
+  TestWidgetsFlutterBinding.ensureInitialized();
+
+  setUp(() {
+    channel.setMockMethodCallHandler((MethodCall methodCall) async {
+      return '42';
+    });
+  });
+
+  tearDown(() {
+    channel.setMockMethodCallHandler(null);
+  });
+
+  test('getPlatformVersion', () async {
+    expect(await platform.getPlatformVersion(), '42');
+  });
+}
diff --git a/cw_monero/test/cw_monero_test.dart b/cw_monero/test/cw_monero_test.dart
new file mode 100644
index 000000000..1eb8d6f79
--- /dev/null
+++ b/cw_monero/test/cw_monero_test.dart
@@ -0,0 +1,29 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:cw_monero/cw_monero.dart';
+import 'package:cw_monero/cw_monero_platform_interface.dart';
+import 'package:cw_monero/cw_monero_method_channel.dart';
+import 'package:plugin_platform_interface/plugin_platform_interface.dart';
+
+class MockCwMoneroPlatform
+    with MockPlatformInterfaceMixin
+    implements CwMoneroPlatform {
+
+  @override
+  Future<String?> getPlatformVersion() => Future.value('42');
+}
+
+void main() {
+  final CwMoneroPlatform initialPlatform = CwMoneroPlatform.instance;
+
+  test('$MethodChannelCwMonero is the default instance', () {
+    expect(initialPlatform, isInstanceOf<MethodChannelCwMonero>());
+  });
+
+  test('getPlatformVersion', () async {
+    CwMonero cwMoneroPlugin = CwMonero();
+    MockCwMoneroPlatform fakePlatform = MockCwMoneroPlatform();
+    CwMoneroPlatform.instance = fakePlatform;
+
+    expect(await cwMoneroPlugin.getPlatformVersion(), '42');
+  });
+}
diff --git a/ios/CakeWallet/wakeLock.swift b/ios/CakeWallet/wakeLock.swift
deleted file mode 100644
index 35f23eafa..000000000
--- a/ios/CakeWallet/wakeLock.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-//  wakeLock.swift
-//  Runner
-//
-//  Created by Godwin Asuquo on 1/21/22.
-//
-
-import Foundation
-import UIKit
-
-func enableWakeScreen() -> Bool{
-    UIApplication.shared.isIdleTimerDisabled = true
-
-    return true
-}
-
-func disableWakeScreen() -> Bool{
-    UIApplication.shared.isIdleTimerDisabled = false
-    return true
-}
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 5d57216c4..d0e05f5dd 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -148,6 +148,8 @@ PODS:
     - CryptoSwift
   - url_launcher_ios (0.0.1):
     - Flutter
+  - wakelock (0.0.1):
+    - Flutter
 
 DEPENDENCIES:
   - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
@@ -176,6 +178,7 @@ DEPENDENCIES:
   - uni_links (from `.symlinks/plugins/uni_links/ios`)
   - UnstoppableDomainsResolution (~> 4.0.0)
   - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+  - wakelock (from `.symlinks/plugins/wakelock/ios`)
 
 SPEC REPOS:
   https://github.com/CocoaPods/Specs.git:
@@ -240,6 +243,8 @@ EXTERNAL SOURCES:
     :path: ".symlinks/plugins/uni_links/ios"
   url_launcher_ios:
     :path: ".symlinks/plugins/url_launcher_ios/ios"
+  wakelock:
+    :path: ".symlinks/plugins/wakelock/ios"
 
 SPEC CHECKSUMS:
   barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
@@ -277,6 +282,7 @@ SPEC CHECKSUMS:
   uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
   UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
   url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
+  wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
 
 PODFILE CHECKSUM: ae71bdf0eb731a1ffc399c122f6aa4dea0cb5f6f
 
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 5148714e5..50b9da031 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -12,7 +12,6 @@
 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
 		20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */; };
 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
-		5AFFEBFD279AD49C00F906A4 /* wakeLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AFFEBFC279AD49C00F906A4 /* wakeLock.swift */; };
 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
@@ -282,7 +281,6 @@
 			files = (
 				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
 				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
-				5AFFEBFD279AD49C00F906A4 /* wakeLock.swift in Sources */,
 				0C9D68C9264854B60011B691 /* secRandom.swift in Sources */,
 				0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */,
 			);
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index c4d460e08..6d5f51aa3 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -96,11 +96,6 @@ import UnstoppableDomainsResolution
                     
                     result(address)
                 }
-            case "enableWakeScreen":
-                result(enableWakeScreen())
-
-            case "disableWakeScreen":
-                result(disableWakeScreen())
 
             default:
                 result(FlutterMethodNotImplemented)
@@ -110,4 +105,12 @@ import UnstoppableDomainsResolution
         GeneratedPluginRegistrant.register(with: self)
         return super.application(application, didFinishLaunchingWithOptions: launchOptions)
     }
+
+    override func applicationWillResignActive(_: UIApplication ) {
+        self.window?.isHidden = true;
+      }
+
+      override func applicationDidBecomeActive(_: UIApplication) {
+        self.window?.isHidden = false;
+      }
 }
diff --git a/lib/buy/moonpay/moonpay_buy_provider.dart b/lib/buy/moonpay/moonpay_buy_provider.dart
index 4ff3fb04c..372b6d6cc 100644
--- a/lib/buy/moonpay/moonpay_buy_provider.dart
+++ b/lib/buy/moonpay/moonpay_buy_provider.dart
@@ -23,7 +23,7 @@ class MoonPaySellProvider {
   final bool isTest;
   final String baseUrl;
 
-  Future<String> requestUrl({required CryptoCurrency currency, required String refundWalletAddress}) async {
+  Future<Uri> requestUrl({required CryptoCurrency currency, required String refundWalletAddress}) async {
     final originalUri = Uri.https(
       baseUrl, '', <String, dynamic>{
         'apiKey': _apiKey,
@@ -37,13 +37,13 @@ class MoonPaySellProvider {
     final signature = base64.encode(digest.bytes);
 
     if (isTest) {
-      return originalUri.toString();
+      return originalUri;
     }
 
     final query = Map<String, dynamic>.from(originalUri.queryParameters);
     query['signature'] = signature;
     final signedUri = originalUri.replace(queryParameters: query);
-    return signedUri.toString();
+    return signedUri;
   }
 }
 
diff --git a/lib/buy/onramper/onramper_buy_provider.dart b/lib/buy/onramper/onramper_buy_provider.dart
new file mode 100644
index 000000000..a887f98dc
--- /dev/null
+++ b/lib/buy/onramper/onramper_buy_provider.dart
@@ -0,0 +1,69 @@
+import 'package:cake_wallet/.secrets.g.dart' as secrets;
+import 'package:cake_wallet/store/settings_store.dart';
+import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cw_core/wallet_base.dart';
+
+class OnRamperBuyProvider {
+  OnRamperBuyProvider({required SettingsStore settingsStore, required WalletBase wallet})
+      : this._settingsStore = settingsStore,
+        this._wallet = wallet;
+
+  final SettingsStore _settingsStore;
+  final WalletBase _wallet;
+
+  static const _baseUrl = 'buy.onramper.com';
+
+  static String get _apiKey => secrets.onramperApiKey;
+
+  Uri requestUrl() {
+    String primaryColor,
+        secondaryColor,
+        primaryTextColor,
+        secondaryTextColor,
+        containerColor,
+        cardColor;
+
+    switch (_settingsStore.currentTheme.type) {
+      case ThemeType.bright:
+        primaryColor = '815dfbff';
+        secondaryColor = 'ffffff';
+        primaryTextColor = '141519';
+        secondaryTextColor = '6b6f80';
+        containerColor = 'ffffff';
+        cardColor = 'f2f0faff';
+        break;
+      case ThemeType.light:
+        primaryColor = '2194ffff';
+        secondaryColor = 'ffffff';
+        primaryTextColor = '141519';
+        secondaryTextColor = '6b6f80';
+        containerColor = 'ffffff';
+        cardColor = 'e5f7ff';
+        break;
+      case ThemeType.dark:
+        primaryColor = '456effff';
+        secondaryColor = '1b2747ff';
+        primaryTextColor = 'ffffff';
+        secondaryTextColor = 'ffffff';
+        containerColor = '19233C';
+        cardColor = '232f4fff';
+        break;
+    }
+
+
+    return Uri.https(_baseUrl, '', <String, dynamic>{
+      'apiKey': _apiKey,
+      'defaultCrypto': _wallet.currency.title,
+      'defaultFiat': _settingsStore.fiatCurrency.title,
+      'wallets': '${_wallet.currency.title}:${_wallet.walletAddresses.address}',
+      'supportSell': "false",
+      'supportSwap': "false",
+      'primaryColor': primaryColor,
+      'secondaryColor': secondaryColor,
+      'primaryTextColor': primaryTextColor,
+      'secondaryTextColor': secondaryTextColor,
+      'containerColor': containerColor,
+      'cardColor': cardColor
+    });
+  }
+}
diff --git a/lib/buy/payfura/payfura_buy_provider.dart b/lib/buy/payfura/payfura_buy_provider.dart
new file mode 100644
index 000000000..eb9104df0
--- /dev/null
+++ b/lib/buy/payfura/payfura_buy_provider.dart
@@ -0,0 +1,24 @@
+import 'package:cake_wallet/.secrets.g.dart' as secrets;
+import 'package:cake_wallet/store/settings_store.dart';
+import 'package:cw_core/wallet_base.dart';
+
+class PayfuraBuyProvider {
+  PayfuraBuyProvider({required SettingsStore settingsStore, required WalletBase wallet})
+      : this._settingsStore = settingsStore,
+        this._wallet = wallet;
+
+  final SettingsStore _settingsStore;
+  final WalletBase _wallet;
+
+  static const _baseUrl = 'exchange.payfura.com';
+
+  Uri requestUrl() {
+    return Uri.https(_baseUrl, '', <String, dynamic>{
+      'apiKey': secrets.payfuraApiKey,
+      'to': _wallet.currency.title,
+      'from': _settingsStore.fiatCurrency.title,
+      'walletAddress': '${_wallet.currency.title}:${_wallet.walletAddresses.address}',
+      'mode': 'buy'
+    });
+  }
+}
diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart
index 22ad6a9d8..0bed0611c 100644
--- a/lib/core/address_validator.dart
+++ b/lib/core/address_validator.dart
@@ -85,6 +85,8 @@ class AddressValidator extends TextValidator {
         return 'R[0-9a-zA-Z]{33}';
       case CryptoCurrency.pivx:
         return 'D([1-9a-km-zA-HJ-NP-Z]){33}';
+      case CryptoCurrency.btcln:
+        return '^(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
       default:
         return '[0-9a-zA-Z]';
     }
@@ -194,6 +196,8 @@ class AddressValidator extends TextValidator {
         return [45];
       case CryptoCurrency.near:
         return [64];
+      case CryptoCurrency.btcln:
+        return null;
       default:
         return [];
     }
diff --git a/lib/core/amount_validator.dart b/lib/core/amount_validator.dart
index 42eb3c32d..fb5214d54 100644
--- a/lib/core/amount_validator.dart
+++ b/lib/core/amount_validator.dart
@@ -1,19 +1,48 @@
 import 'package:cake_wallet/core/validator.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/currency.dart';
 
 class AmountValidator extends TextValidator {
-  AmountValidator({required CryptoCurrency currency, bool isAutovalidate = false}) {
+  AmountValidator({
+    required CryptoCurrency currency,
+    bool isAutovalidate = false,
+    String? minValue,
+    String? maxValue,
+  }) {
     symbolsAmountValidator =
         SymbolsAmountValidator(isAutovalidate: isAutovalidate);
     decimalAmountValidator = DecimalAmountValidator(currency: currency,isAutovalidate: isAutovalidate);
+
+    amountMinValidator = AmountMinValidator(
+      minValue: minValue,
+      isAutovalidate: isAutovalidate,
+    );
+
+    amountMaxValidator = AmountMaxValidator(
+      maxValue: maxValue,
+      isAutovalidate: isAutovalidate,
+    );
   }
 
+  late final AmountMinValidator amountMinValidator;
+
+  late final AmountMaxValidator amountMaxValidator;
+
   late final SymbolsAmountValidator symbolsAmountValidator;
 
   late final DecimalAmountValidator decimalAmountValidator;
 
-  String? call(String? value) => symbolsAmountValidator(value) ?? decimalAmountValidator(value);
+  String? call(String? value) {
+    //* Validate for Text(length, symbols, decimals etc)
+
+    final textValidation = symbolsAmountValidator(value) ?? decimalAmountValidator(value);
+
+    //* Validate for Comparison(Value greater than min and less than )
+    final comparisonValidation = amountMinValidator(value) ?? amountMaxValidator(value);
+
+    return textValidation ?? comparisonValidation;
+  }
 }
 
 class SymbolsAmountValidator extends TextValidator {
@@ -29,7 +58,7 @@ class SymbolsAmountValidator extends TextValidator {
 }
 
 class DecimalAmountValidator extends TextValidator {
-  DecimalAmountValidator({required CryptoCurrency currency, required bool isAutovalidate })
+  DecimalAmountValidator({required Currency currency, required bool isAutovalidate })
       : super(
             errorMessage: S.current.decimal_places_error,
             pattern: _pattern(currency),
@@ -37,7 +66,7 @@ class DecimalAmountValidator extends TextValidator {
             minLength: 0,
             maxLength: 0);
 
-  static String _pattern(CryptoCurrency currency) {
+  static String _pattern(Currency currency) {
     switch (currency) {
       case CryptoCurrency.xmr:
         return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,12})\$';
@@ -57,3 +86,71 @@ class AllAmountValidator extends TextValidator {
             minLength: 0,
             maxLength: 0);
 }
+
+class AmountMinValidator extends Validator<String> {
+  final String? minValue;
+  final bool isAutovalidate;
+
+  AmountMinValidator({
+    this.minValue,
+    required this.isAutovalidate,
+  }) : super(errorMessage: S.current.error_text_input_below_minimum_limit);
+
+  @override
+  bool isValid(String? value) {
+    if (value == null || value.isEmpty) {
+      return isAutovalidate ? true : false;
+    }
+
+    if (minValue == null || minValue == "null") {
+      return true;
+    }
+
+    final valueInDouble = parseToDouble(value);
+    final minInDouble = parseToDouble(minValue ?? '');
+
+    if (valueInDouble == null || minInDouble == null) {
+      return false;
+    }
+
+    return valueInDouble > minInDouble;
+  }
+
+  double? parseToDouble(String value) {
+    final data = double.tryParse(value.replaceAll(',', '.'));
+    return data;
+  }
+}
+
+class AmountMaxValidator extends Validator<String> {
+  final String? maxValue;
+  final bool isAutovalidate;
+
+  AmountMaxValidator({
+    this.maxValue,
+    required this.isAutovalidate,
+  }) : super(errorMessage: S.current.error_text_input_above_maximum_limit);
+
+  @override
+  bool isValid(String? value) {
+    if (value == null || value.isEmpty) {
+      return isAutovalidate ? true : false;
+    }
+
+    if (maxValue == null || maxValue == "null") {
+      return true;
+    }
+
+    final valueInDouble = parseToDouble(value);
+    final maxInDouble = parseToDouble(maxValue ?? '');
+
+    if (valueInDouble == null || maxInDouble == null) {
+      return false;
+    }
+    return valueInDouble < maxInDouble;
+  }
+
+  double? parseToDouble(String value) {
+    return double.tryParse(value.replaceAll(',', '.'));
+  }
+}
diff --git a/lib/core/auth_service.dart b/lib/core/auth_service.dart
index 54f89437a..d26fd17a3 100644
--- a/lib/core/auth_service.dart
+++ b/lib/core/auth_service.dart
@@ -1,10 +1,12 @@
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/screens/auth/auth_page.dart';
+import 'package:flutter/material.dart';
 import 'package:mobx/mobx.dart';
 import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 import 'package:cake_wallet/entities/preferences_key.dart';
 import 'package:cake_wallet/entities/secret_store_key.dart';
 import 'package:cake_wallet/entities/encrypt.dart';
-import 'package:cake_wallet/di.dart';
 import 'package:cake_wallet/store/settings_store.dart';
 
 class AuthService with Store {
@@ -14,6 +16,12 @@ class AuthService with Store {
     required this.settingsStore,
   });
 
+  static const List<String> _alwaysAuthenticateRoutes = [
+    Routes.showKeys,
+    Routes.backup,
+    Routes.setupPin,
+  ];
+
   final FlutterSecureStorage secureStorage;
   final SharedPreferences sharedPreferences;
   final SettingsStore settingsStore;
@@ -66,4 +74,33 @@ class AuthService with Store {
 
     return timeDifference.inMinutes;
   }
+
+  Future<void> authenticateAction(BuildContext context,
+      {Function(bool)? onAuthSuccess, String? route, Object? arguments}) async {
+    assert(route != null || onAuthSuccess != null,
+        'Either route or onAuthSuccess param must be passed.');
+    if (!requireAuth() && !_alwaysAuthenticateRoutes.contains(route)) {
+      if (onAuthSuccess != null) {
+        onAuthSuccess(true);
+      } else {
+        Navigator.of(context).pushNamed(
+          route ?? '',
+          arguments: arguments,
+        );
+      }
+      return;
+    }
+    Navigator.of(context).pushNamed(Routes.auth,
+        arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
+      if (!isAuthenticatedSuccessfully) {
+        onAuthSuccess?.call(false);
+        return;
+      }
+      if (onAuthSuccess != null) {
+        auth.close().then((value) => onAuthSuccess.call(true));
+      } else {
+        auth.close(route: route, arguments: arguments);
+      }
+    });
+  }
 }
diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart
index 3cb434efe..20fd753d8 100644
--- a/lib/core/backup_service.dart
+++ b/lib/core/backup_service.dart
@@ -209,6 +209,7 @@ class BackupService {
     final currentBalanceDisplayMode = data[PreferencesKey.currentBalanceDisplayModeKey] as int?;
     final currentFiatCurrency = data[PreferencesKey.currentFiatCurrencyKey] as String?;
     final shouldSaveRecipientAddress = data[PreferencesKey.shouldSaveRecipientAddressKey] as bool?;
+    final isAppSecure = data[PreferencesKey.isAppSecureKey] as bool?;
     final currentTransactionPriorityKeyLegacy = data[PreferencesKey.currentTransactionPriorityKeyLegacy] as int?;
     final allowBiometricalAuthentication = data[PreferencesKey.allowBiometricalAuthenticationKey] as bool?;
     final currentBitcoinElectrumSererId = data[PreferencesKey.currentBitcoinElectrumSererIdKey] as int?;
@@ -245,6 +246,11 @@ class BackupService {
         PreferencesKey.shouldSaveRecipientAddressKey,
         shouldSaveRecipientAddress);
 
+    if (isAppSecure != null)
+      await _sharedPreferences.setBool(
+          PreferencesKey.isAppSecureKey,
+          isAppSecure);
+
     if (currentTransactionPriorityKeyLegacy != null)
       await _sharedPreferences.setInt(
         PreferencesKey.currentTransactionPriorityKeyLegacy,
diff --git a/lib/di.dart b/lib/di.dart
index 4a7604f40..b56a80191 100644
--- a/lib/di.dart
+++ b/lib/di.dart
@@ -1,11 +1,12 @@
 import 'package:cake_wallet/anonpay/anonpay_api.dart';
 import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
 import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
+import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
+import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
 import 'package:cake_wallet/core/yat_service.dart';
 import 'package:cake_wallet/entities/exchange_api_mode.dart';
 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
 import 'package:cake_wallet/entities/receive_page_option.dart';
-import 'package:cake_wallet/entities/wake_lock.dart';
 import 'package:cake_wallet/ethereum/ethereum.dart';
 import 'package:cake_wallet/ionia/ionia_anypay.dart';
 import 'package:cake_wallet/ionia/ionia_gift_card.dart';
@@ -13,6 +14,10 @@ import 'package:cake_wallet/ionia/ionia_tip.dart';
 import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dart';
 import 'package:cake_wallet/src/screens/buy/onramper_page.dart';
 import 'package:cake_wallet/src/screens/buy/payfura_page.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_dashboard_page.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
+import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart';
 import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
 import 'package:cake_wallet/src/screens/receive/anonpay_receive_page.dart';
 import 'package:cake_wallet/src/screens/settings/display_settings_page.dart';
@@ -23,8 +28,11 @@ import 'package:cake_wallet/src/screens/ionia/cards/ionia_custom_redeem_page.dar
 import 'package:cake_wallet/src/screens/ionia/cards/ionia_gift_card_detail_page.dart';
 import 'package:cake_wallet/src/screens/ionia/cards/ionia_more_options_page.dart';
 import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart';
+import 'package:cake_wallet/themes/theme_list.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
 import 'package:cake_wallet/utils/payment_request.dart';
+import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
 import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
 import 'package:cake_wallet/view_model/anonpay_details_view_model.dart';
 import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart';
@@ -46,6 +54,8 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/balance_page.dart';
 import 'package:cake_wallet/view_model/ionia/ionia_account_view_model.dart';
 import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
 import 'package:cake_wallet/view_model/ionia/ionia_purchase_merch_view_model.dart';
+import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
 import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart';
 import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart';
 import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart';
@@ -144,7 +154,6 @@ import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
 import 'package:cake_wallet/view_model/wallet_restore_view_model.dart';
 import 'package:cake_wallet/view_model/wallet_seed_view_model.dart';
 import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
-import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 import 'package:get_it/get_it.dart';
 import 'package:hive/hive.dart';
@@ -177,6 +186,7 @@ import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart';
 import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart';
 import 'package:cake_wallet/core/wallet_loading_service.dart';
 import 'package:cw_core/crypto_currency.dart';
+import 'package:cake_wallet/entities/qr_view_data.dart';
 
 final getIt = GetIt.instance;
 
@@ -202,7 +212,7 @@ Future setup(
     required Box<TransactionDescription> transactionDescriptionBox,
     required Box<Order> ordersSource,
     Box<UnspentCoinsInfo>? unspentCoinsInfoSource,
-    required Box<AnonpayInvoiceInfo> anonpayInvoiceInfoSource
+    required Box<AnonpayInvoiceInfo> anonpayInvoiceInfoSource,
     }) async {
   _walletInfoSource = walletInfoSource;
   _nodeSource = nodeSource;
@@ -220,12 +230,16 @@ Future setup(
         () => SharedPreferences.getInstance());
   }
 
-  final isBitcoinBuyEnabled = (secrets.wyreSecretKey?.isNotEmpty ?? false) &&
-      (secrets.wyreApiKey?.isNotEmpty ?? false) &&
-      (secrets.wyreAccountId?.isNotEmpty ?? false);
+  final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty ?? false) &&
+      (secrets.wyreApiKey.isNotEmpty ?? false) &&
+      (secrets.wyreAccountId.isNotEmpty ?? false);
 
   final settingsStore = await SettingsStoreBase.load(
-      nodeSource: _nodeSource, isBitcoinBuyEnabled: isBitcoinBuyEnabled);
+    nodeSource: _nodeSource,
+    isBitcoinBuyEnabled: isBitcoinBuyEnabled,
+    // Enforce darkTheme on platforms other than mobile till the design for other themes is completed
+    initialTheme: DeviceInfo.instance.isMobile ? null : ThemeList.darkTheme,
+  );
 
   if (_isSetupFinished) {
     return;
@@ -309,9 +323,18 @@ Future setup(
         type: type, language: language);
   });
 
+  getIt
+      .registerFactoryParam<WalletRestorationFromQRVM, WalletType, void>((WalletType type, _) {
+    return WalletRestorationFromQRVM(getIt.get<AppStore>(),
+        getIt.get<WalletCreationService>(param1: type),
+        _walletInfoSource, type);
+  });
+
   getIt.registerFactory<WalletAddressListViewModel>(() =>
       WalletAddressListViewModel(
-          appStore: getIt.get<AppStore>(), yatStore: getIt.get<YatStore>()));
+          appStore: getIt.get<AppStore>(), yatStore: getIt.get<YatStore>(),
+          fiatConversionStore: getIt.get<FiatConversionStore>()
+      ));
 
   getIt.registerFactory(() => BalanceViewModel(
       appStore: getIt.get<AppStore>(),
@@ -376,42 +399,65 @@ Future setup(
       .registerFactoryParam<AuthPage, void Function(bool, AuthPageState), bool>(
           (onAuthFinished, closable) => AuthPage(getIt.get<AuthViewModel>(),
               onAuthenticationFinished: onAuthFinished,
-              closable: closable ?? false));
+              closable: closable));
 
   getIt.registerFactory(() =>
    BalancePage(dashboardViewModel: getIt.get<DashboardViewModel>(), settingsStore: getIt.get<SettingsStore>()));
 
-  getIt.registerFactory<DashboardPage>(() => DashboardPage( balancePage: getIt.get<BalancePage>(), walletViewModel: getIt.get<DashboardViewModel>(), addressListViewModel: getIt.get<WalletAddressListViewModel>()));
-  
+  getIt.registerFactory<DashboardPage>(() => DashboardPage(
+      balancePage: getIt.get<BalancePage>(),
+      dashboardViewModel: getIt.get<DashboardViewModel>(),
+      addressListViewModel: getIt.get<WalletAddressListViewModel>(),
+    ));
+
+  getIt.registerFactory<DesktopSidebarWrapper>(() {
+    final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
+    return DesktopSidebarWrapper(
+      dashboardViewModel: getIt.get<DashboardViewModel>(),
+      desktopSidebarViewModel: getIt.get<DesktopSidebarViewModel>(),
+      child: getIt.get<DesktopDashboardPage>(param1: _navigatorKey),
+      desktopNavigatorKey: _navigatorKey,
+    );
+  });
+  getIt.registerFactoryParam<DesktopDashboardPage, GlobalKey<NavigatorState>, void>(
+      (desktopKey, _) => DesktopDashboardPage(
+        balancePage: getIt.get<BalancePage>(),
+        dashboardViewModel: getIt.get<DashboardViewModel>(),
+        addressListViewModel: getIt.get<WalletAddressListViewModel>(),
+        desktopKey: desktopKey,
+      ));
+
+  getIt.registerFactory<TransactionsPage>(() => TransactionsPage(dashboardViewModel: getIt.get<DashboardViewModel>()));
+
   getIt.registerFactoryParam<ReceiveOptionViewModel, ReceivePageOption?, void>((pageOption, _) => ReceiveOptionViewModel(
       getIt.get<AppStore>().wallet!, pageOption));
 
-  getIt.registerFactoryParam<AnonInvoicePageViewModel, List<dynamic>, void>((args, _) { 
+  getIt.registerFactoryParam<AnonInvoicePageViewModel, List<dynamic>, void>((args, _) {
     final address = args.first as String;
     final pageOption = args.last as ReceivePageOption;
     return AnonInvoicePageViewModel(
-      getIt.get<AnonPayApi>(), 
-      address, 
-      getIt.get<SettingsStore>(), 
-      getIt.get<AppStore>().wallet!, 
-      _anonpayInvoiceInfoSource, 
+      getIt.get<AnonPayApi>(),
+      address,
+      getIt.get<SettingsStore>(),
+      getIt.get<AppStore>().wallet!,
+      _anonpayInvoiceInfoSource,
       getIt.get<SharedPreferences>(),
       pageOption,
-    ); 
+    );
     });
 
-  getIt.registerFactoryParam<AnonPayInvoicePage, List<dynamic>, void>((List<dynamic> args, _) { 
+  getIt.registerFactoryParam<AnonPayInvoicePage, List<dynamic>, void>((List<dynamic> args, _) {
     final pageOption = args.last as ReceivePageOption;
     return AnonPayInvoicePage(
-       getIt.get<AnonInvoicePageViewModel>(param1: args), 
+       getIt.get<AnonInvoicePageViewModel>(param1: args),
        getIt.get<ReceiveOptionViewModel>(param1: pageOption));
-    });  
-  
+    });
+
   getIt.registerFactory<ReceivePage>(() => ReceivePage(
       addressListViewModel: getIt.get<WalletAddressListViewModel>()));
   getIt.registerFactory<AddressPage>(() => AddressPage(
       addressListViewModel: getIt.get<WalletAddressListViewModel>(),
-      walletViewModel: getIt.get<DashboardViewModel>(),
+      dashboardViewModel: getIt.get<DashboardViewModel>(),
       receiveOptionViewModel: getIt.get<ReceiveOptionViewModel>()));
 
   getIt.registerFactoryParam<WalletAddressEditOrCreateViewModel, WalletAddressListItem?, void>(
@@ -446,16 +492,28 @@ Future setup(
   getIt.registerFactory(() => SendTemplatePage(
       sendTemplateViewModel: getIt.get<SendTemplateViewModel>()));
 
-  getIt.registerFactory(() => WalletListViewModel(
-      _walletInfoSource,
-      getIt.get<AppStore>(),
-      getIt.get<WalletLoadingService>(),
-      getIt.get<AuthService>(),
-    ),
-  );
+  if (DeviceInfo.instance.isMobile) {
+    getIt.registerFactory(() => WalletListViewModel(
+        _walletInfoSource,
+        getIt.get<AppStore>(),
+        getIt.get<WalletLoadingService>(),
+        getIt.get<AuthService>(),
+      ),
+    );
+  } else {
+    // register wallet list view model as singleton on desktop since it can be accessed
+    // from multiple places at the same time (Wallets DropDown, Wallets List in settings)
+    getIt.registerLazySingleton(() => WalletListViewModel(
+        _walletInfoSource,
+        getIt.get<AppStore>(),
+        getIt.get<WalletLoadingService>(),
+        getIt.get<AuthService>(),
+      ),
+    );
+  }
 
   getIt.registerFactory(() =>
-      WalletListPage(walletListViewModel: getIt.get<WalletListViewModel>()));
+      WalletListPage(walletListViewModel: getIt.get<WalletListViewModel>(), authService: getIt.get<AuthService>(),));
 
   getIt.registerFactory(() {
     final wallet = getIt.get<AppStore>().wallet!;
@@ -524,7 +582,7 @@ Future setup(
           isNewWalletCreated: isWalletCreated));
 
   getIt
-      .registerFactory(() => WalletKeysViewModel(getIt.get<AppStore>().wallet!));
+      .registerFactory(() => WalletKeysViewModel(getIt.get<AppStore>()));
 
   getIt.registerFactory(() => WalletKeysPage(getIt.get<WalletKeysViewModel>()));
 
@@ -544,13 +602,12 @@ Future setup(
 
   getIt.registerFactory(() {
     final appStore = getIt.get<AppStore>();
-    return NodeListViewModel(
-        _nodeSource, appStore.wallet!, appStore.settingsStore);
+    return NodeListViewModel(_nodeSource, appStore);
   });
 
   getIt.registerFactory(() => ConnectionSyncPage(getIt.get<NodeListViewModel>(), getIt.get<DashboardViewModel>()));
 
-  getIt.registerFactory(() => SecurityBackupPage(getIt.get<SecuritySettingsViewModel>()));
+  getIt.registerFactory(() => SecurityBackupPage(getIt.get<SecuritySettingsViewModel>(), getIt.get<AuthService>()));
 
   getIt.registerFactory(() => PrivacyPage(getIt.get<PrivacySettingsViewModel>()));
 
@@ -571,13 +628,19 @@ Future setup(
           editingNode: editingNode,
           isSelected: isSelected));
 
-  getIt.registerFactory(() => OnRamperPage(
+  getIt.registerFactory<OnRamperBuyProvider>(() => OnRamperBuyProvider(
     settingsStore: getIt.get<AppStore>().settingsStore,
-    wallet: getIt.get<AppStore>().wallet!));
+    wallet: getIt.get<AppStore>().wallet!,
+  ));
 
-  getIt.registerFactory(() => PayFuraPage(
-      settingsStore: getIt.get<AppStore>().settingsStore,
-      wallet: getIt.get<AppStore>().wallet!));
+  getIt.registerFactory(() => OnRamperPage(getIt.get<OnRamperBuyProvider>()));
+
+  getIt.registerFactory<PayfuraBuyProvider>(() => PayfuraBuyProvider(
+    settingsStore: getIt.get<AppStore>().settingsStore,
+    wallet: getIt.get<AppStore>().wallet!,
+  ));
+
+  getIt.registerFactory(() => PayFuraPage(getIt.get<PayfuraBuyProvider>()));
 
   getIt.registerFactory(() => ExchangeViewModel(
       getIt.get<AppStore>().wallet!,
@@ -692,7 +755,9 @@ Future setup(
   getIt.registerFactory(
       () => EditBackupPasswordPage(getIt.get<EditBackupPasswordViewModel>()));
 
-  getIt.registerFactory(() => RestoreOptionsPage());
+  getIt.registerFactoryParam<RestoreOptionsPage, bool, void>((bool isNewInstall, _) =>
+              RestoreOptionsPage(isNewInstall: isNewInstall));
+
 
   getIt.registerFactory(
       () => RestoreFromBackupViewModel(getIt.get<BackupService>()));
@@ -762,15 +827,13 @@ Future setup(
             param1: item, param2: unspentCoinsListViewModel));
   });
 
-  getIt.registerFactory(() => WakeLock());
-
   getIt.registerFactory(() => YatService());
 
   getIt.registerFactory(() => AddressResolver(yatService: getIt.get<YatService>(),
     walletType: getIt.get<AppStore>().wallet!.type));
 
-  getIt.registerFactoryParam<FullscreenQRPage, String, int?>(
-          (String qrData, int? version) => FullscreenQRPage(qrData: qrData, version: version,));
+  getIt.registerFactoryParam<FullscreenQRPage, QrViewData, void>(
+          (QrViewData viewData, _) => FullscreenQRPage(qrViewData: viewData));
 
   getIt.registerFactory(() => IoniaApi());
 
@@ -876,11 +939,15 @@ Future setup(
   getIt.registerFactory(() => IoniaAccountPage(getIt.get<IoniaAccountViewModel>()));
 
   getIt.registerFactory(() => IoniaAccountCardsPage(getIt.get<IoniaAccountViewModel>()));
-  
+
   getIt.registerFactory(() => AnonPayApi(useTorOnly: getIt.get<SettingsStore>().exchangeStatus == ExchangeApiMode.torOnly,
-    wallet: getIt.get<AppStore>().wallet!) 
+    wallet: getIt.get<AppStore>().wallet!)
   );
 
+  getIt.registerFactory(() => DesktopWalletSelectionDropDown(getIt.get<WalletListViewModel>(), getIt.get<AuthService>()));
+
+  getIt.registerFactory(() => DesktopSidebarViewModel());
+
   getIt.registerFactoryParam<AnonpayDetailsViewModel, AnonpayInvoiceInfo, void>(
   (AnonpayInvoiceInfo anonpayInvoiceInfo, _)
     => AnonpayDetailsViewModel(
@@ -893,7 +960,7 @@ Future setup(
     (AnonpayInfoBase anonpayInvoiceInfo, _) => AnonPayReceivePage(invoiceInfo: anonpayInvoiceInfo));
 
   getIt.registerFactoryParam<AnonpayDetailsPage, AnonpayInvoiceInfo, void>(
-    (AnonpayInvoiceInfo anonpayInvoiceInfo, _) 
+    (AnonpayInvoiceInfo anonpayInvoiceInfo, _)
     => AnonpayDetailsPage(anonpayDetailsViewModel: getIt.get<AnonpayDetailsViewModel>(param1: anonpayInvoiceInfo)));
 
   getIt.registerFactoryParam<IoniaPaymentStatusViewModel, IoniaAnyPayPaymentInfo, AnyPayPaymentCommittedInfo>(
diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart
index 08aab4880..b4cb23131 100644
--- a/lib/entities/default_settings_migration.dart
+++ b/lib/entities/default_settings_migration.dart
@@ -43,6 +43,13 @@ Future defaultSettingsMigration(
   // check current nodes for nullability regardless of the version
   await checkCurrentNodes(nodes, sharedPreferences);
 
+  final isNewInstall = sharedPreferences
+      .getInt(PreferencesKey.currentDefaultSettingsMigrationVersion) == null;
+
+  await sharedPreferences.setBool(
+      PreferencesKey.isNewInstall, isNewInstall);
+
+
   final currentVersion = sharedPreferences
           .getInt(PreferencesKey.currentDefaultSettingsMigrationVersion) ??
       0;
diff --git a/lib/entities/desktop_dropdown_item.dart b/lib/entities/desktop_dropdown_item.dart
new file mode 100644
index 000000000..3a542f5e8
--- /dev/null
+++ b/lib/entities/desktop_dropdown_item.dart
@@ -0,0 +1,9 @@
+import 'package:flutter/material.dart';
+
+class DesktopDropdownItem {
+  final Function() onSelected;
+  final Widget child;
+  final bool isSelected;
+
+  DesktopDropdownItem({required this.onSelected, required this.child, this.isSelected = false});
+}
diff --git a/lib/entities/main_actions.dart b/lib/entities/main_actions.dart
new file mode 100644
index 000000000..ec70b95d9
--- /dev/null
+++ b/lib/entities/main_actions.dart
@@ -0,0 +1,142 @@
+import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart';
+import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
+import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
+import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
+import 'package:cake_wallet/utils/device_info.dart';
+import 'package:cake_wallet/utils/show_pop_up.dart';
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:flutter/material.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class MainActions {
+  final String Function(BuildContext context) name;
+  final String image;
+
+  final bool Function(DashboardViewModel viewModel)? isEnabled;
+  final bool Function(DashboardViewModel viewModel)? canShow;
+  final Future<void> Function(BuildContext context, DashboardViewModel viewModel) onTap;
+
+  MainActions._({
+    required this.name,
+    required this.image,
+    this.isEnabled,
+    this.canShow,
+    required this.onTap,
+  });
+
+  static List<MainActions> all = [
+    buyAction,
+    receiveAction,
+    exchangeAction,
+    sendAction,
+    sellAction,
+  ];
+
+  static MainActions buyAction = MainActions._(
+    name: (context) => S.of(context).buy,
+    image: 'assets/images/buy.png',
+    isEnabled: (viewModel) => viewModel.isEnabledBuyAction,
+    canShow: (viewModel) => viewModel.hasBuyAction,
+    onTap: (BuildContext context, DashboardViewModel viewModel) async {
+      final walletType = viewModel.type;
+
+      switch (walletType) {
+        case WalletType.bitcoin:
+        case WalletType.litecoin:
+          if (DeviceInfo.instance.isMobile) {
+            Navigator.of(context).pushNamed(Routes.onramperPage);
+          } else {
+            final uri = getIt
+                .get<OnRamperBuyProvider>()
+                .requestUrl();
+            await launchUrl(uri);
+          }
+          break;
+        case WalletType.monero:
+          if (DeviceInfo.instance.isMobile) {
+            Navigator.of(context).pushNamed(Routes.payfuraPage);
+          } else {
+            final uri = getIt
+                .get<PayfuraBuyProvider>()
+                .requestUrl();
+            await launchUrl(uri);
+          }
+          break;
+        default:
+          await showPopUp<void>(
+              context: context,
+              builder: (BuildContext context) {
+                return AlertWithOneAction(
+                    alertTitle: S.of(context).buy,
+                    alertContent: S.of(context).buy_alert_content,
+                    buttonText: S.of(context).ok,
+                    buttonAction: () => Navigator.of(context).pop());
+              });
+      }
+    },
+  );
+
+  static MainActions receiveAction = MainActions._(
+    name: (context) => S.of(context).receive,
+    image: 'assets/images/received.png',
+    onTap: (BuildContext context, DashboardViewModel viewModel) async {
+      Navigator.pushNamed(context, Routes.addressPage);
+    },
+  );
+
+  static MainActions exchangeAction = MainActions._(
+    name: (context) => S.of(context).exchange,
+    image: 'assets/images/transfer.png',
+    isEnabled: (viewModel) => viewModel.isEnabledExchangeAction,
+    canShow: (viewModel) => viewModel.hasExchangeAction,
+    onTap: (BuildContext context, DashboardViewModel viewModel) async {
+      if (viewModel.isEnabledExchangeAction) {
+        await Navigator.of(context).pushNamed(Routes.exchange);
+      }
+    },
+  );
+
+  static MainActions sendAction = MainActions._(
+    name: (context) => S.of(context).send,
+    image: 'assets/images/upload.png',
+    onTap: (BuildContext context, DashboardViewModel viewModel) async {
+      Navigator.pushNamed(context, Routes.send);
+    },
+  );
+
+  static MainActions sellAction = MainActions._(
+    name: (context) => S.of(context).sell,
+    image: 'assets/images/sell.png',
+    isEnabled: (viewModel) => viewModel.isEnabledSellAction,
+    canShow: (viewModel) => viewModel.hasSellAction,
+    onTap: (BuildContext context, DashboardViewModel viewModel) async {
+      final walletType = viewModel.type;
+
+      switch (walletType) {
+        case WalletType.bitcoin:
+          final moonPaySellProvider = MoonPaySellProvider();
+          final uri = await moonPaySellProvider.requestUrl(
+            currency: viewModel.wallet.currency,
+            refundWalletAddress: viewModel.wallet.walletAddresses.address,
+          );
+          await launchUrl(uri);
+          break;
+        default:
+          await showPopUp<void>(
+            context: context,
+            builder: (BuildContext context) {
+              return AlertWithOneAction(
+                  alertTitle: S.of(context).sell,
+                  alertContent: S.of(context).sell_alert_content,
+                  buttonText: S.of(context).ok,
+                  buttonAction: () => Navigator.of(context).pop());
+            },
+          );
+      }
+    },
+  );
+}
diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart
index 0aefa5afe..8ac9bb51f 100644
--- a/lib/entities/parse_address_from_domain.dart
+++ b/lib/entities/parse_address_from_domain.dart
@@ -33,7 +33,7 @@ class AddressResolver {
     final addressPattern = AddressValidator.getAddressFromStringPattern(type);
 
     if (addressPattern == null) {
-      throw 'Unexpected token: $type for getAddressFromStringPattern';
+      throw Exception('Unexpected token: $type for getAddressFromStringPattern');
     }
 
     final match = RegExp(addressPattern).firstMatch(raw);
diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart
index de8226a05..9c89d71aa 100644
--- a/lib/entities/preferences_key.dart
+++ b/lib/entities/preferences_key.dart
@@ -10,6 +10,7 @@ class PreferencesKey {
   static const currentTransactionPriorityKeyLegacy = 'current_fee_priority';
   static const currentBalanceDisplayModeKey = 'current_balance_display_mode';
   static const shouldSaveRecipientAddressKey = 'save_recipient_address';
+  static const isAppSecureKey = 'is_app_secure';
   static const currentFiatApiModeKey = 'current_fiat_api_mode';
   static const allowBiometricalAuthenticationKey =
       'allow_biometrical_authentication';
@@ -33,6 +34,8 @@ class PreferencesKey {
   static const pinTimeOutDuration = 'pin_timeout_duration';
   static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds';
   static const lastPopupDate = 'last_popup_date';
+  static const lastAppReviewDate = 'last_app_review_date';
+
 
 
   static String moneroWalletUpdateV1Key(String name)
@@ -40,5 +43,8 @@ class PreferencesKey {
 
   static const exchangeProvidersSelection = 'exchange-providers-selection';
   static const clearnetDonationLink = 'clearnet_donation_link'; 
-  static const onionDonationLink = 'onion_donation_link'; 
+  static const onionDonationLink = 'onion_donation_link';
+  static const lastSeenAppVersion = 'last_seen_app_version';
+  static const shouldShowMarketPlaceInDashboard = 'should_show_marketplace_in_dashboard';
+  static const isNewInstall = 'is_new_install';
 }
diff --git a/lib/entities/qr_view_data.dart b/lib/entities/qr_view_data.dart
new file mode 100644
index 000000000..a975d137b
--- /dev/null
+++ b/lib/entities/qr_view_data.dart
@@ -0,0 +1,11 @@
+class QrViewData {
+  final int? version;
+  final String? heroTag;
+  final String data;
+
+  QrViewData({
+    this.version, 
+    this.heroTag, 
+    required this.data,
+  });
+}
\ No newline at end of file
diff --git a/lib/entities/unstoppable_domain_address.dart b/lib/entities/unstoppable_domain_address.dart
index ab94e31fb..c5ec71ab5 100644
--- a/lib/entities/unstoppable_domain_address.dart
+++ b/lib/entities/unstoppable_domain_address.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:flutter/services.dart';
 
 const channel = MethodChannel('com.cake_wallet/native_utils');
@@ -6,13 +7,18 @@ Future<String> fetchUnstoppableDomainAddress(String domain, String ticker) async
   var address = '';
 
   try {
-    address = await channel.invokeMethod<String>(
-        'getUnstoppableDomainAddress',
-        <String, String> {
-          'domain' : domain,
-          'ticker' : ticker
-        }
-    ) ?? '';
+    if (DeviceInfo.instance.isMobile) {
+      address = await channel.invokeMethod<String>(
+          'getUnstoppableDomainAddress',
+          <String, String> {
+            'domain' : domain,
+            'ticker' : ticker
+          }
+      ) ?? '';
+    } else {
+      // TODO: Integrate with Unstoppable domains resolution API
+      return address;
+    }
   } catch (e) {
     print('Unstoppable domain error: ${e.toString()}');
     address = '';
diff --git a/lib/entities/wake_lock.dart b/lib/entities/wake_lock.dart
deleted file mode 100644
index 99acc65ee..000000000
--- a/lib/entities/wake_lock.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-import 'package:flutter/services.dart';
-
-class WakeLock {
-  static const _utils = const MethodChannel('com.cake_wallet/native_utils');
-
-  Future<void> enableWake() async {
-    try {
-      await _utils.invokeMethod<bool>('enableWakeScreen');
-    } on PlatformException catch (_) {
-      print('Failed enabling screen wakelock');
-    }
-  }
-
-  Future<void> disableWake() async {
-    try {
-      await _utils.invokeMethod<bool>('disableWakeScreen');
-    } on PlatformException catch (_) {
-      print('Failed enabling screen wakelock');
-    }
-  }
-}
diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart
index e173dbdf6..89d32fa09 100644
--- a/lib/exchange/changenow/changenow_exchange_provider.dart
+++ b/lib/exchange/changenow/changenow_exchange_provider.dart
@@ -1,5 +1,6 @@
 import 'dart:convert';
 import 'package:cake_wallet/exchange/trade_not_found_exeption.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:http/http.dart';
 import 'package:cake_wallet/.secrets.g.dart' as secrets;
 import 'package:cw_core/crypto_currency.dart';
@@ -24,7 +25,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
                 .expand((i) => i)
                 .toList());
 
-  static const apiKey = secrets.changeNowApiKey;
+  static final apiKey = DeviceInfo.instance.isMobile ? secrets.changeNowApiKey : secrets.changeNowApiKeyDesktop;
   static const apiAuthority = 'api.changenow.io';
   static const createTradePath = '/v2/exchange';
   static const findTradeByIdPath = '/v2/exchange/by-id';
diff --git a/lib/exchange/sideshift/sideshift_exchange_provider.dart b/lib/exchange/sideshift/sideshift_exchange_provider.dart
index 2fc593988..a5b0c990f 100644
--- a/lib/exchange/sideshift/sideshift_exchange_provider.dart
+++ b/lib/exchange/sideshift/sideshift_exchange_provider.dart
@@ -29,9 +29,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
     CryptoCurrency.dcr,
     CryptoCurrency.kmd,
     CryptoCurrency.mkr,
-    CryptoCurrency.near,
     CryptoCurrency.oxt,
-    CryptoCurrency.paxg,
     CryptoCurrency.pivx,
     CryptoCurrency.rune,
     CryptoCurrency.rvn,
@@ -300,6 +298,8 @@ class SideShiftExchangeProvider extends ExchangeProvider {
         return 'usdcsol';
       case CryptoCurrency.maticpoly:
         return 'polygon';
+      case CryptoCurrency.btcln:
+        return 'ln';
       default:
         return currency.title.toLowerCase();
     }
diff --git a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart
index 6c5c23460..4c1072d11 100644
--- a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart
+++ b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart
@@ -6,6 +6,7 @@ import 'package:cake_wallet/exchange/simpleswap/simpleswap_request.dart';
 import 'package:cake_wallet/exchange/trade_not_created_exeption.dart';
 import 'package:cake_wallet/exchange/trade_not_found_exeption.dart';
 import 'package:cake_wallet/exchange/trade_state.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cw_core/crypto_currency.dart';
 import 'package:cake_wallet/exchange/trade_request.dart';
 import 'package:cake_wallet/exchange/trade.dart';
@@ -29,7 +30,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider {
   static const rangePath = '/v1/get_ranges';
   static const getExchangePath = '/v1/get_exchange';
   static const createExchangePath = '/v1/create_exchange';
-  static const apiKey = secrets.simpleSwapApiKey;
+  static final apiKey = DeviceInfo.instance.isMobile ? secrets.simpleSwapApiKey : secrets.simpleSwapApiKeyDesktop;
 
   @override
   ExchangeProviderDescription get description =>
diff --git a/lib/exchange/trocador/trocador_exchange_provider.dart b/lib/exchange/trocador/trocador_exchange_provider.dart
index 39b4638f4..fb6109bdf 100644
--- a/lib/exchange/trocador/trocador_exchange_provider.dart
+++ b/lib/exchange/trocador/trocador_exchange_provider.dart
@@ -285,6 +285,8 @@ class TrocadorExchangeProvider extends ExchangeProvider {
         return 'ERC20';
       case 'TRX':
         return 'TRC20';
+      case 'LN':
+        return 'Lightning';
       default:
         return tag.toLowerCase();
     }
diff --git a/lib/main.dart b/lib/main.dart
index 598d6d41a..f1323a4df 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -187,8 +187,7 @@ Future<void> initialSetup(
       transactionDescriptionBox: transactionDescriptions,
       ordersSource: ordersSource,
       anonpayInvoiceInfoSource: anonpayInvoiceInfo,
-      unspentCoinsInfoSource: unspentCoinsInfoSource,
-      );
+      unspentCoinsInfoSource: unspentCoinsInfoSource);
   await bootstrap(navigatorKey);
   monero?.onStartup();
 }
diff --git a/lib/reactions/on_authentication_state_change.dart b/lib/reactions/on_authentication_state_change.dart
index 7521170e6..5f1214b76 100644
--- a/lib/reactions/on_authentication_state_change.dart
+++ b/lib/reactions/on_authentication_state_change.dart
@@ -9,8 +9,8 @@ ReactionDisposer? _onAuthenticationStateChange;
 
 dynamic loginError;
 
-void startAuthenticationStateChange(AuthenticationStore authenticationStore,
-    GlobalKey<NavigatorState> navigatorKey) {
+void startAuthenticationStateChange(
+    AuthenticationStore authenticationStore, GlobalKey<NavigatorState> navigatorKey) {
   _onAuthenticationStateChange ??= autorun((_) async {
     final state = authenticationStore.state;
 
diff --git a/lib/reactions/on_wallet_sync_status_change.dart b/lib/reactions/on_wallet_sync_status_change.dart
index 68bd4b3c2..767bfd7e8 100644
--- a/lib/reactions/on_wallet_sync_status_change.dart
+++ b/lib/reactions/on_wallet_sync_status_change.dart
@@ -1,6 +1,4 @@
-import 'package:cake_wallet/di.dart';
 import 'package:cake_wallet/entities/update_haven_rate.dart';
-import 'package:cake_wallet/entities/wake_lock.dart';
 import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:mobx/mobx.dart';
@@ -9,7 +7,7 @@ import 'package:cw_core/wallet_base.dart';
 import 'package:cw_core/balance.dart';
 import 'package:cw_core/transaction_info.dart';
 import 'package:cw_core/sync_status.dart';
-import 'package:flutter/services.dart';
+import 'package:wakelock/wakelock.dart';
 
 ReactionDisposer? _onWalletSyncStatusChangeReaction;
 
@@ -17,7 +15,6 @@ void startWalletSyncStatusChangeReaction(
     WalletBase<Balance, TransactionHistoryBase<TransactionInfo>,
             TransactionInfo> wallet,
     FiatConversionStore fiatConversionStore) {
-  final _wakeLock = getIt.get<WakeLock>();
   _onWalletSyncStatusChangeReaction?.reaction.dispose();
   _onWalletSyncStatusChangeReaction =
       reaction((_) => wallet.syncStatus, (SyncStatus status) async {
@@ -30,10 +27,10 @@ void startWalletSyncStatusChangeReaction(
         }
       }
       if (status is SyncingSyncStatus) {
-        await _wakeLock.enableWake();
+        await Wakelock.enable();
       }
       if (status is SyncedSyncStatus || status is FailedSyncStatus) {
-        await _wakeLock.disableWake();
+        await Wakelock.disable();
       }
     } catch(e) {
       print(e.toString());
diff --git a/lib/router.dart b/lib/router.dart
index 634a69966..661a827e7 100644
--- a/lib/router.dart
+++ b/lib/router.dart
@@ -2,6 +2,7 @@ import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
 import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
 import 'package:cake_wallet/entities/contact_record.dart';
 import 'package:cake_wallet/buy/order.dart';
+import 'package:cake_wallet/entities/qr_view_data.dart';
 import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dart';
 import 'package:cake_wallet/src/screens/backup/backup_page.dart';
 import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart';
@@ -9,8 +10,12 @@ import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart';
 import 'package:cake_wallet/src/screens/buy/onramper_page.dart';
 import 'package:cake_wallet/src/screens/buy/payfura_page.dart';
 import 'package:cake_wallet/src/screens/buy/pre_order_page.dart';
+import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart';
 import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
 import 'package:cake_wallet/src/screens/receive/anonpay_receive_page.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart';
+import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart';
+import 'package:cake_wallet/src/screens/settings/desktop_settings/desktop_settings_page.dart';
 import 'package:cake_wallet/src/screens/settings/display_settings_page.dart';
 import 'package:cake_wallet/src/screens/settings/other_settings_page.dart';
 import 'package:cake_wallet/src/screens/settings/privacy_page.dart';
@@ -32,18 +37,18 @@ import 'package:cake_wallet/src/screens/support/support_page.dart';
 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
 import 'package:cake_wallet/utils/payment_request.dart';
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
 import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
 import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
 import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
+import 'package:cake_wallet/wallet_type_utils.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/di.dart';
-import 'package:cake_wallet/utils/language_list.dart';
 import 'package:cake_wallet/view_model/wallet_new_vm.dart';
 import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart';
-import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart';
 import 'package:cake_wallet/exchange/trade.dart';
 import 'package:cw_core/transaction_info.dart';
 import 'package:cw_core/wallet_type.dart';
@@ -57,9 +62,6 @@ import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart';
 import 'package:cake_wallet/src/screens/new_wallet/new_wallet_page.dart';
 import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart';
 import 'package:cake_wallet/src/screens/restore/restore_options_page.dart';
-import 'package:cake_wallet/src/screens/restore/restore_wallet_options_page.dart';
-import 'package:cake_wallet/src/screens/restore/restore_wallet_from_seed_page.dart';
-import 'package:cake_wallet/src/screens/restore/restore_wallet_from_keys_page.dart';
 import 'package:cake_wallet/src/screens/send/send_page.dart';
 import 'package:cake_wallet/src/screens/disclaimer/disclaimer_page.dart';
 import 'package:cake_wallet/src/screens/seed_language/seed_language_page.dart';
@@ -136,14 +138,6 @@ Route<dynamic> createRoute(RouteSettings settings) {
       return CupertinoPageRoute<void>(
           builder: (_) => getIt.get<SetupPinCodePage>(param1: callback));
 
-    case Routes.moneroRestoreWalletFromWelcome:
-     return CupertinoPageRoute<void>(
-          builder: (_) => getIt.get<SetupPinCodePage>(
-              param1: (PinCodeState<PinCodeWidget> context, dynamic _) =>
-                  Navigator.pushNamed(
-                      context.context, Routes.restoreWallet, arguments: WalletType.monero)),
-          fullscreenDialog: true);
-
     case Routes.restoreWalletType:
       return CupertinoPageRoute<void>(
           builder: (_) => getIt.get<NewWalletTypePage>(
@@ -153,43 +147,39 @@ Route<dynamic> createRoute(RouteSettings settings) {
               param2: false));
 
     case Routes.restoreOptions:
+      final isNewInstall = settings.arguments as bool;
       return CupertinoPageRoute<void>(
-          builder: (_) => getIt.get<RestoreOptionsPage>());
+          builder: (_) => getIt.get<RestoreOptionsPage>(param1: isNewInstall));
 
-    case Routes.restoreWalletOptions:
-      final type = WalletType.monero; //settings.arguments as WalletType;
+    case Routes.restoreWalletFromSeedKeys:
+      final isNewInstall = settings.arguments as bool;
 
-      return CupertinoPageRoute<void>(
-          builder: (_) => RestoreWalletOptionsPage(
-              type: type,
-              onRestoreFromSeed: (context) {
-                final route = type == WalletType.monero
-                    ? Routes.seedLanguage
-                    : Routes.restoreWalletFromSeed;
-                final args = type == WalletType.monero
-                    ? [type, Routes.restoreWalletFromSeed]
-                    : [type];
+      if (isNewInstall) {
+        return CupertinoPageRoute<void>(
+            builder: (_) => getIt.get<SetupPinCodePage>(
+                param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
+                  if (isSingleCoin) {
+                    return Navigator.of(context.context)
+                        .pushNamed(Routes.restoreWallet, arguments: availableWalletTypes.first);
+                  }
 
-                Navigator.of(context).pushNamed(route, arguments: args);
-              },
-              onRestoreFromKeys: (context) {
-                final route = type == WalletType.monero
-                    ? Routes.seedLanguage
-                    : Routes.restoreWalletFromKeys;
-                final args = type == WalletType.monero
-                    ? [type, Routes.restoreWalletFromKeys]
-                    : [type];
-
-                Navigator.of(context).pushNamed(route, arguments: args);
-              }));
-
-    case Routes.restoreWalletOptionsFromWelcome:
-      return CupertinoPageRoute<void>(
-          builder: (_) => getIt.get<SetupPinCodePage>(
-              param1: (PinCodeState<PinCodeWidget> context, dynamic _) =>
-                  Navigator.pushNamed(
-                      context.context, Routes.restoreWalletType)),
-          fullscreenDialog: true);
+                  return Navigator.pushNamed(
+                        context.context, Routes.restoreWalletType);
+                }),
+            fullscreenDialog: true);
+      } else if (isSingleCoin) {
+        return MaterialPageRoute<void>(
+            builder: (_) => getIt.get<WalletRestorePage>(
+                param1: availableWalletTypes.first
+            ));
+      } else {
+        return CupertinoPageRoute<void>(
+            builder: (_) => getIt.get<NewWalletTypePage>(
+                param1: (BuildContext context, WalletType type) =>
+                    Navigator.of(context)
+                        .pushNamed(Routes.restoreWallet, arguments: type),
+                param2: false));
+      }
 
     case Routes.seed:
       return MaterialPageRoute<void>(
@@ -201,23 +191,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
           builder: (_) => getIt.get<WalletRestorePage>(
               param1: settings.arguments as WalletType));
 
-    case Routes.restoreWalletFromSeed:
-      final type = settings.arguments as WalletType;
+    case Routes.sweepingWalletPage:
       return CupertinoPageRoute<void>(
-          builder: (_) => RestoreWalletFromSeedPage(type: type));
-
-    case Routes.restoreWalletFromKeys:
-      final args = settings.arguments as List<dynamic>;
-      final type = args.first as WalletType;
-      final language =
-          type == WalletType.monero ? args[1] as String : LanguageList.english;
-
-      final walletRestorationFromKeysVM =
-          getIt.get<WalletRestorationFromKeysVM>(param1: [type, language]);
-
-      return CupertinoPageRoute<void>(
-          builder: (_) => RestoreWalletFromKeysPage(
-              walletRestorationFromKeysVM: walletRestorationFromKeysVM));
+          builder: (_) => getIt.get<SweepingWalletPage>());
 
     case Routes.dashboard:
       return CupertinoPageRoute<void>(
@@ -238,7 +214,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
 
     case Routes.receive:
       return CupertinoPageRoute<void>(
-          fullscreenDialog: true, builder: (_) => getIt.get<ReceivePage>());
+          builder: (_) => getIt.get<ReceivePage>());
 
     case Routes.addressPage:
       return CupertinoPageRoute<void>(
@@ -295,22 +271,27 @@ Route<dynamic> createRoute(RouteSettings settings) {
 
     case Routes.connectionSync:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<ConnectionSyncPage>());
 
     case Routes.securityBackupPage:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<SecurityBackupPage>());
     
      case Routes.privacyPage:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<PrivacyPage>());
 
      case Routes.displaySettingsPage:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<DisplaySettingsPage>());
 
     case Routes.otherSettingsPage:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<OtherSettingsPage>());
     
     case Routes.newNode:
@@ -336,8 +317,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
 
     case Routes.addressBook:
       return MaterialPageRoute<void>(
-          builder: (_) =>
-              getIt.get<ContactListPage>());
+          fullscreenDialog: true,
+          builder: (_) => getIt.get<ContactListPage>());
 
     case Routes.pickerAddressBook:
       final selectedCurrency = settings.arguments as CryptoCurrency?;
@@ -394,6 +375,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
 
     case Routes.exchange:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<ExchangePage>());
 
     case Routes.exchangeTemplate:
@@ -425,6 +407,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
 
     case Routes.support:
       return CupertinoPageRoute<void>(
+          fullscreenDialog: true,
           builder: (_) => getIt.get<SupportPage>());
 
     case Routes.unspentCoinsList:
@@ -440,18 +423,17 @@ Route<dynamic> createRoute(RouteSettings settings) {
                   param1: args));
 
     case Routes.fullscreenQR:
-      final args = settings.arguments as Map<String, dynamic>;
-
       return MaterialPageRoute<void>(
           builder: (_) =>
               getIt.get<FullscreenQRPage>(
-                param1: args['qrData'] as String,
-                param2: args['version'] as int?,
-                
+                param1: settings.arguments as QrViewData,
               ));
 
     case Routes.ioniaWelcomePage:
-      return CupertinoPageRoute<void>(builder: (_) => getIt.get<IoniaWelcomePage>());  
+      return CupertinoPageRoute<void>(
+        fullscreenDialog: true,
+        builder: (_) => getIt.get<IoniaWelcomePage>(),
+      );
     
     case Routes.ioniaLoginPage:
       return CupertinoPageRoute<void>( builder: (_) => getIt.get<IoniaLoginPage>());
@@ -524,19 +506,39 @@ Route<dynamic> createRoute(RouteSettings settings) {
             getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
             getIt.get<NodeCreateOrEditViewModel>(param1: type),
           ));
-    
+
     case Routes.anonPayInvoicePage:
       final args = settings.arguments as List;
       return CupertinoPageRoute<void>(builder: (_) => getIt.get<AnonPayInvoicePage>(param1: args));
-    
+
     case Routes.anonPayReceivePage:
         final anonInvoiceViewData = settings.arguments as AnonpayInfoBase;
       return CupertinoPageRoute<void>(builder: (_) => getIt.get<AnonPayReceivePage>(param1: anonInvoiceViewData));
-    
+
     case Routes.anonPayDetailsPage:
       final anonInvoiceViewData = settings.arguments as AnonpayInvoiceInfo;
       return CupertinoPageRoute<void>(builder: (_) => getIt.get<AnonpayDetailsPage>(param1: anonInvoiceViewData));
-      
+
+    case Routes.desktop_actions:
+      return PageRouteBuilder(
+        opaque: false,
+        pageBuilder: (_, __, ___) => DesktopDashboardActions(getIt<DashboardViewModel>()),
+      );
+
+    case Routes.desktop_settings_page:
+      return CupertinoPageRoute<void>(
+          builder: (_) => DesktopSettingsPage());
+
+    case Routes.empty_no_route:
+      return MaterialPageRoute<void>(
+          builder: (_) => SizedBox.shrink());
+
+    case Routes.transactionsPage:
+      return CupertinoPageRoute<void>(
+          settings: settings,
+          fullscreenDialog: true,
+          builder: (_) => getIt.get<TransactionsPage>());
+
     default:
       return MaterialPageRoute<void>(
           builder: (_) => Scaffold(
diff --git a/lib/routes.dart b/lib/routes.dart
index 99d0f438e..a0490ec28 100644
--- a/lib/routes.dart
+++ b/lib/routes.dart
@@ -3,14 +3,9 @@ class Routes {
   static const newWallet = '/new_wallet';
   static const setupPin = '/setup_pin_code';
   static const newWalletFromWelcome = '/new_wallet_from_welcome';
-  static const restoreFromWelcome = '/restore_from_welcome';
   static const seed = '/seed';
   static const restoreOptions = '/restore_options';
-  static const restoreOptionsFromWelcome = '/restore_options_from_welcome';
-  static const restoreWalletOptions = '/restore_seed_keys';
-  static const restoreWalletOptionsFromWelcome = '/restore_wallet_options_from_welcome';
-  static const restoreWalletFromSeed = '/restore_wallet_from_seed';
-  static const restoreWalletFromKeys = '/restore_wallet_from_keys';
+  static const restoreWalletFromSeedKeys = '/restore_wallet_from_seeds_keys';
   static const dashboard = '/dashboard';
   static const send = '/send';
   static const transactionDetails = '/transaction_info';
@@ -37,6 +32,8 @@ class Routes {
   static const restoreWalletFromSeedDetails = '/restore_from_seed_details';
   static const exchange = '/exchange';
   static const settings = '/settings';
+  static const desktop_settings_page = '/desktop_settings_page';
+  static const empty_no_route = '/empty_no_route';
   static const unlock = '/auth_not_closable';
   static const rescan = '/rescan';
   static const faq = '/faq';
@@ -55,8 +52,6 @@ class Routes {
   static const buyWebView = '/buy_web_view';
   static const unspentCoinsList = '/unspent_coins_list';
   static const unspentCoinsDetails = '/unspent_coins_details';
-  static const moneroRestoreWalletFromWelcome = '/monero_restore_wallet';
-  static const moneroNewWalletFromWelcome = '/monero_new_wallet';
   static const addressPage = '/address_page';
   static const fullscreenQR = '/fullscreen_qr';
   static const ioniaWelcomePage = '/cake_pay_welcome_page';
@@ -82,8 +77,11 @@ class Routes {
   static const displaySettingsPage = '/display_settings_page';
   static const otherSettingsPage = '/other_settings_page';
   static const advancedPrivacySettings = '/advanced_privacy_settings';
+  static const sweepingWalletPage = '/sweeping_wallet_page';
   static const anonPayInvoicePage = '/anon_pay_invoice_page';
   static const anonPayReceivePage = '/anon_pay_receive_page';
   static const anonPayDetailsPage = '/anon_pay_details_page';
   static const payfuraPage = '/pay_fura_page';
+  static const desktop_actions = '/desktop_actions';
+  static const transactionsPage = '/transactions_page';
 }
diff --git a/lib/src/screens/backup/backup_page.dart b/lib/src/screens/backup/backup_page.dart
index f819e88e5..966b289d1 100644
--- a/lib/src/screens/backup/backup_page.dart
+++ b/lib/src/screens/backup/backup_page.dart
@@ -1,6 +1,8 @@
 import 'dart:io';
 import 'package:cake_wallet/palette.dart';
+import 'package:cake_wallet/utils/exception_handler.dart';
 import 'package:cake_wallet/utils/share_util.dart';
+import 'package:file_picker/file_picker.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -27,8 +29,7 @@ class BackupPage extends BasePage {
   @override
   Widget trailing(BuildContext context) => TrailButton(
       caption: S.of(context).change_password,
-      onPressed: () =>
-          Navigator.of(context).pushNamed(Routes.editBackupPassword),
+      onPressed: () => Navigator.of(context).pushNamed(Routes.editBackupPassword),
       textColor: Palette.blueCraiola);
 
   @override
@@ -51,9 +52,8 @@ class BackupPage extends BasePage {
                       child: Observer(
                           builder: (_) => GestureDetector(
                                 onTap: () {
-                                  Clipboard.setData(ClipboardData(
-                                      text:
-                                          backupViewModelBase.backupPassword));
+                                  Clipboard.setData(
+                                      ClipboardData(text: backupViewModelBase.backupPassword));
                                   showBar<void>(
                                       context,
                                       S.of(context).transaction_details_copied(
@@ -108,8 +108,10 @@ class BackupPage extends BasePage {
 
                 if (Platform.isAndroid) {
                   onExportAndroid(context, backup);
-                } else {
+                } else if (Platform.isIOS) {
                   await share(backup, context);
+                } else {
+                  await _saveFile(backup);
                 }
               },
               actionLeftButton: () => Navigator.of(dialogContext).pop());
@@ -133,8 +135,7 @@ class BackupPage extends BasePage {
                   return;
                 }
 
-                await backupViewModelBase.saveToDownload(
-                    backup.name, backup.content);
+                await backupViewModelBase.saveToDownload(backup.name, backup.content);
                 Navigator.of(dialogContext).pop();
               },
               actionLeftButton: () async {
@@ -149,4 +150,20 @@ class BackupPage extends BasePage {
     await ShareUtil.shareFile(filePath: path, fileName: backup.name, context: context);
     await backupViewModelBase.removeBackupFileLocally(backup);
   }
+
+  Future<void> _saveFile(BackupExportFile backup) async {
+    String? outputFile = await FilePicker.platform
+        .saveFile(dialogTitle: 'Save Your File to desired location', fileName: backup.name);
+
+    try {
+      File returnedFile = File(outputFile!);
+      await returnedFile.writeAsBytes(backup.content);
+    } catch (exception, stackTrace) {
+      ExceptionHandler.onError(FlutterErrorDetails(
+        exception: exception,
+        stack: stackTrace,
+        library: "Export Backup",
+      ));
+    }
+  }
 }
diff --git a/lib/src/screens/backup/edit_backup_password_page.dart b/lib/src/screens/backup/edit_backup_password_page.dart
index 47ae77c0e..f1ddaf4e1 100644
--- a/lib/src/screens/backup/edit_backup_password_page.dart
+++ b/lib/src/screens/backup/edit_backup_password_page.dart
@@ -66,7 +66,8 @@ class EditBackupPasswordPage extends BasePage {
               leftButtonText: S.of(context).cancel,
               actionRightButton: () async {
                 await editBackupPasswordViewModel.save();
-                Navigator.of(dialogContext)..pop()..pop();
+                Navigator.of(dialogContext).pop();
+                Navigator.of(context).pop();
               },
               actionLeftButton: () => Navigator.of(dialogContext).pop());
         });
diff --git a/lib/src/screens/base_page.dart b/lib/src/screens/base_page.dart
index 92bf56eaf..51f8c1ad2 100644
--- a/lib/src/screens/base_page.dart
+++ b/lib/src/screens/base_page.dart
@@ -20,8 +20,6 @@ abstract class BasePage extends StatelessWidget {
 
   String? get title => null;
 
-  bool get isModalBackButton => false;
-
   Color get backgroundLightColor => Colors.white;
 
   Color get backgroundDarkColor => PaletteDark.backgroundColor;
@@ -50,23 +48,27 @@ abstract class BasePage extends StatelessWidget {
     }
 
     final _backButton = Icon(Icons.arrow_back_ios,
-      color: titleColor ?? Theme.of(context).primaryTextTheme!.headline6!.color!,
+      color: titleColor ?? Theme.of(context).primaryTextTheme.headline6!.color!,
       size: 16,);
-    final _closeButton = currentTheme.type == ThemeType.dark
-        ? closeButtonImageDarkTheme : closeButtonImage;
 
-    return SizedBox(
-      height: 37,
-      width: 37,
-      child: ButtonTheme(
-        minWidth: double.minPositive,
-        child: TextButton(
-            // FIX-ME: Style
-            //highlightColor: Colors.transparent,
-            //splashColor: Colors.transparent,
-            //padding: EdgeInsets.all(0),
-            onPressed: () => onClose(context),
-            child: isModalBackButton ? _closeButton : _backButton),
+    return MergeSemantics(
+      child: SizedBox(
+        height: 37,
+        width: 37,
+        child: ButtonTheme(
+          minWidth: double.minPositive,
+          child: Semantics(
+            label: 'Back',
+            child: TextButton(
+              style: ButtonStyle(
+                overlayColor: MaterialStateColor.resolveWith(
+                    (states) => Colors.transparent),
+              ),
+              onPressed: () => onClose(context),
+              child: _backButton,
+            ),
+          ),
+        ),
       ),
     );
   }
@@ -92,7 +94,7 @@ abstract class BasePage extends StatelessWidget {
   ObstructingPreferredSizeWidget appBar(BuildContext context) {
     final appBarColor = currentTheme.type == ThemeType.dark
         ? backgroundDarkColor : backgroundLightColor;
-
+  
     switch (appBarStyle) {
       case AppBarStyle.regular:
         // FIX-ME: NavBar no context
diff --git a/lib/src/screens/buy/onramper_page.dart b/lib/src/screens/buy/onramper_page.dart
index 4973cef0b..cbdf9e1b1 100644
--- a/lib/src/screens/buy/onramper_page.dart
+++ b/lib/src/screens/buy/onramper_page.dart
@@ -1,60 +1,30 @@
+import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
-import 'package:cake_wallet/store/settings_store.dart';
-import 'package:cw_core/wallet_base.dart';
 import 'package:flutter/material.dart';
-import 'package:cake_wallet/.secrets.g.dart' as secrets;
 import 'package:flutter_inappwebview/flutter_inappwebview.dart';
 import 'package:permission_handler/permission_handler.dart';
 
 class OnRamperPage extends BasePage {
-  OnRamperPage({required this.settingsStore, required this.wallet});
+  OnRamperPage(this._onRamperBuyProvider);
 
-  final SettingsStore settingsStore;
-  final WalletBase wallet;
+  final OnRamperBuyProvider _onRamperBuyProvider;
 
   @override
   String get title => S.current.buy;
 
   @override
   Widget body(BuildContext context) {
-    final darkMode = Theme.of(context).brightness == Brightness.dark;
-    return OnRamperPageBody(
-        settingsStore: settingsStore,
-        wallet: wallet,
-        darkMode: darkMode,
-        backgroundColor: darkMode ? backgroundDarkColor : backgroundLightColor,
-        supportSell: false,
-        supportSwap: false);
+    return OnRamperPageBody(_onRamperBuyProvider);
   }
 }
 
 class OnRamperPageBody extends StatefulWidget {
-  OnRamperPageBody(
-      {required this.settingsStore,
-      required this.wallet,
-      required this.darkMode,
-      required this.supportSell,
-      required this.supportSwap,
-      required this.backgroundColor});
+  OnRamperPageBody(this.onRamperBuyProvider);
 
-  static const baseUrl = 'widget.onramper.com';
-  final SettingsStore settingsStore;
-  final WalletBase wallet;
-  final Color backgroundColor;
-  final bool darkMode;
-  final bool supportSell;
-  final bool supportSwap;
+  final OnRamperBuyProvider onRamperBuyProvider;
 
-  Uri get uri => Uri.https(baseUrl, '', <String, dynamic>{
-        'apiKey': secrets.onramperApiKey,
-        'defaultCrypto': wallet.currency.title,
-        'defaultFiat': settingsStore.fiatCurrency.title,
-        'wallets': '${wallet.currency.title}:${wallet.walletAddresses.address}',
-        'darkMode': darkMode.toString(),
-        'supportSell': supportSell.toString(),
-        'supportSwap': supportSwap.toString()
-      });
+  Uri get uri => onRamperBuyProvider.requestUrl();
 
   @override
   OnRamperPageBodyState createState() => OnRamperPageBodyState();
diff --git a/lib/src/screens/buy/payfura_page.dart b/lib/src/screens/buy/payfura_page.dart
index 4bada4a9e..a974aec25 100644
--- a/lib/src/screens/buy/payfura_page.dart
+++ b/lib/src/screens/buy/payfura_page.dart
@@ -1,45 +1,30 @@
+import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
-import 'package:cake_wallet/store/settings_store.dart';
-import 'package:cw_core/wallet_base.dart';
 import 'package:flutter/material.dart';
-import 'package:cake_wallet/.secrets.g.dart' as secrets;
 import 'package:flutter_inappwebview/flutter_inappwebview.dart';
 import 'package:permission_handler/permission_handler.dart';
 
 class PayFuraPage extends BasePage {
-  PayFuraPage({required this.settingsStore, required this.wallet});
+  PayFuraPage(this._PayfuraBuyProvider);
 
-  final SettingsStore settingsStore;
-  final WalletBase wallet;
+  final PayfuraBuyProvider _PayfuraBuyProvider;
 
   @override
   String get title => S.current.buy;
 
   @override
   Widget body(BuildContext context) {
-    return PayFuraPageBody(
-        settingsStore: settingsStore,
-        wallet: wallet);
+    return PayFuraPageBody(_PayfuraBuyProvider);
   }
 }
 
 class PayFuraPageBody extends StatefulWidget {
-  PayFuraPageBody(
-      {required this.settingsStore,
-        required this.wallet});
+  PayFuraPageBody(this._PayfuraBuyProvider);
 
-  static const baseUrl = 'exchange.payfura.com';
-  final SettingsStore settingsStore;
-  final WalletBase wallet;
+  final PayfuraBuyProvider _PayfuraBuyProvider;
 
-  Uri get uri => Uri.https(baseUrl, '', <String, dynamic>{
-    'apiKey': secrets.payfuraApiKey,
-    'to': wallet.currency.title,
-    'from': settingsStore.fiatCurrency.title,
-    'walletAddress': '${wallet.currency.title}:${wallet.walletAddresses.address}',
-    'mode': 'buy'
-  });
+  Uri get uri => _PayfuraBuyProvider.requestUrl();
 
   @override
   PayFuraPageBodyState createState() => PayFuraPageBodyState();
diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart
index 0065b9281..96887ff5f 100644
--- a/lib/src/screens/contact/contact_list_page.dart
+++ b/lib/src/screens/contact/contact_list_page.dart
@@ -24,10 +24,6 @@ class ContactListPage extends BasePage {
 
   @override
   Widget? trailing(BuildContext context) {
-    if (!contactListViewModel.isEditable) {
-      return null;
-    }
-
     return Container(
         width: 32.0,
         height: 32.0,
@@ -124,6 +120,7 @@ class ContactListPage extends BasePage {
         if (isCopied) {
           await Clipboard.setData(ClipboardData(text: contact.address));
           await showBar<void>(context, S.of(context).copied_to_clipboard);
+         
         }
       },
       child: Container(
diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart
index b0df7f36c..a76b93fc0 100644
--- a/lib/src/screens/dashboard/dashboard_page.dart
+++ b/lib/src/screens/dashboard/dashboard_page.dart
@@ -1,12 +1,17 @@
 import 'dart:async';
+import 'package:cake_wallet/entities/preferences_key.dart';
+import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/entities/main_actions.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
 import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart';
+import 'package:cake_wallet/utils/version_comparator.dart';
 import 'package:cake_wallet/wallet_type_utils.dart';
-import 'package:cw_core/wallet_type.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
@@ -19,19 +24,47 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
 import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:mobx/mobx.dart';
+import 'package:shared_preferences/shared_preferences.dart';
 import 'package:smooth_page_indicator/smooth_page_indicator.dart';
 import 'package:cake_wallet/main.dart';
 import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart';
 import 'package:url_launcher/url_launcher.dart';
+import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
 
-class DashboardPage extends BasePage {
+class DashboardPage extends StatelessWidget {
   DashboardPage({
     required this.balancePage,
-    required this.walletViewModel,
+    required this.dashboardViewModel,
     required this.addressListViewModel,
   });
+
   final BalancePage balancePage;
-  
+  final DashboardViewModel dashboardViewModel;
+  final WalletAddressListViewModel addressListViewModel;
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      body: ResponsiveLayoutUtil.instance.isMobile(context)
+          ? _DashboardPageView(
+              balancePage: balancePage,
+              dashboardViewModel: dashboardViewModel,
+              addressListViewModel: addressListViewModel,
+            )
+          : getIt.get<DesktopSidebarWrapper>(),
+    );
+  }
+}
+
+class _DashboardPageView extends BasePage {
+  _DashboardPageView({
+    required this.balancePage,
+    required this.dashboardViewModel,
+    required this.addressListViewModel,
+  });
+
+  final BalancePage balancePage;
+
   @override
   Color get backgroundLightColor =>
       currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
@@ -54,19 +87,19 @@ class DashboardPage extends BasePage {
   bool get resizeToAvoidBottomInset => false;
 
   @override
-  Widget get endDrawer => MenuWidget(walletViewModel);
+  Widget get endDrawer => MenuWidget(dashboardViewModel);
 
   @override
   Widget middle(BuildContext context) {
-    return SyncIndicator(dashboardViewModel: walletViewModel,
-        onTap: () => Navigator.of(context, rootNavigator: true)
-            .pushNamed(Routes.connectionSync));
+    return SyncIndicator(
+        dashboardViewModel: dashboardViewModel,
+        onTap: () => Navigator.of(context, rootNavigator: true).pushNamed(Routes.connectionSync));
   }
 
   @override
   Widget trailing(BuildContext context) {
     final menuButton = Image.asset('assets/images/menu.png',
-        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!);
+        color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!);
 
     return Container(
         alignment: Alignment.centerRight,
@@ -77,154 +110,151 @@ class DashboardPage extends BasePage {
             //splashColor: Colors.transparent,
             //padding: EdgeInsets.all(0),
             onPressed: () => onOpenEndDrawer(),
-            child: menuButton));
+            child: Semantics(label: 'Menu', child: menuButton)));
   }
 
-  final DashboardViewModel walletViewModel;
+  final DashboardViewModel dashboardViewModel;
   final WalletAddressListViewModel addressListViewModel;
-  final controller = PageController(initialPage: 1);
-
-  var pages = <Widget>[];
+  int get initialPage => dashboardViewModel.shouldShowMarketPlaceInDashboard ? 1 : 0;
+  ObservableList<Widget> pages = ObservableList<Widget>();
   bool _isEffectsInstalled = false;
   StreamSubscription<bool>? _onInactiveSub;
 
   @override
   Widget body(BuildContext context) {
-    final sendImage = Image.asset('assets/images/upload.png',
-        height: 24,
-        width: 24,
-        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!);
-    final receiveImage = Image.asset('assets/images/received.png',
-        height: 24,
-        width: 24,
-        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!);
+    final controller = PageController(initialPage: initialPage);
+
+    reaction((_) => dashboardViewModel.shouldShowMarketPlaceInDashboard, (bool value) {
+      if (!dashboardViewModel.shouldShowMarketPlaceInDashboard) {
+        controller.jumpToPage(0);
+      }
+      pages.clear();
+      _isEffectsInstalled = false;
+      _setEffects(context);
+
+      if (value) {
+        controller.jumpToPage(1);
+      } else {
+        controller.jumpToPage(0);
+      }
+    });
     _setEffects(context);
 
     return SafeArea(
-      minimum: EdgeInsets.only(bottom: 24),
+        minimum: EdgeInsets.only(bottom: 24),
         child: Column(
-      mainAxisSize: MainAxisSize.max,
-      children: <Widget>[
-        Expanded(
-            child: PageView.builder(
-                controller: controller,
-                itemCount: pages.length,
-                itemBuilder: (context, index) => pages[index])),
-        Padding(
-            padding: EdgeInsets.only(bottom: 24, top: 10),
-            child: SmoothPageIndicator(
-              controller: controller,
-              count: pages.length,
-              effect: ColorTransitionEffect(
-                  spacing: 6.0,
-                  radius: 6.0,
-                  dotWidth: 6.0,
-                  dotHeight: 6.0,
-                  dotColor: Theme.of(context).indicatorColor,
-                  activeDotColor: Theme.of(context)
-                      .accentTextTheme!
-                      .headline4!
-                      .backgroundColor!),
-            )),
-        Observer(builder: (_) {
-          return ClipRect(
-            child:Container(
-             margin: const EdgeInsets.only(left: 16, right: 16),
-            child: Container(
-              decoration: BoxDecoration(
-                    borderRadius: BorderRadius.circular(50.0),
-                    border: Border.all(color: currentTheme.type == ThemeType.bright ? Color.fromRGBO(255, 255, 255, 0.2): Colors.transparent, width: 1, ),
-                    color:Theme.of(context).textTheme!.headline6!.backgroundColor!),
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            Expanded(
+                child: Observer(builder: (context) {
+              return PageView.builder(
+                  controller: controller,
+                  itemCount: pages.length,
+                  itemBuilder: (context, index) => pages[index]);
+            })),
+            Padding(
+                padding: EdgeInsets.only(bottom: 24, top: 10),
+                child: Observer(builder: (context) {
+                  return ExcludeSemantics(
+                    child: SmoothPageIndicator(
+                      controller: controller,
+                      count: pages.length,
+                      effect: ColorTransitionEffect(
+                          spacing: 6.0,
+                          radius: 6.0,
+                          dotWidth: 6.0,
+                          dotHeight: 6.0,
+                          dotColor: Theme.of(context).indicatorColor,
+                          activeDotColor: Theme.of(context)
+                              .accentTextTheme!
+                              .headline4!
+                              .backgroundColor!),
+                    ),
+                  );
+                }
+                )),
+            Observer(builder: (_) {
+              return ClipRect(
                 child: Container(
-                  padding: EdgeInsets.only(left: 32, right: 32),
-                  child: Row(
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                children: <Widget>[
-                  if (walletViewModel.hasBuyAction)
-                    ActionButton(
-                      image: Image.asset('assets/images/buy.png',
-                        height: 24,
-                        width: 24,
-                        color: !walletViewModel.isEnabledBuyAction
-                          ? Theme.of(context)
-                              .accentTextTheme!
-                              .headline3!
-                              .backgroundColor!
-                          : Theme.of(context).accentTextTheme!.headline2!.backgroundColor!),
-                      title: S.of(context).buy,
-                      onClick: () async => await _onClickBuyButton(context),
-                      textColor: !walletViewModel.isEnabledBuyAction
-                        ? Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
-                          .backgroundColor!
-                        : null),  
-                  ActionButton(
-                      image: receiveImage,
-                      title: S.of(context).receive,
-                      route: Routes.addressPage),
-                  if (walletViewModel.hasExchangeAction)
-                    ActionButton(
-                      image:  Image.asset('assets/images/transfer.png',
-                        height: 24,
-                        width: 24,
-                        color: !walletViewModel.isEnabledExchangeAction
-                          ? Theme.of(context)
-                              .accentTextTheme!
-                              .headline3!
-                              .backgroundColor!
-                          : Theme.of(context).accentTextTheme!.headline2!.backgroundColor!),
-                      title: S.of(context).exchange,
-                      onClick: () async => _onClickExchangeButton(context),
-                      textColor: !walletViewModel.isEnabledExchangeAction
-                        ? Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
-                          .backgroundColor!
-                        : null),
-                  ActionButton(
-                      image: sendImage,
-                      title: S.of(context).send,
-                      route: Routes.send),
-                  if (walletViewModel.hasSellAction)
-                    ActionButton(
-                      image: Image.asset('assets/images/sell.png',
-                        height: 24,
-                        width: 24,
-                        color: !walletViewModel.isEnabledSellAction
-                          ? Theme.of(context)
-                              .accentTextTheme!
-                              .headline3!
-                              .backgroundColor!
-                          : Theme.of(context).accentTextTheme!.headline2!.backgroundColor!),
-                      title: S.of(context).sell,
-                      onClick: () async => await _onClickSellButton(context),
-                      textColor: !walletViewModel.isEnabledSellAction
-                        ? Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
-                          .backgroundColor!
-                        : null),
-                ],
-              ),),
-            ),),);
-          }),
-       
-      ],
-    ));
+                  margin: const EdgeInsets.only(left: 16, right: 16),
+                  child: Container(
+                    decoration: BoxDecoration(
+                      borderRadius: BorderRadius.circular(50.0),
+                      border: Border.all(
+                        color: currentTheme.type == ThemeType.bright
+                            ? Color.fromRGBO(255, 255, 255, 0.2)
+                            : Colors.transparent,
+                        width: 1,
+                      ),
+                      color: Theme.of(context).textTheme.headline6!.backgroundColor!,
+                    ),
+                    child: Container(
+                      padding: EdgeInsets.only(left: 32, right: 32),
+                      child: Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: MainActions.all
+                            .where((element) => element.canShow?.call(dashboardViewModel) ?? true)
+                            .map((action) => Semantics(
+                                  button: true,
+                                  enabled: (action.isEnabled
+                                          ?.call(dashboardViewModel) ??
+                                      true),
+                                  child: ActionButton(
+                                    image: Image.asset(action.image,
+                                        height: 24,
+                                        width: 24,
+                                        color: action.isEnabled?.call(
+                                                    dashboardViewModel) ??
+                                                true
+                                            ? Theme.of(context)
+                                                .accentTextTheme
+                                                .headline2!
+                                                .backgroundColor!
+                                            : Theme.of(context)
+                                                .accentTextTheme
+                                                .headline3!
+                                                .backgroundColor!),
+                                    title: action.name(context),
+                                    onClick: () async => await action.onTap(
+                                        context, dashboardViewModel),
+                                    textColor: action.isEnabled
+                                                ?.call(dashboardViewModel) ??
+                                            true
+                                        ? null
+                                        : Theme.of(context)
+                                            .accentTextTheme
+                                            .headline3!
+                                            .backgroundColor!,
+                                  ),
+                                ))
+                            .toList(),
+                      ),
+                    ),
+                  ),
+                ),
+              );
+            }),
+          ],
+        ));
   }
 
   void _setEffects(BuildContext context) async {
     if (_isEffectsInstalled) {
       return;
     }
-    pages.add(MarketPlacePage(dashboardViewModel: walletViewModel));
-    pages.add(balancePage);
-    pages.add(TransactionsPage(dashboardViewModel: walletViewModel));
+    if (dashboardViewModel.shouldShowMarketPlaceInDashboard) {
+      pages.add(Semantics(
+          label: 'Marketplace Page',
+          child: MarketPlacePage(dashboardViewModel: dashboardViewModel)));
+    }
+    pages.add(Semantics(label: 'Balance Page', child: balancePage));
+    pages.add(Semantics(
+        label: 'Transactions Page',
+        child: TransactionsPage(dashboardViewModel: dashboardViewModel)));
     _isEffectsInstalled = true;
 
     autorun((_) async {
-      if (!walletViewModel.isOutdatedElectrumWallet) {
+      if (!dashboardViewModel.isOutdatedElectrumWallet) {
         return;
       }
 
@@ -235,14 +265,32 @@ class DashboardPage extends BasePage {
           builder: (BuildContext context) {
             return AlertWithOneAction(
                 alertTitle: S.of(context).pre_seed_title,
-                alertContent:
-                    S.of(context).outdated_electrum_wallet_description,
+                alertContent: S.of(context).outdated_electrum_wallet_description,
                 buttonText: S.of(context).understand,
                 buttonAction: () => Navigator.of(context).pop());
           });
       }
     });
 
+    final sharedPrefs = await SharedPreferences.getInstance();
+    final currentAppVersion =
+        VersionComparator.getExtendedVersionNumber(dashboardViewModel.settingsStore.appVersion);
+    final lastSeenAppVersion = sharedPrefs.getInt(PreferencesKey.lastSeenAppVersion);
+    final isNewInstall = sharedPrefs.getBool(PreferencesKey.isNewInstall);
+
+    if (currentAppVersion != lastSeenAppVersion && !isNewInstall!) {
+      await Future<void>.delayed(Duration(seconds: 1));
+      await showPopUp<void>(
+          context: context,
+          builder: (BuildContext context) {
+            return ReleaseNotesScreen(
+                title: 'Version ${dashboardViewModel.settingsStore.appVersion}');
+          });
+      sharedPrefs.setInt(PreferencesKey.lastSeenAppVersion, currentAppVersion);
+    } else if (isNewInstall!) {
+      sharedPrefs.setInt(PreferencesKey.lastSeenAppVersion, currentAppVersion);
+    }
+
     var needToPresentYat = false;
     var isInactive = false;
 
@@ -253,13 +301,13 @@ class DashboardPage extends BasePage {
         Future<void>.delayed(Duration(milliseconds: 500)).then((_) {
           showPopUp<void>(
               context: navigatorKey.currentContext!,
-              builder: (_) => YatEmojiId(walletViewModel.yatStore.emoji));
+              builder: (_) => YatEmojiId(dashboardViewModel.yatStore.emoji));
           needToPresentYat = false;
         });
       }
     });
 
-    walletViewModel.yatStore.emojiIncommingStream.listen((String emoji) {
+    dashboardViewModel.yatStore.emojiIncommingStream.listen((String emoji) {
       if (!_isEffectsInstalled || emoji.isEmpty) {
         return;
       }
@@ -267,62 +315,4 @@ class DashboardPage extends BasePage {
       needToPresentYat = true;
     });
   }
-
-  Future<void> _onClickBuyButton(BuildContext context) async {
-    final walletType = walletViewModel.type;
-
-    switch (walletType) {
-      case WalletType.bitcoin:
-        Navigator.of(context).pushNamed(Routes.onramperPage);
-        break;
-      case WalletType.litecoin:
-        Navigator.of(context).pushNamed(Routes.onramperPage);
-        break;
-      case WalletType.monero:
-        Navigator.of(context).pushNamed(Routes.payfuraPage);
-        break;
-      default:
-        await showPopUp<void>(
-            context: context,
-            builder: (BuildContext context) {
-              return AlertWithOneAction(
-                  alertTitle: S.of(context).buy,
-                  alertContent: S.of(context).buy_alert_content,
-                  buttonText: S.of(context).ok,
-                  buttonAction: () => Navigator.of(context).pop());
-            });
-    }
-  }
-
-  Future<void> _onClickSellButton(BuildContext context) async {
-    final walletType = walletViewModel.type;
-
-    switch (walletType) {
-      case WalletType.bitcoin:
-        final moonPaySellProvider = MoonPaySellProvider();
-        final uri = await moonPaySellProvider.requestUrl(
-            currency: walletViewModel.wallet.currency,
-            refundWalletAddress:
-                walletViewModel.wallet.walletAddresses.address);
-        await launch(uri);
-        break;
-      default:
-        await showPopUp<void>(
-            context: context,
-            builder: (BuildContext context) {
-              return AlertWithOneAction(
-                  alertTitle: S.of(context).sell,
-                  alertContent: isMoneroOnly ? S.of(context).sell_monero_com_alert_content
-                      : S.of(context).sell_alert_content,
-                  buttonText: S.of(context).ok,
-                  buttonAction: () => Navigator.of(context).pop());
-            });
-    }
-  }
-
-  Future<void> _onClickExchangeButton(BuildContext context) async {
-    if (walletViewModel.isEnabledExchangeAction) {
-      await Navigator.of(context).pushNamed(Routes.exchange);
-    }
-  }
 }
diff --git a/lib/src/screens/dashboard/desktop_dashboard_page.dart b/lib/src/screens/dashboard/desktop_dashboard_page.dart
new file mode 100644
index 000000000..df74a3f6f
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_dashboard_page.dart
@@ -0,0 +1,134 @@
+import 'dart:async';
+import 'package:cake_wallet/entities/preferences_key.dart';
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
+import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
+import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
+import 'package:cake_wallet/utils/show_pop_up.dart';
+import 'package:cake_wallet/utils/version_comparator.dart';
+import 'package:flutter/material.dart';
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:cake_wallet/src/screens/dashboard/widgets/balance_page.dart';
+import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
+import 'package:mobx/mobx.dart';
+import 'package:cake_wallet/main.dart';
+import 'package:cake_wallet/router.dart' as Router;
+import 'package:shared_preferences/shared_preferences.dart';
+
+class DesktopDashboardPage extends StatelessWidget {
+  DesktopDashboardPage({
+    required this.balancePage,
+    required this.dashboardViewModel,
+    required this.addressListViewModel,
+    required this.desktopKey,
+  });
+
+  final BalancePage balancePage;
+  final DashboardViewModel dashboardViewModel;
+  final WalletAddressListViewModel addressListViewModel;
+  final GlobalKey<NavigatorState> desktopKey;
+
+  bool _isEffectsInstalled = false;
+  StreamSubscription<bool>? _onInactiveSub;
+
+  @override
+  Widget build(BuildContext context) {
+    _setEffects(context);
+
+    return Container(
+      color: Theme.of(context).backgroundColor,
+      child: Row(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Container(
+            width: 400,
+            child: balancePage,
+          ),
+          Flexible(
+            child: ConstrainedBox(
+              constraints: BoxConstraints(maxWidth: 500),
+              child: Navigator(
+                key: desktopKey,
+                initialRoute: Routes.desktop_actions,
+                onGenerateRoute: (settings) => Router.createRoute(settings),
+                onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
+                  return [
+                    navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
+                  ];
+                },
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+
+  void _setEffects(BuildContext context) async {
+    if (_isEffectsInstalled) {
+      return;
+    }
+    _isEffectsInstalled = true;
+
+    autorun((_) async {
+      if (!dashboardViewModel.isOutdatedElectrumWallet) {
+        return;
+      }
+
+      await Future<void>.delayed(Duration(seconds: 1));
+      await showPopUp<void>(
+          context: context,
+          builder: (BuildContext context) {
+            return AlertWithOneAction(
+                alertTitle: S.of(context).pre_seed_title,
+                alertContent: S.of(context).outdated_electrum_wallet_description,
+                buttonText: S.of(context).understand,
+                buttonAction: () => Navigator.of(context).pop());
+          });
+    });
+
+    var needToPresentYat = false;
+    var isInactive = false;
+
+    _onInactiveSub = rootKey.currentState!.isInactive.listen((inactive) {
+      isInactive = inactive;
+
+      if (needToPresentYat) {
+        Future<void>.delayed(Duration(milliseconds: 500)).then((_) {
+          showPopUp<void>(
+              context: navigatorKey.currentContext!,
+              builder: (_) => YatEmojiId(dashboardViewModel.yatStore.emoji));
+          needToPresentYat = false;
+        });
+      }
+    });
+
+    dashboardViewModel.yatStore.emojiIncommingStream.listen((String emoji) {
+      if (!_isEffectsInstalled || emoji.isEmpty) {
+        return;
+      }
+
+      needToPresentYat = true;
+    });
+
+    final sharedPrefs = await SharedPreferences.getInstance();
+    final currentAppVersion =
+        VersionComparator.getExtendedVersionNumber(dashboardViewModel.settingsStore.appVersion);
+    final lastSeenAppVersion = sharedPrefs.getInt(PreferencesKey.lastSeenAppVersion);
+    final isNewInstall = sharedPrefs.getBool(PreferencesKey.isNewInstall);
+
+    if (currentAppVersion != lastSeenAppVersion && !isNewInstall!) {
+      await Future<void>.delayed(Duration(seconds: 1));
+      await showPopUp<void>(
+          context: context,
+          builder: (BuildContext context) {
+            return ReleaseNotesScreen(
+                title: 'Version ${dashboardViewModel.settingsStore.appVersion}');
+          });
+      sharedPrefs.setInt(PreferencesKey.lastSeenAppVersion, currentAppVersion);
+    } else if (isNewInstall!) {
+      sharedPrefs.setInt(PreferencesKey.lastSeenAppVersion, currentAppVersion);
+    }
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_action_button.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_action_button.dart
new file mode 100644
index 000000000..0e3588a17
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_action_button.dart
@@ -0,0 +1,69 @@
+import 'package:auto_size_text/auto_size_text.dart';
+import 'package:flutter/material.dart';
+
+class DesktopActionButton extends StatelessWidget {
+  final String image;
+  final String title;
+  final bool canShow;
+  final bool isEnabled;
+  final Function() onTap;
+
+  const DesktopActionButton({
+    Key? key,
+    required this.title,
+    required this.image,
+    required this.onTap,
+    bool? canShow,
+    bool? isEnabled,
+  })  : this.isEnabled = isEnabled ?? true,
+        this.canShow = canShow ?? true,
+        super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Padding(
+      padding: const EdgeInsets.fromLTRB(8, 0, 8, 8),
+      child: GestureDetector(
+        onTap: onTap,
+        child: Container(
+          padding: EdgeInsets.symmetric(vertical: 25),
+          width: double.infinity,
+          decoration: BoxDecoration(
+            borderRadius: BorderRadius.circular(15.0),
+            color: Theme.of(context).textTheme.headline6!.backgroundColor!,
+          ),
+          child: Center(
+            child: Row(
+              mainAxisSize: MainAxisSize.min,
+              children: [
+                Image.asset(
+                  image,
+                  height: 30,
+                  width: 30,
+                  color: isEnabled
+                      ? Theme.of(context).accentTextTheme.headline2!.backgroundColor!
+                      : Theme.of(context).accentTextTheme.headline3!.backgroundColor!,
+                ),
+                const SizedBox(width: 10),
+                AutoSizeText(
+                  title,
+                  style: TextStyle(
+                    fontSize: 24,
+                    fontFamily: 'Lato',
+                    fontWeight: FontWeight.bold,
+                    color: isEnabled
+                        ? Theme.of(context).accentTextTheme.headline2!.backgroundColor!
+                        : null,
+                    height: 1,
+                  ),
+                  maxLines: 1,
+                  textAlign: TextAlign.center,
+                )
+              ],
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart
new file mode 100644
index 000000000..e5fa42390
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart
@@ -0,0 +1,80 @@
+import 'package:cake_wallet/entities/main_actions.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_action_button.dart';
+import 'package:cake_wallet/src/screens/dashboard/widgets/market_place_page.dart';
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_mobx/flutter_mobx.dart';
+
+class DesktopDashboardActions extends StatelessWidget {
+  final DashboardViewModel dashboardViewModel;
+
+  const DesktopDashboardActions(this.dashboardViewModel, {Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Observer(
+      builder: (_) {
+        return Column(
+          children: [
+            const SizedBox(height: 16),
+            DesktopActionButton(
+              title: MainActions.exchangeAction.name(context),
+              image: MainActions.exchangeAction.image,
+              canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel),
+              isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel),
+              onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel),
+            ),
+            Row(
+              children: [
+                Expanded(
+                  child: DesktopActionButton(
+                    title: MainActions.receiveAction.name(context),
+                    image: MainActions.receiveAction.image,
+                    canShow: MainActions.receiveAction.canShow?.call(dashboardViewModel),
+                    isEnabled: MainActions.receiveAction.isEnabled?.call(dashboardViewModel),
+                    onTap: () async =>
+                        await MainActions.receiveAction.onTap(context, dashboardViewModel),
+                  ),
+                ),
+                Expanded(
+                  child: DesktopActionButton(
+                    title: MainActions.sendAction.name(context),
+                    image: MainActions.sendAction.image,
+                    canShow: MainActions.sendAction.canShow?.call(dashboardViewModel),
+                    isEnabled: MainActions.sendAction.isEnabled?.call(dashboardViewModel),
+                    onTap: () async => await MainActions.sendAction.onTap(context, dashboardViewModel),
+                  ),
+                ),
+              ],
+            ),
+            Row(
+              children: [
+                Expanded(
+                  child: DesktopActionButton(
+                    title: MainActions.buyAction.name(context),
+                    image: MainActions.buyAction.image,
+                    canShow: MainActions.buyAction.canShow?.call(dashboardViewModel),
+                    isEnabled: MainActions.buyAction.isEnabled?.call(dashboardViewModel),
+                    onTap: () async => await MainActions.buyAction.onTap(context, dashboardViewModel),
+                  ),
+                ),
+                Expanded(
+                  child: DesktopActionButton(
+                    title: MainActions.sellAction.name(context),
+                    image: MainActions.sellAction.image,
+                    canShow: MainActions.sellAction.canShow?.call(dashboardViewModel),
+                    isEnabled: MainActions.sellAction.isEnabled?.call(dashboardViewModel),
+                    onTap: () async => await MainActions.sellAction.onTap(context, dashboardViewModel),
+                  ),
+                ),
+              ],
+            ),
+            Expanded(
+              child: MarketPlacePage(dashboardViewModel: dashboardViewModel),
+            ),
+          ],
+        );
+      }
+    );
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_navbar.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_navbar.dart
new file mode 100644
index 000000000..b97def132
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_navbar.dart
@@ -0,0 +1,48 @@
+import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/store/settings_store.dart';
+import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class DesktopDashboardNavbar extends StatelessWidget implements ObstructingPreferredSizeWidget {
+  final Widget leading;
+  final Widget middle;
+  final Widget trailing;
+
+  DesktopDashboardNavbar({
+    super.key,
+    required this.leading,
+    required this.middle,
+    required this.trailing,
+  });
+
+  ThemeBase get currentTheme => getIt.get<SettingsStore>().currentTheme;
+
+  @override
+  Widget build(BuildContext context) {
+    final appBarColor =
+        currentTheme.type == ThemeType.dark ? Colors.black.withOpacity(0.1) : Colors.white;
+
+    return Container(
+      padding: const EdgeInsetsDirectional.only(end: 24),
+      color: appBarColor,
+      child: Center(
+        child: Row(
+          mainAxisSize: MainAxisSize.max,
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            Flexible(child: leading),
+            middle,
+            trailing,
+          ],
+        ),
+      ),
+    );
+  }
+
+  @override
+  Size get preferredSize => Size.fromHeight(60);
+  
+  @override
+  bool shouldFullyObstruct(BuildContext context) => false;
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu.dart
new file mode 100644
index 000000000..bc7c0af84
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu.dart
@@ -0,0 +1,32 @@
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
+import 'package:flutter/material.dart';
+
+class SideMenu extends StatelessWidget {
+  const SideMenu({
+    super.key,
+    required this.topItems,
+    required this.bottomItems,
+    required this.width,
+  });
+  
+  final List<SideMenuItem> topItems;
+  final List<SideMenuItem> bottomItems;
+  final double width;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      color: Colors.black.withOpacity(0.1),
+      width: width,
+      height: MediaQuery.of(context).size.height,
+      child: Column(
+        children: [
+          ...topItems,
+          Spacer(),
+          ...bottomItems,
+          SizedBox(height: 30),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart
new file mode 100644
index 000000000..42f4b0e4e
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart
@@ -0,0 +1,50 @@
+import 'package:flutter/material.dart';
+
+class SideMenuItem extends StatelessWidget {
+  const SideMenuItem({
+    Key? key,
+    required this.onTap,
+    this.imagePath,
+    this.icon,
+    this.isSelected = false,
+  }) : assert((icon != null && imagePath == null) || (icon == null && imagePath != null));
+
+  final void Function() onTap;
+  final String? imagePath;
+  final IconData? icon;
+  final bool isSelected;
+
+  Color _setColor(BuildContext context) {
+    if (isSelected) {
+      return Theme.of(context).primaryTextTheme.headline6!.color!;
+    } else {
+      return Theme.of(context).highlightColor;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return InkWell(
+      child: Padding(
+        padding: EdgeInsets.all(20),
+        child: icon != null
+            ? Icon(
+                icon,
+                color: _setColor(context),
+              )
+            : Image.asset(
+                imagePath ?? '',
+                fit: BoxFit.cover,
+                height: 30,
+                width: 30,
+                color: _setColor(context),
+              ),
+      ),
+      onTap: () => onTap.call(),
+      highlightColor: Colors.transparent,
+      focusColor: Colors.transparent,
+      hoverColor: Colors.transparent,
+      splashColor: Colors.transparent,
+    );
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart
new file mode 100644
index 000000000..72e65da34
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart
@@ -0,0 +1,175 @@
+import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/screens/auth/auth_page.dart';
+import 'package:cake_wallet/src/screens/base_page.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_dashboard_navbar.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
+import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_mobx/flutter_mobx.dart';
+import 'package:cake_wallet/router.dart' as Router;
+import 'package:mobx/mobx.dart';
+
+class DesktopSidebarWrapper extends BasePage {
+  final Widget child;
+  final DesktopSidebarViewModel desktopSidebarViewModel;
+  final DashboardViewModel dashboardViewModel;
+  final GlobalKey<NavigatorState> desktopNavigatorKey;
+
+  DesktopSidebarWrapper({
+    required this.child,
+    required this.desktopSidebarViewModel,
+    required this.dashboardViewModel,
+    required this.desktopNavigatorKey,
+  });
+
+  @override
+  ObstructingPreferredSizeWidget appBar(BuildContext context) => DesktopDashboardNavbar(
+        leading: Padding(
+          padding: EdgeInsets.only(left: sideMenuWidth),
+          child: getIt<DesktopWalletSelectionDropDown>(),
+        ),
+        middle: SyncIndicator(
+          dashboardViewModel: dashboardViewModel,
+          onTap: () => Navigator.of(context, rootNavigator: true).pushNamed(Routes.connectionSync),
+        ),
+        trailing: InkWell(
+          onTap: () {
+            Navigator.of(context).pushNamed(
+              Routes.unlock,
+              arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
+                if (isAuthenticatedSuccessfully) {
+                  auth.close();
+                }
+              },
+            );
+          },
+          child: Icon(Icons.lock_outline),
+        ),
+      );
+
+  @override
+  bool get resizeToAvoidBottomInset => false;
+
+  final pageController = PageController();
+
+  final selectedIconPath = 'assets/images/desktop_transactions_solid_icon.png';
+  final unselectedIconPath = 'assets/images/desktop_transactions_outline_icon.png';
+
+  double get sideMenuWidth => 76.0;
+
+  @override
+  Widget body(BuildContext context) {
+    _setEffects();
+
+    return Row(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        Observer(builder: (_) {
+          return SideMenu(
+            width: sideMenuWidth,
+            topItems: [
+              SideMenuItem(
+                imagePath: 'assets/images/wallet_outline.png',
+                isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
+                onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.dashboard),
+              ),
+              SideMenuItem(
+                onTap: () {
+                  String? currentPath;
+
+                  desktopNavigatorKey.currentState?.popUntil((route) {
+                    currentPath = route.settings.name;
+                    return true;
+                  });
+
+                  switch (currentPath) {
+                    case Routes.transactionsPage:
+                      desktopSidebarViewModel.resetSidebar();
+                      break;
+                    default:
+                      desktopSidebarViewModel.resetSidebar();
+                      Future.delayed(Duration(milliseconds: 10), () {
+                        desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
+                        desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
+                      });
+                  }
+                },
+                isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
+                imagePath: desktopSidebarViewModel.currentPage == SidebarItem.transactions
+                    ? selectedIconPath
+                    : unselectedIconPath,
+              ),
+            ],
+            bottomItems: [
+              SideMenuItem(
+                  imagePath: 'assets/images/support_icon.png',
+                  isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
+                  onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support)),
+              SideMenuItem(
+                imagePath: 'assets/images/settings_outline.png',
+                isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
+                onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
+              ),
+            ],
+          );
+        }),
+        Expanded(
+          child: PageView(
+            controller: pageController,
+            physics: NeverScrollableScrollPhysics(),
+            children: [
+              child,
+              Container(
+                color: Theme.of(context).backgroundColor,
+                padding: EdgeInsets.all(20),
+                child: Navigator(
+                  initialRoute: Routes.support,
+                  onGenerateRoute: (settings) => Router.createRoute(settings),
+                  onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
+                    return [
+                      navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
+                    ];
+                  },
+                ),
+              ),
+              Navigator(
+                initialRoute: Routes.desktop_settings_page,
+                onGenerateRoute: (settings) => Router.createRoute(settings),
+                onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
+                  return [
+                    navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
+                  ];
+                },
+              ),
+            ],
+          ),
+        ),
+      ],
+    );
+  }
+
+  void _setEffects() async {
+    reaction<SidebarItem>((_) => desktopSidebarViewModel.currentPage, (page) {
+      String? currentPath;
+
+      desktopNavigatorKey.currentState?.popUntil((route) {
+        currentPath = route.settings.name;
+        return true;
+      });
+      if (page == SidebarItem.transactions) {
+        return;
+      }
+
+      if (currentPath == Routes.transactionsPage) {
+        Navigator.of(desktopNavigatorKey.currentContext!).pop();
+      }
+      pageController.jumpToPage(page.index);
+    });
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart
new file mode 100644
index 000000000..a8f050002
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart
@@ -0,0 +1,188 @@
+import 'package:another_flushbar/flushbar.dart';
+import 'package:cake_wallet/core/auth_service.dart';
+import 'package:cake_wallet/entities/desktop_dropdown_item.dart';
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/dropdown_item_widget.dart';
+import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
+import 'package:cake_wallet/utils/show_bar.dart';
+import 'package:cake_wallet/utils/show_pop_up.dart';
+import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
+import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
+import 'package:cake_wallet/wallet_type_utils.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_mobx/flutter_mobx.dart';
+
+class DesktopWalletSelectionDropDown extends StatefulWidget {
+  final WalletListViewModel walletListViewModel;
+  final AuthService _authService;
+
+  DesktopWalletSelectionDropDown(this.walletListViewModel, this._authService, {Key? key})
+      : super(key: key);
+
+  @override
+  State<DesktopWalletSelectionDropDown> createState() => _DesktopWalletSelectionDropDownState();
+}
+
+class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionDropDown> {
+  final moneroIcon = Image.asset('assets/images/monero_logo.png', height: 24, width: 24);
+  final bitcoinIcon = Image.asset('assets/images/bitcoin.png', height: 24, width: 24);
+  final litecoinIcon = Image.asset('assets/images/litecoin_icon.png', height: 24, width: 24);
+  final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
+  final nonWalletTypeIcon = Image.asset('assets/images/close.png', height: 24, width: 24);
+
+  Image _newWalletImage(BuildContext context) => Image.asset(
+        'assets/images/new_wallet.png',
+        height: 12,
+        width: 12,
+        color: Theme.of(context).primaryTextTheme.headline6!.color!,
+      );
+
+  Image _restoreWalletImage(BuildContext context) => Image.asset(
+        'assets/images/restore_wallet.png',
+        height: 12,
+        width: 12,
+        color: Theme.of(context).primaryTextTheme.headline6!.color!,
+      );
+
+  Flushbar<void>? _progressBar;
+
+  @override
+  Widget build(BuildContext context) {
+    final themeData = Theme.of(context);
+    return Observer(builder: (context) {
+      final dropDownItems = [
+        ...widget.walletListViewModel.wallets
+            .map((wallet) => DesktopDropdownItem(
+                  isSelected: wallet.isCurrent,
+                  child: ConstrainedBox(
+                    constraints: BoxConstraints(maxWidth: 500),
+                    child: DropDownItemWidget(
+                        title: wallet.name,
+                        image: wallet.isEnabled ? _imageFor(type: wallet.type) : nonWalletTypeIcon),
+                  ),
+                  onSelected: () => _onSelectedWallet(wallet),
+                ))
+            .toList(),
+        DesktopDropdownItem(
+          onSelected: () => _navigateToCreateWallet(),
+          child: DropDownItemWidget(
+            title: S.of(context).create_new,
+            image: _newWalletImage(context),
+          ),
+        ),
+        DesktopDropdownItem(
+          onSelected: () => _navigateToRestoreWallet(),
+          child: DropDownItemWidget(
+            title: S.of(context).restore_wallet,
+            image: _restoreWalletImage(context),
+          ),
+        ),
+      ];
+
+      return DropdownButton<DesktopDropdownItem>(
+        items: dropDownItems
+            .map(
+              (wallet) => DropdownMenuItem<DesktopDropdownItem>(
+                child: wallet.child,
+                value: wallet,
+              ),
+            )
+            .toList(),
+        onChanged: (item) {
+          item?.onSelected();
+        },
+        dropdownColor: themeData.textTheme.bodyText1?.decorationColor,
+        style: TextStyle(color: themeData.primaryTextTheme.headline6?.color),
+        selectedItemBuilder: (context) => dropDownItems.map((item) => item.child).toList(),
+        value: dropDownItems.firstWhere((element) => element.isSelected),
+        underline: const SizedBox(),
+        focusColor: Colors.transparent,
+        borderRadius: BorderRadius.circular(15.0),
+      );
+    });
+  }
+
+  void _onSelectedWallet(WalletListItem selectedWallet) async {
+    if (selectedWallet.isCurrent || !selectedWallet.isEnabled) {
+      return;
+    }
+    final confirmed = await showPopUp<bool>(
+            context: context,
+            builder: (dialogContext) {
+              return AlertWithTwoActions(
+                  alertTitle: S.of(context).change_wallet_alert_title,
+                  alertContent: S.of(context).change_wallet_alert_content(selectedWallet.name),
+                  leftButtonText: S.of(context).cancel,
+                  rightButtonText: S.of(context).change,
+                  actionLeftButton: () => Navigator.of(context).pop(false),
+                  actionRightButton: () => Navigator.of(context).pop(true));
+            }) ??
+        false;
+
+    if (confirmed) {
+      await _loadWallet(selectedWallet);
+    }
+  }
+
+  Image _imageFor({required WalletType type}) {
+    switch (type) {
+      case WalletType.bitcoin:
+        return bitcoinIcon;
+      case WalletType.monero:
+        return moneroIcon;
+      case WalletType.litecoin:
+        return litecoinIcon;
+      case WalletType.haven:
+        return havenIcon;
+      default:
+        return nonWalletTypeIcon;
+    }
+  }
+
+  Future<void> _loadWallet(WalletListItem wallet) async {
+    widget._authService.authenticateAction(context,
+        onAuthSuccess: (isAuthenticatedSuccessfully) async {
+      if (!isAuthenticatedSuccessfully) {
+        return;
+      }
+
+      try {
+        changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
+        await widget.walletListViewModel.loadWallet(wallet);
+        hideProgressText();
+        setState(() {});
+      } catch (e) {
+        changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
+      }
+    });
+  }
+
+  void _navigateToCreateWallet() {
+    if (isSingleCoin) {
+      Navigator.of(context)
+          .pushNamed(Routes.newWallet, arguments: widget.walletListViewModel.currentWalletType);
+    } else {
+      Navigator.of(context).pushNamed(Routes.newWalletType);
+    }
+  }
+
+  void _navigateToRestoreWallet() {
+    if (isSingleCoin) {
+      Navigator.of(context)
+          .pushNamed(Routes.restoreWallet, arguments: widget.walletListViewModel.currentWalletType);
+    } else {
+      Navigator.of(context).pushNamed(Routes.restoreWalletType);
+    }
+  }
+
+  void changeProcessText(String text) {
+    _progressBar = createBar<void>(text, duration: null)..show(context);
+  }
+
+  void hideProgressText() {
+    _progressBar?.dismiss();
+    _progressBar = null;
+  }
+}
diff --git a/lib/src/screens/dashboard/desktop_widgets/dropdown_item_widget.dart b/lib/src/screens/dashboard/desktop_widgets/dropdown_item_widget.dart
new file mode 100644
index 000000000..47efd04a7
--- /dev/null
+++ b/lib/src/screens/dashboard/desktop_widgets/dropdown_item_widget.dart
@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+
+class DropDownItemWidget extends StatelessWidget {
+  const DropDownItemWidget({super.key, required this.title, required this.image});
+  final double tileHeight = 60;
+  final Image image;
+  final String title;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      height: tileHeight,
+      padding: EdgeInsets.symmetric(horizontal: 20),
+      child: Row(
+        crossAxisAlignment: CrossAxisAlignment.center,
+        mainAxisSize: MainAxisSize.min,
+        children: <Widget>[
+          image,
+          SizedBox(width: 10),
+          Flexible(
+            child: Text(
+              title,
+              style: TextStyle(
+                fontSize: 22,
+                fontWeight: FontWeight.w500,
+                color: Theme.of(context).primaryTextTheme.headline6!.color!,
+              ),
+              overflow: TextOverflow.ellipsis,
+              maxLines: 1,
+            ),
+          )
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/dashboard/wallet_menu.dart b/lib/src/screens/dashboard/wallet_menu.dart
deleted file mode 100644
index 1638c0bc4..000000000
--- a/lib/src/screens/dashboard/wallet_menu.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-import 'package:cake_wallet/palette.dart';
-import 'package:cake_wallet/src/screens/dashboard/wallet_menu_item.dart';
-import 'package:flutter/material.dart';
-import 'package:cake_wallet/routes.dart';
-import 'package:cake_wallet/generated/i18n.dart';
-
-// FIXME: terrible design
-
-class WalletMenu {
-  WalletMenu(this.context, this.reconnect, this.hasRescan) : items = [] {
-    items.addAll([
-    WalletMenuItem(
-      title: S.current.connection_sync,
-      image: Image.asset('assets/images/nodes_menu.png',
-          height: 16, width: 16),
-      handler: () => Navigator.of(context).pushNamed(Routes.connectionSync),
-    ),
-    WalletMenuItem(
-      title: S.current.wallets,
-      image: Image.asset('assets/images/wallet_menu.png',
-          height: 16, width: 16),
-      handler: () => Navigator.of(context).pushNamed(Routes.walletList),
-    ),
-    WalletMenuItem(
-      title: S.current.address_book_menu,
-      image: Image.asset('assets/images/open_book_menu.png',
-      height: 16, width: 16),
-      handler: () => Navigator.of(context).pushNamed(Routes.addressBook),
-    ),
-    WalletMenuItem(
-      title: S.current.security_and_backup,
-      image:
-          Image.asset('assets/images/key_menu.png', height: 16, width: 16),
-      handler: () {
-      Navigator.of(context).pushNamed(Routes.securityBackupPage);
-	  }),
-    WalletMenuItem(
-      title: S.current.privacy_settings,
-      image:
-          Image.asset('assets/images/privacy_menu.png', height: 16, width: 16),
-      handler: () {
-      Navigator.of(context).pushNamed(Routes.privacyPage);
-	  }),
-    WalletMenuItem(
-      title: S.current.display_settings,
-      image: Image.asset('assets/images/eye_menu.png',
-      height: 16, width: 16),
-      handler: () => Navigator.of(context).pushNamed(Routes.displaySettingsPage),
-    ),
-    WalletMenuItem(
-      title: S.current.other_settings,
-      image: Image.asset('assets/images/settings_menu.png',
-      height: 16, width: 16),
-      handler: () => Navigator.of(context).pushNamed(Routes.otherSettingsPage),
-    ),
-    WalletMenuItem(
-      title: S.current.settings_support,
-      image: Image.asset('assets/images/question_mark.png',
-      height: 16, width: 16, color: Palette.darkBlue),
-      handler: () => Navigator.of(context).pushNamed(Routes.support),
-    ),
-    ]);
-  }
-
-  final List<WalletMenuItem> items;
-  final BuildContext context;
-  final Future<void> Function() reconnect;
-  final bool hasRescan;
-
-  void action(int index) {
-    final item = items[index];
-    item.handler();
-  }
-}
diff --git a/lib/src/screens/dashboard/wallet_menu_item.dart b/lib/src/screens/dashboard/wallet_menu_item.dart
deleted file mode 100644
index 31a11f31e..000000000
--- a/lib/src/screens/dashboard/wallet_menu_item.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-import 'package:flutter/material.dart';
-
-class WalletMenuItem {
-  WalletMenuItem({
-    required this.title,
-    required this.image,
-    required this.handler});
-
-  final String title;
-  final Image image;
-  final void Function() handler;
-}
\ No newline at end of file
diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart
index 5de8124c4..82430f0c6 100644
--- a/lib/src/screens/dashboard/widgets/address_page.dart
+++ b/lib/src/screens/dashboard/widgets/address_page.dart
@@ -6,6 +6,7 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/present_receive_option
 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/share_util.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart';
@@ -24,13 +25,25 @@ import 'package:cake_wallet/di.dart';
 class AddressPage extends BasePage {
   AddressPage({
     required this.addressListViewModel,
-    required this.walletViewModel,
+    required this.dashboardViewModel,
     required this.receiveOptionViewModel,
-  }) : _cryptoAmountFocus = FocusNode();
+  }) : _cryptoAmountFocus = FocusNode(),
+      _formKey = GlobalKey<FormState>(),
+      _amountController = TextEditingController(){
+      _amountController.addListener(() {
+        if (_formKey.currentState!.validate()) {
+          addressListViewModel.changeAmount(
+            _amountController.text,
+          );
+        }
+    });
+  }
 
   final WalletAddressListViewModel addressListViewModel;
-  final DashboardViewModel walletViewModel;
+  final DashboardViewModel dashboardViewModel;
   final ReceiveOptionViewModel receiveOptionViewModel;
+  final TextEditingController _amountController;
+  final GlobalKey<FormState> _formKey;
 
   final FocusNode _cryptoAmountFocus;
 
@@ -47,25 +60,37 @@ class AddressPage extends BasePage {
   bool effectsInstalled = false;
 
   @override
-  Widget leading(BuildContext context) {
-    final _backButton = Icon(
-      Icons.arrow_back_ios,
-      color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!,
+  Color get titleColor => Colors.white;
+
+  @override
+  Widget? leading(BuildContext context) {
+    final _backButton = Icon(Icons.arrow_back_ios,
+      color: titleColor,
       size: 16,
     );
+    final _closeButton = currentTheme.type == ThemeType.dark
+        ? closeButtonImageDarkTheme : closeButtonImage;
 
-    return SizedBox(
-      height: 37,
-      width: 37,
-      child: ButtonTheme(
-        minWidth: double.minPositive,
-        child: TextButton(
-            // FIX-ME: Style
-            //highlightColor: Colors.transparent,
-            //splashColor: Colors.transparent,
-            //padding: EdgeInsets.all(0),
-            onPressed: () => onClose(context),
-            child: _backButton),
+    bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context);
+
+    return MergeSemantics(
+      child: SizedBox(
+        height: isMobileView ? 37 : 45,
+        width: isMobileView ? 37 : 45,
+        child: ButtonTheme(
+          minWidth: double.minPositive,
+          child: Semantics(
+            label: !isMobileView ? 'Close' : 'Back',
+            child: TextButton(
+              style: ButtonStyle(
+                overlayColor: MaterialStateColor.resolveWith(
+                        (states) => Colors.transparent),
+              ),
+              onPressed: () => onClose(context),
+              child: !isMobileView ? _closeButton : _backButton,
+            ),
+          ),
+        ),
       ),
     );
   }
@@ -87,28 +112,27 @@ class AddressPage extends BasePage {
 
   @override
   Widget? trailing(BuildContext context) {
-    final shareImage = Image.asset('assets/images/share.png',
-        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!);
-
-    return !addressListViewModel.hasAddressList
-        ? Material(
-            color: Colors.transparent,
-            child: IconButton(
-              padding: EdgeInsets.zero,
-              constraints: BoxConstraints(),
-              highlightColor: Colors.transparent,
-              splashColor: Colors.transparent,
-              iconSize: 25,
-              onPressed: () {
-                ShareUtil.share(
-                  text: addressListViewModel.address.address,
-                  context: context,
-                );
-              },
-              icon: shareImage,
-            ),
-          )
-        : null;
+    return Material(
+      color: Colors.transparent,
+      child: IconButton(
+        padding: EdgeInsets.zero,
+        constraints: BoxConstraints(),
+        highlightColor: Colors.transparent,
+        splashColor: Colors.transparent,
+        iconSize: 25,
+        onPressed: () {
+          ShareUtil.share(
+            text: addressListViewModel.uri.toString(),
+            context: context,
+          );
+        },
+        icon: Icon(
+          Icons.share,
+          size: 20,
+          color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!,
+        ),
+      ),
+    );
   }
 
   @override
@@ -116,8 +140,8 @@ class AddressPage extends BasePage {
     _setEffects(context);
 
     autorun((_) async {
-      if (!walletViewModel.isOutdatedElectrumWallet ||
-          !walletViewModel.settingsStore.shouldShowReceiveWarning) {
+      if (!dashboardViewModel.isOutdatedElectrumWallet ||
+          !dashboardViewModel.settingsStore.shouldShowReceiveWarning) {
         return;
       }
 
@@ -133,7 +157,7 @@ class AddressPage extends BasePage {
                   actionLeftButton: () => Navigator.of(context).pop(),
                   rightButtonText: S.of(context).do_not_show_me,
                   actionRightButton: () {
-                    walletViewModel.settingsStore.setShouldShowReceiveWarning(false);
+                    dashboardViewModel.settingsStore.setShouldShowReceiveWarning(false);
                     Navigator.of(context).pop();
                   });
             });
@@ -155,16 +179,18 @@ class AddressPage extends BasePage {
               )
             ]),
         child: Container(
-          padding: EdgeInsets.fromLTRB(24, 24, 24, 32),
+          padding: EdgeInsets.fromLTRB(24, 0, 24, 32),
           child: Column(
             children: <Widget>[
-            Expanded(
-              child: Observer(builder: (_) => QRWidget(
-                addressListViewModel: addressListViewModel,
-                amountTextFieldFocusNode: _cryptoAmountFocus,
-                isAmountFieldShow: !addressListViewModel.hasAccounts,
-                isLight: walletViewModel.settingsStore.currentTheme.type == ThemeType.light))
-              ),
+              Expanded(
+                  child: Observer(
+                      builder: (_) => QRWidget(
+                          formKey: _formKey,
+                          addressListViewModel: addressListViewModel,
+                          amountTextFieldFocusNode: _cryptoAmountFocus,
+                          amountController: _amountController,
+                          isLight: dashboardViewModel.settingsStore.currentTheme.type ==
+                              ThemeType.light))),
               Observer(builder: (_) {
                 return addressListViewModel.hasAddressList
                     ? GestureDetector(
@@ -222,7 +248,6 @@ class AddressPage extends BasePage {
     }
 
     reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) {
-      Navigator.pop(context);
       switch (option) {
         case ReceivePageOption.anonPayInvoice:
           Navigator.pushReplacementNamed(
diff --git a/lib/src/screens/dashboard/widgets/balance_page.dart b/lib/src/screens/dashboard/widgets/balance_page.dart
index c27d179b3..14933e7c5 100644
--- a/lib/src/screens/dashboard/widgets/balance_page.dart
+++ b/lib/src/screens/dashboard/widgets/balance_page.dart
@@ -1,5 +1,6 @@
 import 'package:cake_wallet/store/settings_store.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -7,190 +8,207 @@ import 'package:auto_size_text/auto_size_text.dart';
 import 'package:cake_wallet/src/widgets/introducing_card.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 
-
-class BalancePage extends StatelessWidget{
+class BalancePage extends StatelessWidget {
   BalancePage({required this.dashboardViewModel, required this.settingsStore});
 
   final DashboardViewModel dashboardViewModel;
   final SettingsStore settingsStore;
-  
+
   Color get backgroundLightColor =>
       settingsStore.currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
 
   @override
   Widget build(BuildContext context) {
     return GestureDetector(
-      onLongPress: () => dashboardViewModel.balanceViewModel.isReversing = !dashboardViewModel.balanceViewModel.isReversing,
-      onLongPressUp: () => dashboardViewModel.balanceViewModel.isReversing = !dashboardViewModel.balanceViewModel.isReversing,
-      child: SingleChildScrollView(
-      child: Column(
-        crossAxisAlignment: CrossAxisAlignment.start,
-        children: [
+        onLongPress: () => dashboardViewModel.balanceViewModel.isReversing =
+            !dashboardViewModel.balanceViewModel.isReversing,
+        onLongPressUp: () => dashboardViewModel.balanceViewModel.isReversing =
+            !dashboardViewModel.balanceViewModel.isReversing,
+        child: SingleChildScrollView(
+            child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
           SizedBox(height: 56),
           Container(
-            margin: const EdgeInsets.only(left: 24, bottom: 16),
-            child: Observer(builder: (_) {
-                  return Text(
-                      dashboardViewModel.balanceViewModel.asset,
-                      style: TextStyle(
-                          fontSize: 24,
-                          fontFamily: 'Lato',
-                          fontWeight: FontWeight.w600,
-                          color: Theme.of(context)
-                              .accentTextTheme!
-                              .headline2!
-                              .backgroundColor!,
-                          height: 1),
-                      maxLines: 1,
-                      textAlign: TextAlign.center);
-                })),
+              margin: const EdgeInsets.only(left: 24, bottom: 16),
+              child: Observer(builder: (_) {
+                return Text(dashboardViewModel.balanceViewModel.asset,
+                    style: TextStyle(
+                        fontSize: 24,
+                        fontFamily: 'Lato',
+                        fontWeight: FontWeight.w600,
+                        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                        height: 1),
+                    maxLines: 1,
+                    textAlign: TextAlign.center);
+              })),
           Observer(builder: (_) {
-            if (dashboardViewModel.balanceViewModel.isShowCard){
+            if (dashboardViewModel.balanceViewModel.isShowCard) {
               return IntroducingCard(
-                  title:  S.of(context).introducing_cake_pay,
+                  title: S.of(context).introducing_cake_pay,
                   subTitle: S.of(context).cake_pay_learn_more,
                   borderColor: settingsStore.currentTheme.type == ThemeType.bright
                       ? Color.fromRGBO(255, 255, 255, 0.2)
                       : Colors.transparent,
-                  closeCard: dashboardViewModel.balanceViewModel.disableIntroCakePayCard
-              );
+                  closeCard: dashboardViewModel.balanceViewModel.disableIntroCakePayCard);
             }
-            return Container ();
+            return Container();
           }),
           Observer(builder: (_) {
             return ListView.separated(
-              physics: NeverScrollableScrollPhysics(),
-                  shrinkWrap: true,
-                  separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 8)),
-                  itemCount: dashboardViewModel.balanceViewModel.formattedBalances.length,
-                  itemBuilder: (__, index) {
-                    final balance = dashboardViewModel.balanceViewModel.formattedBalances.elementAt(index);
-                    return buildBalanceRow(context,
-                      availableBalanceLabel: '${dashboardViewModel.balanceViewModel.availableBalanceLabel}',
+                physics: NeverScrollableScrollPhysics(),
+                shrinkWrap: true,
+                separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 8)),
+                itemCount: dashboardViewModel.balanceViewModel.formattedBalances.length,
+                itemBuilder: (__, index) {
+                  final balance =
+                      dashboardViewModel.balanceViewModel.formattedBalances.elementAt(index);
+                  return buildBalanceRow(context,
+                      availableBalanceLabel:
+                          '${dashboardViewModel.balanceViewModel.availableBalanceLabel}',
                       availableBalance: balance.availableBalance,
                       availableFiatBalance: balance.fiatAvailableBalance,
-                      additionalBalanceLabel: '${dashboardViewModel.balanceViewModel.additionalBalanceLabel}',
+                      additionalBalanceLabel:
+                          '${dashboardViewModel.balanceViewModel.additionalBalanceLabel}',
                       additionalBalance: balance.additionalBalance,
                       additionalFiatBalance: balance.fiatAdditionalBalance,
+                      frozenBalance: balance.frozenBalance,
+                      frozenFiatBalance: balance.fiatFrozenBalance,
                       currency: balance.formattedAssetTitle);
-                    });
-             })
-      ])));
+                });
+          })
+        ])));
   }
 
   Widget buildBalanceRow(BuildContext context,
-    {required String availableBalanceLabel,
+      {required String availableBalanceLabel,
       required String availableBalance,
       required String availableFiatBalance,
       required String additionalBalanceLabel,
       required String additionalBalance,
       required String additionalFiatBalance,
+      required String frozenBalance,
+      required String frozenFiatBalance,
       required String currency}) {
-    return Container(    
+    return Container(
       margin: const EdgeInsets.only(left: 16, right: 16),
       decoration: BoxDecoration(
-        borderRadius: BorderRadius.circular(30.0),
-        border: Border.all(color: settingsStore.currentTheme.type == ThemeType.bright ? Color.fromRGBO(255, 255, 255, 0.2): Colors.transparent, width: 1, ),
-        color:Theme.of(context).textTheme!.headline6!.backgroundColor!
-      ),
+          borderRadius: BorderRadius.circular(30.0),
+          border: Border.all(
+            color: settingsStore.currentTheme.type == ThemeType.bright
+                ? Color.fromRGBO(255, 255, 255, 0.2)
+                : Colors.transparent,
+            width: 1,
+          ),
+          color: Theme.of(context).textTheme!.headline6!.backgroundColor!),
       child: Container(
-       margin: const EdgeInsets.only(top: 16, left: 24, right: 24, bottom: 24),
-       child: Column(
-             crossAxisAlignment: CrossAxisAlignment.start,
-             children: [
-                SizedBox(height: 4,),
-                Text('${availableBalanceLabel}',
-                    textAlign: TextAlign.center,
-                    style: TextStyle(
+          margin: const EdgeInsets.only(top: 16, left: 24, right: 24, bottom: 24),
+          child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
+            SizedBox(
+              height: 4,
+            ),
+            Text('${availableBalanceLabel}',
+                textAlign: TextAlign.center,
+                style: TextStyle(
                     fontSize: 12,
                     fontFamily: 'Lato',
                     fontWeight: FontWeight.w400,
-                    color: Theme.of(context)
-                            .accentTextTheme!
-                            .headline3!
-                            .backgroundColor!,
+                    color: Theme.of(context).accentTextTheme!.headline3!.backgroundColor!,
                     height: 1)),
-                SizedBox(height: 5),
-              Row(
-                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                  children: [
-                  AutoSizeText(
-                    availableBalance,
-                    style: TextStyle(
-                        fontSize: 24,
-                        fontFamily: 'Lato',
-                        fontWeight: FontWeight.w900,
-                        color: Theme.of(context)
-                            .accentTextTheme!
-                            .headline2!
-                            .backgroundColor!,
-                        height: 1),
-                    maxLines: 1,
-                    textAlign: TextAlign.center),
-                  Text(currency,
-                    style: TextStyle(
-                        fontSize: 28,
-                        fontFamily: 'Lato',
-                        fontWeight: FontWeight.w800,
-                        color: Theme.of(context)
-                            .accentTextTheme!
-                            .headline2!
-                            .backgroundColor!,
-                        height: 1)),
-                  ]),
-              SizedBox(height: 4,),
-              Text('${availableFiatBalance}',
+            SizedBox(height: 5),
+            Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
+              AutoSizeText(availableBalance,
+                  style: TextStyle(
+                      fontSize: 24,
+                      fontFamily: 'Lato',
+                      fontWeight: FontWeight.w900,
+                      color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                      height: 1),
+                  maxLines: 1,
+                  textAlign: TextAlign.center),
+              Text(currency,
+                  style: TextStyle(
+                      fontSize: 28,
+                      fontFamily: 'Lato',
+                      fontWeight: FontWeight.w800,
+                      color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                      height: 1)),
+            ]),
+            SizedBox(
+              height: 4,
+            ),
+            Text('${availableFiatBalance}',
                 textAlign: TextAlign.center,
                 style: TextStyle(
-                  fontSize: 16,
-                  fontFamily: 'Lato',
-                  fontWeight: FontWeight.w500,
-                  color: Theme.of(context)
-                          .accentTextTheme!
-                          .headline2!
-                          .backgroundColor!,
-                  height: 1)),
-              SizedBox(height: 26),
-              Text('${additionalBalanceLabel}',
-                textAlign: TextAlign.center,
-                style: TextStyle(
-                  fontSize: 12,
-                  fontFamily: 'Lato',
-                  fontWeight: FontWeight.w400,
-                  color: Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
-                          .backgroundColor!,
-                  height: 1)),
-              SizedBox(height: 8),
-              AutoSizeText(
-                    additionalBalance,
+                    fontSize: 16,
+                    fontFamily: 'Lato',
+                    fontWeight: FontWeight.w500,
+                    color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                    height: 1)),
+            SizedBox(height: 26),
+            if (frozenBalance.isNotEmpty)
+              Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
+                Text(S.current.frozen_balance,
+                    textAlign: TextAlign.center,
                     style: TextStyle(
-                       fontSize: 20,
+                        fontSize: 12,
                         fontFamily: 'Lato',
                         fontWeight: FontWeight.w400,
-                        color: Theme.of(context)
-                            .accentTextTheme!
-                            .headline2!
-                            .backgroundColor!,
+                        color: Theme.of(context).accentTextTheme!.headline3!.backgroundColor!,
+                        height: 1)),
+                SizedBox(height: 8),
+                AutoSizeText(frozenBalance,
+                    style: TextStyle(
+                        fontSize: 20,
+                        fontFamily: 'Lato',
+                        fontWeight: FontWeight.w400,
+                        color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
                         height: 1),
                     maxLines: 1,
                     textAlign: TextAlign.center),
-              SizedBox(height: 4,),
-              Text('${additionalFiatBalance}',
+                SizedBox(height: 4),
+                Text(
+                  frozenFiatBalance,
+                  textAlign: TextAlign.center,
+                  style: TextStyle(
+                      fontSize: 12,
+                      fontFamily: 'Lato',
+                      fontWeight: FontWeight.w400,
+                      color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                      height: 1),
+                ),
+                SizedBox(height: 24)
+              ]),
+            Text('${additionalBalanceLabel}',
                 textAlign: TextAlign.center,
                 style: TextStyle(
+                    fontSize: 12,
+                    fontFamily: 'Lato',
+                    fontWeight: FontWeight.w400,
+                    color: Theme.of(context).accentTextTheme!.headline3!.backgroundColor!,
+                    height: 1)),
+            SizedBox(height: 8),
+            AutoSizeText(additionalBalance,
+                style: TextStyle(
+                    fontSize: 20,
+                    fontFamily: 'Lato',
+                    fontWeight: FontWeight.w400,
+                    color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                    height: 1),
+                maxLines: 1,
+                textAlign: TextAlign.center),
+            SizedBox(
+              height: 4,
+            ),
+            Text(
+              '${additionalFiatBalance}',
+              textAlign: TextAlign.center,
+              style: TextStyle(
                   fontSize: 12,
                   fontFamily: 'Lato',
                   fontWeight: FontWeight.w400,
-                  color: Theme.of(context)
-                          .accentTextTheme!
-                          .headline2!
-                          .backgroundColor!,
+                  color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
                   height: 1),
-                )
-      ])),
+            )
+          ])),
     );
   }
 }
-
diff --git a/lib/src/screens/dashboard/widgets/filter_widget.dart b/lib/src/screens/dashboard/widgets/filter_widget.dart
index 17df0bc5e..9b8c87ea3 100644
--- a/lib/src/screens/dashboard/widgets/filter_widget.dart
+++ b/lib/src/screens/dashboard/widgets/filter_widget.dart
@@ -16,7 +16,6 @@ class FilterWidget extends StatelessWidget {
   FilterWidget({required this.dashboardViewModel});
 
   final DashboardViewModel dashboardViewModel;
-  final closeIcon = Image.asset('assets/images/close.png', color: Palette.darkBlueCraiola);
 
   @override
   Widget build(BuildContext context) {
@@ -101,7 +100,7 @@ class FilterWidget extends StatelessWidget {
               ),
             ],
           ),
-          AlertCloseButton(image: closeIcon)
+          AlertCloseButton()
         ],
       ),
     );
diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart
index 06e79251e..54b8a08f4 100644
--- a/lib/src/screens/dashboard/widgets/menu_widget.dart
+++ b/lib/src/screens/dashboard/widgets/menu_widget.dart
@@ -1,10 +1,9 @@
-import 'dart:ui';
+import 'package:cake_wallet/src/widgets/setting_action_button.dart';
+import 'package:cake_wallet/src/widgets/setting_actions.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/palette.dart';
 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
 import 'package:cw_core/wallet_type.dart';
-import 'package:cake_wallet/src/screens/dashboard/wallet_menu.dart';
-import 'package:flutter/rendering.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 
 // FIXME: terrible design.
@@ -84,16 +83,12 @@ class MenuWidgetState extends State<MenuWidget> {
 
   @override
   Widget build(BuildContext context) {
-    final walletMenu = WalletMenu(
-        context,
-        () async => widget.dashboardViewModel.reconnect(),
-        widget.dashboardViewModel.hasRescan);
-    final itemCount = walletMenu.items.length;
+    final itemCount = SettingActions.all.length;
 
     moneroIcon = Image.asset('assets/images/monero_menu.png',
-        color: Theme.of(context).accentTextTheme!.overline!.decorationColor!);
+        color: Theme.of(context).accentTextTheme.overline!.decorationColor!);
     bitcoinIcon = Image.asset('assets/images/bitcoin_menu.png',
-        color: Theme.of(context).accentTextTheme!.overline!.decorationColor!);
+        color: Theme.of(context).accentTextTheme.overline!.decorationColor!);
 
     return Row(
       mainAxisSize: MainAxisSize.max,
@@ -105,17 +100,15 @@ class MenuWidgetState extends State<MenuWidget> {
               height: 60,
               width: 4,
               decoration: BoxDecoration(
-                  borderRadius: BorderRadius.all(Radius.circular(2)),
-                  color: PaletteDark.gray),
+                  borderRadius: BorderRadius.all(Radius.circular(2)), color: PaletteDark.gray),
             )),
         SizedBox(width: 12),
         Expanded(
             child: ClipRRect(
                 borderRadius: BorderRadius.only(
-                    topLeft: Radius.circular(24),
-                    bottomLeft: Radius.circular(24)),
+                    topLeft: Radius.circular(24), bottomLeft: Radius.circular(24)),
                 child: Container(
-                  color: Theme.of(context).textTheme!.bodyText1!.decorationColor!,
+                  color: Theme.of(context).textTheme.bodyText1!.decorationColor!,
                   child: ListView.separated(
                       padding: EdgeInsets.only(top: 0),
                       itemBuilder: (_, index) {
@@ -123,25 +116,13 @@ class MenuWidgetState extends State<MenuWidget> {
                           return Container(
                             height: headerHeight,
                             decoration: BoxDecoration(
-                              gradient: LinearGradient(
-                                  colors: [
-                                    Theme.of(context)
-                                        .accentTextTheme!
-                                        .headline4!
-                                        .color!,
-                                    Theme.of(context)
-                                        .accentTextTheme!
-                                        .headline4!
-                                        .decorationColor!,
-                                  ],
-                                  begin: Alignment.topLeft,
-                                  end: Alignment.bottomRight),
+                              gradient: LinearGradient(colors: [
+                                Theme.of(context).accentTextTheme.headline4!.color!,
+                                Theme.of(context).accentTextTheme.headline4!.decorationColor!,
+                              ], begin: Alignment.topLeft, end: Alignment.bottomRight),
                             ),
                             padding: EdgeInsets.only(
-                                left: 24,
-                                top: fromTopEdge,
-                                right: 24,
-                                bottom: fromBottomEdge),
+                                left: 24, top: fromTopEdge, right: 24, bottom: fromBottomEdge),
                             child: Row(
                               mainAxisAlignment: MainAxisAlignment.start,
                               children: <Widget>[
@@ -150,13 +131,10 @@ class MenuWidgetState extends State<MenuWidget> {
                                 SingleChildScrollView(
                                     child: Container(
                                   child: Column(
-                                    crossAxisAlignment:
-                                        CrossAxisAlignment.start,
-                                    mainAxisAlignment:
-                                        widget.dashboardViewModel.subname !=
-                                                null
-                                            ? MainAxisAlignment.spaceBetween
-                                            : MainAxisAlignment.center,
+                                    crossAxisAlignment: CrossAxisAlignment.start,
+                                    mainAxisAlignment: widget.dashboardViewModel.subname.isNotEmpty
+                                        ? MainAxisAlignment.spaceBetween
+                                        : MainAxisAlignment.center,
                                     children: <Widget>[
                                       Text(
                                         widget.dashboardViewModel.name,
@@ -165,19 +143,16 @@ class MenuWidgetState extends State<MenuWidget> {
                                             fontSize: 16,
                                             fontWeight: FontWeight.bold),
                                       ),
-                                      if (widget.dashboardViewModel.subname !=
-                                          null)
+                                      if (widget.dashboardViewModel.subname.isNotEmpty)
                                         Observer(
                                             builder: (_) => Text(
-                                                  widget.dashboardViewModel
-                                                      .subname,
+                                                  widget.dashboardViewModel.subname,
                                                   style: TextStyle(
                                                       color: Theme.of(context)
-                                                          .accentTextTheme!
+                                                          .accentTextTheme
                                                           .overline!
                                                           .decorationColor!,
-                                                      fontWeight:
-                                                          FontWeight.w500,
+                                                      fontWeight: FontWeight.w500,
                                                       fontSize: 12),
                                                 ))
                                     ],
@@ -190,58 +165,24 @@ class MenuWidgetState extends State<MenuWidget> {
 
                         index--;
 
-                        final item = walletMenu.items[index];
-                        final title = item.title;
-                        final image = item.image ?? Offstage();
+                        final item = SettingActions.all[index];
+
                         final isLastTile = index == itemCount - 1;
 
-                        return GestureDetector(
-                            onTap: () {
-                              Navigator.of(context).pop();
-                              walletMenu.action(index);
-                            },
-                            child: Container(
-                              color: Theme.of(context)
-                                  .textTheme!
-                                  .bodyText1!
-                                  .decorationColor!,
-                              height: isLastTile ? headerHeight : tileHeight,
-                              padding: isLastTile
-                                  ? EdgeInsets.only(
-                                      left: 24,
-                                      right: 24,
-                                      top: fromBottomEdge,
-                                      //bottom: fromTopEdge
-                                    )
-                                  : EdgeInsets.only(left: 24, right: 24),
-                              alignment: isLastTile ? Alignment.topLeft : null,
-                              child: Row(
-                                mainAxisAlignment: MainAxisAlignment.start,
-                                crossAxisAlignment: CrossAxisAlignment.center,
-                                children: <Widget>[
-                                  image,
-                                  SizedBox(width: 16),
-                                  Expanded(
-                                      child: Text(
-                                    title,
-                                    style: TextStyle(
-                                        color: Theme.of(context)
-                                            .textTheme!
-                                            .headline3!
-                                            .color!,
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.bold),
-                                  ))
-                                ],
-                              ),
-                            ));
+                        return SettingActionButton(
+                          isLastTile: isLastTile,
+                          tileHeight: tileHeight,
+                          selectionActive: false,
+                          fromBottomEdge: fromBottomEdge,
+                          fromTopEdge: fromTopEdge,
+                          onTap: () => item.onTap.call(context),
+                          image: item.image,
+                          title: item.name,
+                        );
                       },
                       separatorBuilder: (_, index) => Container(
                             height: 1,
-                            color: Theme.of(context)
-                                .primaryTextTheme!
-                                .caption!
-                                .decorationColor!,
+                            color: Theme.of(context).primaryTextTheme.caption!.decorationColor!,
                           ),
                       itemCount: itemCount + 1),
                 )))
diff --git a/lib/src/screens/dashboard/widgets/present_receive_option_picker.dart b/lib/src/screens/dashboard/widgets/present_receive_option_picker.dart
index 2ca63dd82..8b3ffb894 100644
--- a/lib/src/screens/dashboard/widgets/present_receive_option_picker.dart
+++ b/lib/src/screens/dashboard/widgets/present_receive_option_picker.dart
@@ -86,7 +86,11 @@ class PresentReceiveOptionPicker extends StatelessWidget {
                     itemBuilder: (_, index) {
                       final option = receiveOptionViewModel.options[index];
                       return InkWell(
-                        onTap: () => receiveOptionViewModel.selectReceiveOption(option),
+                        onTap: () {
+                          Navigator.pop(popUpContext);
+
+                          receiveOptionViewModel.selectReceiveOption(option);
+                        },
                         child: Padding(
                           padding: const EdgeInsets.only(left: 24, right: 24),
                           child: Observer(builder: (_) {
diff --git a/lib/src/screens/dashboard/widgets/transactions_page.dart b/lib/src/screens/dashboard/widgets/transactions_page.dart
index f773fa8fc..2efb38e89 100644
--- a/lib/src/screens/dashboard/widgets/transactions_page.dart
+++ b/lib/src/screens/dashboard/widgets/transactions_page.dart
@@ -1,5 +1,6 @@
 import 'package:cake_wallet/src/screens/dashboard/widgets/anonpay_transaction_row.dart';
 import 'package:cake_wallet/src/screens/dashboard/widgets/order_row.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/view_model/dashboard/anonpay_transaction_list_item.dart';
 import 'package:cake_wallet/view_model/dashboard/order_list_item.dart';
 import 'package:cw_core/crypto_currency.dart';
@@ -25,6 +26,9 @@ class TransactionsPage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return Container(
+      color: ResponsiveLayoutUtil.instance.isMobile(context)
+          ? null
+          : Theme.of(context).backgroundColor,
       padding: EdgeInsets.only(top: 24, bottom: 24),
       child: Column(
         children: <Widget>[
diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart
index 1f17d38fd..fa3b3b825 100644
--- a/lib/src/screens/exchange/exchange_page.dart
+++ b/lib/src/screens/exchange/exchange_page.dart
@@ -1,13 +1,15 @@
-import 'dart:ui';
 import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/src/screens/exchange/widgets/desktop_exchange_cards_section.dart';
+import 'package:cake_wallet/src/screens/exchange/widgets/mobile_exchange_cards_section.dart';
+import 'package:cake_wallet/src/widgets/add_template_button.dart';
+import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:cake_wallet/utils/debounce.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cw_core/sync_status.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
 import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart';
 import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
-import 'package:dotted_border/dotted_border.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:keyboard_actions/keyboard_actions.dart';
@@ -35,7 +37,14 @@ import 'package:cake_wallet/src/screens/exchange/widgets/present_provider_picker
 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.dart';
 
 class ExchangePage extends BasePage {
-  ExchangePage(this.exchangeViewModel);
+  ExchangePage(this.exchangeViewModel) {
+    depositWalletName = exchangeViewModel.depositCurrency == CryptoCurrency.xmr
+        ? exchangeViewModel.wallet.name
+        : null;
+    receiveWalletName = exchangeViewModel.receiveCurrency == CryptoCurrency.xmr
+        ? exchangeViewModel.wallet.name
+        : null;
+  }
 
   final ExchangeViewModel exchangeViewModel;
   final depositKey = GlobalKey<ExchangeCardState>();
@@ -49,6 +58,20 @@ class ExchangePage extends BasePage {
   final _depositAmountDebounce = Debounce(Duration(milliseconds: 500));
   var _isReactionsSet = false;
 
+  final arrowBottomPurple = Image.asset(
+    'assets/images/arrow_bottom_purple_icon.png',
+    color: Colors.white,
+    height: 8,
+  );
+  final arrowBottomCakeGreen = Image.asset(
+    'assets/images/arrow_bottom_cake_green.png',
+    color: Colors.white,
+    height: 8,
+  );
+
+  late final String? depositWalletName;
+  late final String? receiveWalletName;
+
   @override
   String get title => S.current.exchange;
 
@@ -85,35 +108,44 @@ class ExchangePage extends BasePage {
         exchangeViewModel.reset();
       });
 
+  @override
+  Widget? leading(BuildContext context) {
+    final _backButton = Icon(Icons.arrow_back_ios,
+      color: titleColor,
+      size: 16,
+    );
+    final _closeButton = currentTheme.type == ThemeType.dark
+        ? closeButtonImageDarkTheme : closeButtonImage;
+
+    bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context);
+
+    return MergeSemantics(
+      child: SizedBox(
+        height: isMobileView ? 37 : 45,
+        width: isMobileView ? 37 : 45,
+        child: ButtonTheme(
+          minWidth: double.minPositive,
+          child: Semantics(
+            label: !isMobileView ? 'Close' : 'Back',
+            child: TextButton(
+              style: ButtonStyle(
+                overlayColor: MaterialStateColor.resolveWith(
+                        (states) => Colors.transparent),
+              ),
+              onPressed: () => onClose(context),
+              child: !isMobileView ? _closeButton : _backButton,
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+
   @override
   Widget body(BuildContext context) {
-    final arrowBottomPurple = Image.asset(
-      'assets/images/arrow_bottom_purple_icon.png',
-      color: Colors.white,
-      height: 8,
-    );
-    final arrowBottomCakeGreen = Image.asset(
-      'assets/images/arrow_bottom_cake_green.png',
-      color: Colors.white,
-      height: 8,
-    );
-
-    final depositWalletName =
-        exchangeViewModel.depositCurrency == CryptoCurrency.xmr
-            ? exchangeViewModel.wallet.name
-            : null;
-    final receiveWalletName =
-        exchangeViewModel.receiveCurrency == CryptoCurrency.xmr
-            ? exchangeViewModel.wallet.name
-            : null;
-
     WidgetsBinding.instance
         .addPostFrameCallback((_) => _setReactions(context, exchangeViewModel));
 
-    if (exchangeViewModel.isLowFee) {
-      _showFeeAlert(context);
-    }
-
     return KeyboardActions(
         disableScroll: true,
         config: KeyboardActionsConfig(
@@ -137,201 +169,7 @@ class ExchangePage extends BasePage {
                 contentPadding: EdgeInsets.only(bottom: 24),
                 content: Observer(builder: (_) => Column(
                   children: <Widget>[
-                    Container(
-                      padding: EdgeInsets.only(bottom: 32),
-                      decoration: BoxDecoration(
-                        borderRadius: BorderRadius.only(
-                            bottomLeft: Radius.circular(24),
-                            bottomRight: Radius.circular(24)),
-                        gradient: LinearGradient(
-                            colors: [
-                              Theme.of(context).primaryTextTheme!.bodyText2!.color!,
-                              Theme.of(context)
-                                  .primaryTextTheme!
-                                  .bodyText2!
-                                  .decorationColor!,
-                            ],
-                            stops: [
-                              0.35,
-                              1.0
-                            ],
-                            begin: Alignment.topLeft,
-                            end: Alignment.bottomRight),
-                      ),
-                      child: Column(
-                        children: <Widget>[
-                          Container(
-                            decoration: BoxDecoration(
-                              borderRadius: BorderRadius.only(
-                                  bottomLeft: Radius.circular(24),
-                                  bottomRight: Radius.circular(24)),
-                              gradient: LinearGradient(
-                                  colors: [
-                                    Theme.of(context)
-                                        .primaryTextTheme!
-                                        .subtitle2!
-                                        .color!,
-                                    Theme.of(context)
-                                        .primaryTextTheme!
-                                        .subtitle2!
-                                        .decorationColor!,
-                                  ],
-                                  begin: Alignment.topLeft,
-                                  end: Alignment.bottomRight),
-                            ),
-                            padding: EdgeInsets.fromLTRB(24, 100, 24, 32),
-                            child: Observer(
-                              builder: (_) => ExchangeCard(
-                                onDispose: disposeBestRateSync,
-                                hasAllAmount: exchangeViewModel.hasAllAmount,
-                                allAmount: exchangeViewModel.hasAllAmount
-                                    ? () => exchangeViewModel
-                                    .calculateDepositAllAmount()
-                                    : null,
-                                amountFocusNode: _depositAmountFocus,
-                                addressFocusNode: _depositAddressFocus,
-                                key: depositKey,
-                                title: S.of(context).you_will_send,
-                                initialCurrency:
-                                exchangeViewModel.depositCurrency,
-                                initialWalletName: depositWalletName ?? '',
-                                initialAddress:
-                                exchangeViewModel.depositCurrency ==
-                                    exchangeViewModel.wallet.currency
-                                    ? exchangeViewModel.wallet.walletAddresses.address
-                                    : exchangeViewModel.depositAddress,
-                                initialIsAmountEditable: true,
-                                initialIsAddressEditable:
-                                exchangeViewModel.isDepositAddressEnabled,
-                                isAmountEstimated: false,
-                                hasRefundAddress: true,
-                                isMoneroWallet: exchangeViewModel.isMoneroWallet,
-                                currencies: exchangeViewModel.depositCurrencies,
-                                onCurrencySelected: (currency) {
-                                  // FIXME: need to move it into view model
-                                  if (currency == CryptoCurrency.xmr &&
-                                      exchangeViewModel.wallet.type !=
-                                          WalletType.monero) {
-                                    showPopUp<void>(
-                                        context: context,
-                                        builder: (dialogContext) {
-                                          return AlertWithOneAction(
-                                              alertTitle: S.of(context).error,
-                                              alertContent: S
-                                                  .of(context)
-                                                  .exchange_incorrect_current_wallet_for_xmr,
-                                              buttonText: S.of(context).ok,
-                                              buttonAction: () =>
-                                                  Navigator.of(dialogContext)
-                                                      .pop());
-                                        });
-                                    return;
-                                  }
-
-                                  exchangeViewModel.changeDepositCurrency(
-                                      currency: currency);
-                                },
-                                imageArrow: arrowBottomPurple,
-                                currencyButtonColor: Colors.transparent,
-                                addressButtonsColor:
-                                Theme.of(context).focusColor!,
-                                borderColor: Theme.of(context)
-                                    .primaryTextTheme!
-                                    .bodyText1!
-                                    .color!,
-                                currencyValueValidator: AmountValidator(
-                                    currency: exchangeViewModel.depositCurrency),
-                                addressTextFieldValidator: AddressValidator(
-                                    type: exchangeViewModel.depositCurrency),
-                                onPushPasteButton: (context) async {
-                                  final domain =
-                                      exchangeViewModel.depositAddress;
-                                  final ticker = exchangeViewModel
-                                      .depositCurrency.title.toLowerCase();
-                                  exchangeViewModel.depositAddress =
-                                    await fetchParsedAddress(
-                                        context, domain, ticker);
-                                },
-                                onPushAddressBookButton: (context) async {
-                                  final domain =
-                                      exchangeViewModel.depositAddress;
-                                  final ticker = exchangeViewModel
-                                      .depositCurrency.title.toLowerCase();
-                                  exchangeViewModel.depositAddress =
-                                  await fetchParsedAddress(
-                                      context, domain, ticker);
-                                },
-                              ),
-                            ),
-                          ),
-                          Padding(
-                            padding:
-                            EdgeInsets.only(top: 29, left: 24, right: 24),
-                            child: Observer(
-                                builder: (_) => ExchangeCard(
-                                  onDispose: disposeBestRateSync,
-                                  amountFocusNode: _receiveAmountFocus,
-                                  addressFocusNode: _receiveAddressFocus,
-                                  key: receiveKey,
-                                  title: S.of(context).you_will_get,
-                                  initialCurrency:
-                                  exchangeViewModel.receiveCurrency,
-                                  initialWalletName: receiveWalletName ?? '',
-                                  initialAddress: exchangeViewModel
-                                      .receiveCurrency ==
-                                      exchangeViewModel.wallet.currency
-                                      ? exchangeViewModel.wallet.walletAddresses.address
-                                      : exchangeViewModel.receiveAddress,
-                                  initialIsAmountEditable: exchangeViewModel
-                                      .isReceiveAmountEditable,
-                                  initialIsAddressEditable:
-                                  exchangeViewModel
-                                      .isReceiveAddressEnabled,
-                                  isAmountEstimated: true,
-                                  isMoneroWallet: exchangeViewModel.isMoneroWallet,
-                                  currencies:
-                                    exchangeViewModel.receiveCurrencies,
-                                  onCurrencySelected: (currency) =>
-                                      exchangeViewModel
-                                          .changeReceiveCurrency(
-                                          currency: currency),
-                                  imageArrow: arrowBottomCakeGreen,
-                                  currencyButtonColor: Colors.transparent,
-                                  addressButtonsColor:
-                                  Theme.of(context).focusColor!,
-                                  borderColor: Theme.of(context)
-                                      .primaryTextTheme!
-                                      .bodyText1!
-                                      .decorationColor!,
-                                  currencyValueValidator: AmountValidator(
-                                      currency: exchangeViewModel.receiveCurrency),
-                                  addressTextFieldValidator:
-                                  AddressValidator(
-                                      type: exchangeViewModel
-                                          .receiveCurrency),
-                                  onPushPasteButton: (context) async {
-                                    final domain =
-                                        exchangeViewModel.receiveAddress;
-                                    final ticker = exchangeViewModel
-                                        .receiveCurrency.title.toLowerCase();
-                                    exchangeViewModel.receiveAddress =
-                                      await fetchParsedAddress(
-                                          context, domain, ticker);
-                                  },
-                                  onPushAddressBookButton: (context) async {
-                                    final domain =
-                                        exchangeViewModel.receiveAddress;
-                                    final ticker = exchangeViewModel
-                                        .receiveCurrency.title.toLowerCase();
-                                    exchangeViewModel.receiveAddress =
-                                    await fetchParsedAddress(
-                                        context, domain, ticker);
-                                  },
-                                )),
-                          )
-                        ],
-                      ),
-                    ),
+                    _exchangeCardsSection(context),
                     Padding(
                       padding: EdgeInsets.only(top: 12, left: 24),
                       child: Row(
@@ -427,50 +265,9 @@ class ExchangePage extends BasePage {
       
             return Row(
               children: <Widget>[
-                GestureDetector(
-                  onTap: () =>
-                      Navigator.of(context).pushNamed(Routes.exchangeTemplate),
-                  child: Container(
-                    padding: EdgeInsets.only(left: 1, right: 10),
-                    child: DottedBorder(
-                      borderType: BorderType.RRect,
-                      dashPattern: [6, 4],
-                      color: Theme.of(context)
-                          .primaryTextTheme!
-                          .headline3!
-                          .decorationColor!,
-                      strokeWidth: 2,
-                      radius: Radius.circular(20),
-                      child: Container(
-                        height: 34,
-                        padding: EdgeInsets.only(left: 10, right: 10),
-                        alignment: Alignment.center,
-                        decoration: BoxDecoration(
-                          borderRadius: BorderRadius.all(Radius.circular(20)),
-                          color: Colors.transparent,
-                        ),
-                        child: templates.length >= 1
-                            ? Icon(
-                                Icons.add,
-                                color: Theme.of(context)
-                                    .primaryTextTheme!
-                                    .headline2!
-                                    .color!,
-                              )
-                            : Text(
-                                S.of(context).new_template,
-                                style: TextStyle(
-                                  fontSize: 14,
-                                  fontWeight: FontWeight.w600,
-                                  color: Theme.of(context)
-                                      .primaryTextTheme!
-                                      .headline2!
-                                      .color!,
-                                ),
-                              ),
-                      ),
-                    ),
-                  ),
+                AddTemplateButton(
+                  onTap: () => Navigator.of(context).pushNamed(Routes.exchangeTemplate),
+                  currentTemplatesLength: templates.length,
                 ),
                 ListView.builder(
                   scrollDirection: Axis.horizontal,
@@ -549,6 +346,10 @@ class ExchangePage extends BasePage {
       return;
     }
 
+     if (exchangeViewModel.isLowFee) {
+      _showFeeAlert(context);
+    }
+
     final depositAddressController = depositKey.currentState!.addressController;
     final depositAmountController = depositKey.currentState!.amountController;
     final receiveAddressController = receiveKey.currentState!.addressController;
@@ -686,8 +487,7 @@ class ExchangePage extends BasePage {
     depositAmountController.addListener(() {
       if (depositAmountController.text != exchangeViewModel.depositAmount) {
         _depositAmountDebounce.run(() { 
-          exchangeViewModel.changeDepositAmount(
-              amount: depositAmountController.text);
+          exchangeViewModel.changeDepositAmount(amount: depositAmountController.text);
           exchangeViewModel.isReceiveAmountEntered = false;
         });
       }
@@ -699,8 +499,7 @@ class ExchangePage extends BasePage {
     receiveAmountController.addListener(() {
       if (receiveAmountController.text != exchangeViewModel.receiveAmount) {
         _receiveAmountDebounce.run(() {
-          exchangeViewModel.changeReceiveAmount(
-              amount: receiveAmountController.text);
+          exchangeViewModel.changeReceiveAmount(amount: receiveAmountController.text);
           exchangeViewModel.isReceiveAmountEntered = true;
         });
       }
@@ -808,5 +607,140 @@ class ExchangePage extends BasePage {
     }
   }
 
-  void disposeBestRateSync() => exchangeViewModel.bestRateSync?.cancel();
+  void disposeBestRateSync() => exchangeViewModel.bestRateSync.cancel();
+
+  Widget _exchangeCardsSection(BuildContext context) {
+    final firstExchangeCard = Observer(builder: (_) => ExchangeCard(
+      onDispose: disposeBestRateSync,
+      hasAllAmount: exchangeViewModel.hasAllAmount,
+      allAmount: exchangeViewModel.hasAllAmount
+          ? () => exchangeViewModel.calculateDepositAllAmount()
+          : null,
+      amountFocusNode: _depositAmountFocus,
+      addressFocusNode: _depositAddressFocus,
+      key: depositKey,
+      title: S.of(context).you_will_send,
+      initialCurrency: exchangeViewModel.depositCurrency,
+      initialWalletName: depositWalletName ?? '',
+      initialAddress:
+      exchangeViewModel.depositCurrency == exchangeViewModel.wallet.currency
+          ? exchangeViewModel.wallet.walletAddresses.address
+          : exchangeViewModel.depositAddress,
+      initialIsAmountEditable: true,
+      initialIsAddressEditable: exchangeViewModel.isDepositAddressEnabled,
+      isAmountEstimated: false,
+      hasRefundAddress: true,
+      isMoneroWallet: exchangeViewModel.isMoneroWallet,
+      currencies: exchangeViewModel.depositCurrencies,
+      onCurrencySelected: (currency) {
+        // FIXME: need to move it into view model
+        if (currency == CryptoCurrency.xmr &&
+            exchangeViewModel.wallet.type != WalletType.monero) {
+          showPopUp<void>(
+              context: context,
+              builder: (dialogContext) {
+                return AlertWithOneAction(
+                    alertTitle: S.of(context).error,
+                    alertContent:
+                    S.of(context).exchange_incorrect_current_wallet_for_xmr,
+                    buttonText: S.of(context).ok,
+                    buttonAction: () => Navigator.of(dialogContext).pop());
+              });
+          return;
+        }
+
+        exchangeViewModel.changeDepositCurrency(currency: currency);
+      },
+      imageArrow: arrowBottomPurple,
+      currencyButtonColor: Colors.transparent,
+      addressButtonsColor: Theme.of(context).focusColor!,
+      borderColor: Theme.of(context).primaryTextTheme!.bodyText1!.color!,
+      currencyValueValidator: (value) {
+        return !exchangeViewModel.isFixedRateMode
+            ? AmountValidator(
+                isAutovalidate: true,
+                currency: exchangeViewModel.depositCurrency,
+                minValue: exchangeViewModel.limits.min.toString(),
+                maxValue: exchangeViewModel.limits.max.toString(),
+              ).call(value)
+            : null;
+      },
+      addressTextFieldValidator:
+      AddressValidator(type: exchangeViewModel.depositCurrency),
+      onPushPasteButton: (context) async {
+        final domain = exchangeViewModel.depositAddress;
+        final ticker = exchangeViewModel.depositCurrency.title.toLowerCase();
+        exchangeViewModel.depositAddress =
+        await fetchParsedAddress(context, domain, ticker);
+      },
+      onPushAddressBookButton: (context) async {
+        final domain = exchangeViewModel.depositAddress;
+        final ticker = exchangeViewModel.depositCurrency.title.toLowerCase();
+        exchangeViewModel.depositAddress =
+        await fetchParsedAddress(context, domain, ticker);
+      },
+    ));
+
+    final secondExchangeCard = Observer(builder: (_) => ExchangeCard(
+      onDispose: disposeBestRateSync,
+      amountFocusNode: _receiveAmountFocus,
+      addressFocusNode: _receiveAddressFocus,
+      key: receiveKey,
+      title: S.of(context).you_will_get,
+      initialCurrency: exchangeViewModel.receiveCurrency,
+      initialWalletName: receiveWalletName ?? '',
+      initialAddress:
+      exchangeViewModel.receiveCurrency == exchangeViewModel.wallet.currency
+          ? exchangeViewModel.wallet.walletAddresses.address
+          : exchangeViewModel.receiveAddress,
+      initialIsAmountEditable: exchangeViewModel.isReceiveAmountEditable,
+      initialIsAddressEditable: exchangeViewModel.isReceiveAddressEnabled,
+      isAmountEstimated: true,
+      isMoneroWallet: exchangeViewModel.isMoneroWallet,
+      currencies: exchangeViewModel.receiveCurrencies,
+      onCurrencySelected: (currency) =>
+          exchangeViewModel.changeReceiveCurrency(currency: currency),
+      imageArrow: arrowBottomCakeGreen,
+      currencyButtonColor: Colors.transparent,
+      addressButtonsColor: Theme.of(context).focusColor!,
+      borderColor:
+      Theme.of(context).primaryTextTheme!.bodyText1!.decorationColor!,
+      currencyValueValidator: (value) {
+        return exchangeViewModel.isFixedRateMode
+            ? AmountValidator(
+                isAutovalidate: true,
+                currency: exchangeViewModel.receiveCurrency,
+                minValue: exchangeViewModel.limits.min.toString(),
+                maxValue: exchangeViewModel.limits.max.toString(),
+              ).call(value)
+            : null;
+      },
+      addressTextFieldValidator:
+      AddressValidator(type: exchangeViewModel.receiveCurrency),
+      onPushPasteButton: (context) async {
+        final domain = exchangeViewModel.receiveAddress;
+        final ticker = exchangeViewModel.receiveCurrency.title.toLowerCase();
+        exchangeViewModel.receiveAddress =
+        await fetchParsedAddress(context, domain, ticker);
+      },
+      onPushAddressBookButton: (context) async {
+        final domain = exchangeViewModel.receiveAddress;
+        final ticker = exchangeViewModel.receiveCurrency.title.toLowerCase();
+        exchangeViewModel.receiveAddress =
+        await fetchParsedAddress(context, domain, ticker);
+      },
+    ));
+
+    if (ResponsiveLayoutUtil.instance.isMobile(context)) {
+      return MobileExchangeCardsSection(
+        firstExchangeCard: firstExchangeCard,
+        secondExchangeCard: secondExchangeCard,
+      );
+    }
+
+    return DesktopExchangeCardsSection(
+      firstExchangeCard: firstExchangeCard,
+      secondExchangeCard: secondExchangeCard,
+    );
+  }
 }
diff --git a/lib/src/screens/exchange/exchange_template_page.dart b/lib/src/screens/exchange/exchange_template_page.dart
index 67b4b3605..50faf7eb2 100644
--- a/lib/src/screens/exchange/exchange_template_page.dart
+++ b/lib/src/screens/exchange/exchange_template_page.dart
@@ -1,13 +1,9 @@
-import 'dart:ui';
 import 'package:cake_wallet/exchange/exchange_provider.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:keyboard_actions/keyboard_actions.dart';
-import 'package:keyboard_actions/keyboard_actions_config.dart';
-import 'package:keyboard_actions/keyboard_actions_item.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cw_core/crypto_currency.dart';
@@ -78,7 +74,7 @@ class ExchangeTemplatePage extends BasePage {
         config: KeyboardActionsConfig(
             keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
             keyboardBarColor:
-                Theme.of(context).accentTextTheme!.bodyText1!.backgroundColor!,
+                Theme.of(context).accentTextTheme.bodyText1!.backgroundColor!,
             nextFocus: false,
             actions: [
               KeyboardActionsItem(
@@ -103,115 +99,114 @@ class ExchangeTemplatePage extends BasePage {
                   ),
                   gradient: LinearGradient(
                       colors: [
-                        Theme.of(context).primaryTextTheme!.bodyText2!.color!,
-                        Theme.of(context).primaryTextTheme!.bodyText2!.decorationColor!,
+                        Theme.of(context).primaryTextTheme.bodyText2!.color!,
+                        Theme.of(context).primaryTextTheme.bodyText2!.decorationColor!,
                       ],
                       stops: [0.35, 1.0],
                       begin: Alignment.topLeft,
                       end: Alignment.bottomRight),
                 ),
-                child: Column(
-                  children: <Widget>[
-                    Container(
-                      decoration: BoxDecoration(
-                        borderRadius: BorderRadius.only(
-                            bottomLeft: Radius.circular(24),
-                            bottomRight: Radius.circular(24)
+                child: FocusTraversalGroup(
+                  policy: OrderedTraversalPolicy(),
+                  child: Column(
+                    children: <Widget>[
+                      Container(
+                        decoration: BoxDecoration(
+                          borderRadius: BorderRadius.only(
+                              bottomLeft: Radius.circular(24),
+                              bottomRight: Radius.circular(24)
+                          ),
+                          gradient: LinearGradient(
+                              colors: [
+                                Theme.of(context)
+                                    .primaryTextTheme.subtitle2!
+                                    .color!,
+                                Theme.of(context)
+                                    .primaryTextTheme.subtitle2!
+                                    .decorationColor!,
+                              ],
+                              begin: Alignment.topLeft,
+                              end: Alignment.bottomRight),
                         ),
-                        gradient: LinearGradient(
-                            colors: [
-                              Theme.of(context)
-                                  .primaryTextTheme!
-                                  .subtitle2!
-                                  .color!,
-                              Theme.of(context)
-                                  .primaryTextTheme!
-                                  .subtitle2!
-                                  .decorationColor!,
-                            ],
-                            begin: Alignment.topLeft,
-                            end: Alignment.bottomRight),
-                      ),
-                      padding: EdgeInsets.fromLTRB(24, 90, 24, 32),
-                      child: Observer(
-                        builder: (_) => ExchangeCard(
-                          amountFocusNode: _depositAmountFocus,
-                          key: depositKey,
-                          title: S.of(context).you_will_send,
-                          initialCurrency:
-                          exchangeViewModel.depositCurrency,
-                          initialWalletName: depositWalletName ?? '',
-                          initialAddress: exchangeViewModel
-                              .depositCurrency ==
-                              exchangeViewModel.wallet.currency
-                              ? exchangeViewModel.wallet.walletAddresses.address
-                              : exchangeViewModel.depositAddress,
-                          initialIsAmountEditable: true,
-                          initialIsAddressEditable: exchangeViewModel
-                              .isDepositAddressEnabled,
-                          isAmountEstimated: false,
-                          hasRefundAddress: true,
-                          isMoneroWallet: exchangeViewModel.isMoneroWallet,
-                          currencies: CryptoCurrency.all,
-                          onCurrencySelected: (currency) =>
-                              exchangeViewModel.changeDepositCurrency(
-                                  currency: currency),
-                          imageArrow: arrowBottomPurple,
-                          currencyButtonColor: Colors.transparent,
-                          addressButtonsColor:
-                          Theme.of(context).focusColor!,
-                          borderColor: Theme.of(context)
-                              .primaryTextTheme!
-                              .bodyText1!
-                              .color!,
-                          currencyValueValidator: AmountValidator(
-                              currency: exchangeViewModel.depositCurrency),
-                          //addressTextFieldValidator: AddressValidator(
-                          //    type: exchangeViewModel.depositCurrency),
-                        ),
-                      ),
-                    ),
-                    Padding(
-                      padding: EdgeInsets.only(top: 29, left: 24, right: 24),
-                      child: Observer(
+                        padding: EdgeInsets.fromLTRB(24, 100, 24, 32),
+                        child: Observer(
                           builder: (_) => ExchangeCard(
-                            amountFocusNode: _receiveAmountFocus,
-                            key: receiveKey,
-                            title: S.of(context).you_will_get,
+                            amountFocusNode: _depositAmountFocus,
+                            key: depositKey,
+                            title: S.of(context).you_will_send,
                             initialCurrency:
-                            exchangeViewModel.receiveCurrency,
-                            initialWalletName: receiveWalletName ?? '',
-                            initialAddress:
-                            exchangeViewModel.receiveCurrency ==
+                            exchangeViewModel.depositCurrency,
+                            initialWalletName: depositWalletName ?? '',
+                            initialAddress: exchangeViewModel
+                                .depositCurrency ==
                                 exchangeViewModel.wallet.currency
                                 ? exchangeViewModel.wallet.walletAddresses.address
-                                : exchangeViewModel.receiveAddress,
-                            initialIsAmountEditable:
-                            exchangeViewModel.provider is
-                            XMRTOExchangeProvider ? true : false,
-                            initialIsAddressEditable:
-                            exchangeViewModel.isReceiveAddressEnabled,
-                            isAmountEstimated: true,
+                                : exchangeViewModel.depositAddress,
+                            initialIsAmountEditable: true,
+                            initialIsAddressEditable: exchangeViewModel
+                                .isDepositAddressEnabled,
+                            isAmountEstimated: false,
+                            hasRefundAddress: true,
                             isMoneroWallet: exchangeViewModel.isMoneroWallet,
-                            currencies: exchangeViewModel.receiveCurrencies,
+                            currencies: CryptoCurrency.all,
                             onCurrencySelected: (currency) =>
-                                exchangeViewModel.changeReceiveCurrency(
+                                exchangeViewModel.changeDepositCurrency(
                                     currency: currency),
-                            imageArrow: arrowBottomCakeGreen,
+                            imageArrow: arrowBottomPurple,
                             currencyButtonColor: Colors.transparent,
                             addressButtonsColor:
-                            Theme.of(context).focusColor!,
+                            Theme.of(context).focusColor,
                             borderColor: Theme.of(context)
-                                .primaryTextTheme!
-                                .bodyText1!
-                                .decorationColor!,
+                                .primaryTextTheme.bodyText1!
+                                .color!,
                             currencyValueValidator: AmountValidator(
-                                currency: exchangeViewModel.receiveCurrency),
+                                currency: exchangeViewModel.depositCurrency),
                             //addressTextFieldValidator: AddressValidator(
-                            //    type: exchangeViewModel.receiveCurrency),
-                          )),
-                    )
-                  ],
+                            //    type: exchangeViewModel.depositCurrency),
+                          ),
+                        ),
+                      ),
+                      Padding(
+                        padding: EdgeInsets.only(top: 29, left: 24, right: 24),
+                        child: Observer(
+                            builder: (_) => ExchangeCard(
+                              amountFocusNode: _receiveAmountFocus,
+                              key: receiveKey,
+                              title: S.of(context).you_will_get,
+                              initialCurrency:
+                              exchangeViewModel.receiveCurrency,
+                              initialWalletName: receiveWalletName ?? '',
+                              initialAddress:
+                              exchangeViewModel.receiveCurrency ==
+                                  exchangeViewModel.wallet.currency
+                                  ? exchangeViewModel.wallet.walletAddresses.address
+                                  : exchangeViewModel.receiveAddress,
+                              initialIsAmountEditable:
+                              exchangeViewModel.provider is
+                              XMRTOExchangeProvider ? true : false,
+                              initialIsAddressEditable:
+                              exchangeViewModel.isReceiveAddressEnabled,
+                              isAmountEstimated: true,
+                              isMoneroWallet: exchangeViewModel.isMoneroWallet,
+                              currencies: exchangeViewModel.receiveCurrencies,
+                              onCurrencySelected: (currency) =>
+                                  exchangeViewModel.changeReceiveCurrency(
+                                      currency: currency),
+                              imageArrow: arrowBottomCakeGreen,
+                              currencyButtonColor: Colors.transparent,
+                              addressButtonsColor:
+                              Theme.of(context).focusColor,
+                              borderColor: Theme.of(context)
+                                  .primaryTextTheme.bodyText1!
+                                  .decorationColor!,
+                              currencyValueValidator: AmountValidator(
+                                  currency: exchangeViewModel.receiveCurrency),
+                              //addressTextFieldValidator: AddressValidator(
+                              //    type: exchangeViewModel.receiveCurrency),
+                            )),
+                      )
+                    ],
+                  ),
                 ),
               ),
               bottomSectionPadding:
@@ -230,8 +225,7 @@ class ExchangeTemplatePage extends BasePage {
                         textAlign: TextAlign.center,
                         style: TextStyle(
                             color: Theme.of(context)
-                                .primaryTextTheme!
-                                .headline1!
+                                .primaryTextTheme.headline1!
                                 .decorationColor!,
                             fontWeight: FontWeight.w500,
                             fontSize: 12),
diff --git a/lib/src/screens/exchange/widgets/currency_picker.dart b/lib/src/screens/exchange/widgets/currency_picker.dart
index 442ee1b24..0fe1d4e67 100644
--- a/lib/src/screens/exchange/widgets/currency_picker.dart
+++ b/lib/src/screens/exchange/widgets/currency_picker.dart
@@ -1,14 +1,8 @@
-import 'dart:ui';
-import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker_item_widget.dart';
-import 'package:cake_wallet/src/screens/exchange/widgets/picker_item.dart';
-import 'package:cake_wallet/src/widgets/alert_close_button.dart';
-import 'package:cw_core/currency.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:cake_wallet/src/screens/exchange/widgets/picker_item.dart';
 import 'package:cw_core/crypto_currency.dart';
-import 'package:cake_wallet/src/widgets/alert_background.dart';
-import 'package:cake_wallet/palette.dart';
-import 'currency_picker_widget.dart';
+import 'package:cake_wallet/src/widgets/picker.dart';
+import 'package:cw_core/currency.dart';
 
 class CurrencyPicker extends StatefulWidget {
   CurrencyPicker(
@@ -20,7 +14,7 @@ class CurrencyPicker extends StatefulWidget {
       this.isMoneroWallet = false,
       this.isConvertFrom = false});
 
-  int selectedAtIndex;
+  final int selectedAtIndex;
   final List<Currency> items;
   final String? title;
   final Function(Currency) onItemSelected;
@@ -36,146 +30,39 @@ class CurrencyPickerState extends State<CurrencyPicker> {
   CurrencyPickerState(this.items)
       : isSearchBarActive = false,
         textFieldValue = '',
-        subPickerItemsList = items,
-        appBarTextStyle =
-          TextStyle(fontSize: 20, fontFamily: 'Lato', backgroundColor: Colors.transparent, color: Colors.white),
-        pickerItemsList = <PickerItem<Currency>>[];
+        appBarTextStyle = TextStyle(
+            fontSize: 20,
+            fontFamily: 'Lato',
+            backgroundColor: Colors.transparent,
+            color: Colors.white),
+        pickerItemsList = <PickerItem<CryptoCurrency>>[];
 
   List<PickerItem<Currency>> pickerItemsList;
   List<Currency> items;
   bool isSearchBarActive;
   String textFieldValue;
-  List<Currency> subPickerItemsList;
   TextStyle appBarTextStyle;
 
-  void cleanSubPickerItemsList() => subPickerItemsList = items;
-
-  void currencySearchBySubstring(String subString) {
-    setState(() {
-      if (subString.isNotEmpty) {
-        subPickerItemsList = items
-            .where((element) =>
-        element.name.toLowerCase().contains(subString.toLowerCase()) ||
-            (element.tag != null ? element.tag!.toLowerCase().contains(subString.toLowerCase()) : false) ||
-            (element.fullName != null ? element.fullName!.toLowerCase().contains(subString.toLowerCase()) : false))
-            .toList();
-        return;
-      }
-      cleanSubPickerItemsList();
-    });
+  bool currencySearchBySubstring(Currency currency, String subString) {
+    return currency.name.toLowerCase().contains(subString.toLowerCase()) ||
+        (currency.tag != null
+            ? currency.tag!.toLowerCase().contains(subString.toLowerCase())
+            : false) ||
+        (currency.fullName != null
+            ? currency.fullName!.toLowerCase().contains(subString.toLowerCase())
+            : false);
   }
 
   @override
   Widget build(BuildContext context) {
-    return AlertBackground(
-      child: Stack(
-        alignment: Alignment.center,
-        children: [
-          Column(
-            mainAxisSize: MainAxisSize.min,
-            children: <Widget>[
-              if (widget.title?.isNotEmpty ?? false)
-                Container(
-                  padding: EdgeInsets.symmetric(horizontal: 24),
-                  child: Text(
-                    widget.title!,
-                    textAlign: TextAlign.center,
-                    style: TextStyle(
-                      fontSize: 18,
-                      fontFamily: 'Lato',
-                      fontWeight: FontWeight.bold,
-                      decoration: TextDecoration.none,
-                      color: Colors.white,
-                    ),
-                  ),
-                ),
-              Padding(
-                padding: EdgeInsets.only(left: 24, right: 24, top: 24),
-                child: ClipRRect(
-                  borderRadius: BorderRadius.all(Radius.circular(30)),
-                  child: Container(
-                    color: Theme.of(context).accentTextTheme!.headline6!.color!,
-                    child: ConstrainedBox(
-                      constraints: BoxConstraints(
-                        maxHeight: MediaQuery.of(context).size.height * 0.65,
-                      ),
-                      child: Column(
-                        mainAxisSize: MainAxisSize.min,
-                        children: [
-                          if (widget.hintText != null)
-                            Padding(
-                              padding: const EdgeInsets.all(16),
-                              child: TextFormField(
-                                style: TextStyle(color: Palette.darkBlueCraiola),
-                                decoration: InputDecoration(
-                                  hintText: widget.hintText,
-                                  prefixIcon: Image.asset("assets/images/search_icon.png"),
-                                  filled: true,
-                                  fillColor: const Color(0xffF2F0FA),
-                                  alignLabelWithHint: false,
-                                  contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
-                                  enabledBorder: OutlineInputBorder(
-                                      borderRadius: BorderRadius.circular(14),
-                                      borderSide: const BorderSide(
-                                        color: Colors.transparent,
-                                      )),
-                                  focusedBorder: OutlineInputBorder(
-                                      borderRadius: BorderRadius.circular(14),
-                                      borderSide: const BorderSide(
-                                        color: Colors.transparent,
-                                      )),
-                                ),
-                                onChanged: (value) {
-                                  this.textFieldValue = value;
-                                  cleanSubPickerItemsList();
-                                  currencySearchBySubstring(textFieldValue);
-                                },
-                              ),
-                            ),
-                          Divider(
-                            color: Theme.of(context).accentTextTheme!.headline6!.backgroundColor!,
-                            height: 1,
-                          ),
-                          if (widget.selectedAtIndex != -1)
-                            AspectRatio(
-                              aspectRatio: 6,
-                              child: PickerItemWidget(
-                                title: items[widget.selectedAtIndex].name,
-                                iconPath: items[widget.selectedAtIndex].iconPath,
-                                isSelected: true,
-                                tag: items[widget.selectedAtIndex].tag,
-                              ),
-                            ),
-                          Flexible(
-                            child: CurrencyPickerWidget(
-                              crossAxisCount: 2,
-                              selectedAtIndex: widget.selectedAtIndex,
-                              pickerItemsList: subPickerItemsList,
-                              pickListItem: (int index) {
-                                setState(() {
-                                  widget.selectedAtIndex = index;
-                                });
-                                widget.onItemSelected(subPickerItemsList[index]);
-                                if (widget.isConvertFrom &&
-                                    !widget.isMoneroWallet &&
-                                    (subPickerItemsList[index] == CryptoCurrency.xmr)) {
-                                } else {
-                                  Navigator.of(context).pop();
-                                }
-                              },
-                            ),
-                          ),
-                        ],
-                      ),
-                    ),
-                  ),
-                ),
-              ),
-            ],
-          ),
-          AlertCloseButton(),
-        ],
-      ),
+    return Picker(
+      selectedAtIndex: widget.selectedAtIndex,
+      items: items,
+      isGridView: true,
+      title: widget.title,
+      hintText: widget.hintText,
+      matchingCriteria: currencySearchBySubstring,
+      onItemSelected: widget.onItemSelected,
     );
   }
 }
diff --git a/lib/src/screens/exchange/widgets/desktop_exchange_cards_section.dart b/lib/src/screens/exchange/widgets/desktop_exchange_cards_section.dart
new file mode 100644
index 000000000..0a97d7bad
--- /dev/null
+++ b/lib/src/screens/exchange/widgets/desktop_exchange_cards_section.dart
@@ -0,0 +1,31 @@
+import 'package:flutter/material.dart';
+
+class DesktopExchangeCardsSection extends StatelessWidget {
+  final Widget firstExchangeCard;
+  final Widget secondExchangeCard;
+
+  const DesktopExchangeCardsSection({
+    Key? key,
+    required this.firstExchangeCard,
+    required this.secondExchangeCard,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return FocusTraversalGroup(
+      policy: OrderedTraversalPolicy(),
+      child: Column(
+        children: <Widget>[
+          Padding(
+            padding: EdgeInsets.only(top: 55, left: 24, right: 24),
+            child: firstExchangeCard,
+          ),
+          Padding(
+            padding: EdgeInsets.only(top: 29, left: 24, right: 24),
+            child: secondExchangeCard,
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/exchange/widgets/exchange_card.dart b/lib/src/screens/exchange/widgets/exchange_card.dart
index 2bacbac3c..ae92fa0c1 100644
--- a/lib/src/screens/exchange/widgets/exchange_card.dart
+++ b/lib/src/screens/exchange/widgets/exchange_card.dart
@@ -160,7 +160,7 @@ class ExchangeCardState extends State<ExchangeCard> {
     final copyImage = Image.asset('assets/images/copy_content.png',
         height: 16,
         width: 16,
-        color: Theme.of(context).primaryTextTheme!.headline3!.color!);
+        color: Theme.of(context).primaryTextTheme.headline3!.color!);
 
     return Container(
       width: double.infinity,
@@ -175,7 +175,7 @@ class ExchangeCardState extends State<ExchangeCard> {
               style: TextStyle(
                   fontSize: 18,
                   fontWeight: FontWeight.w600,
-                  color: Theme.of(context).textTheme!.headline5!.color!),
+                  color: Theme.of(context).textTheme.headline5!.color!),
             )
           ],
         ),
@@ -210,7 +210,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                   child: Container(
                     height: 32,
                     decoration: BoxDecoration(
-                        color: widget.addressButtonsColor ?? Theme.of(context).primaryTextTheme!.headline4!.color!,
+                        color: widget.addressButtonsColor ?? Theme.of(context).primaryTextTheme.headline4!.color!,
                         borderRadius:
                         BorderRadius.all(Radius.circular(6))),
                     child: Center(
@@ -221,8 +221,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                                 fontSize: 12,
                                 fontWeight: FontWeight.bold,
                                 color: Theme.of(context)
-                                    .primaryTextTheme!
-                                    .headline4!
+                                    .primaryTextTheme.headline4!
                                     .decorationColor!)),
                       ),
                     ),
@@ -241,34 +240,36 @@ class ExchangeCardState extends State<ExchangeCard> {
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
                     children: [
                       Flexible(
-                        child: BaseTextFormField(
-                            focusNode: widget.amountFocusNode,
-                            controller: amountController,
-                            enabled: _isAmountEditable,
-                            textAlign: TextAlign.left,
-                            keyboardType: TextInputType.numberWithOptions(
-                                signed: false, decimal: true),
-                            inputFormatters: [
-                              FilteringTextInputFormatter.deny(
-                                  RegExp('[\\-|\\ ]'))
-                            ],
-                            hintText: '0.0000',
-                            borderColor: Colors.transparent,
-                            //widget.borderColor,
-                            textStyle: TextStyle(
-                                fontSize: 16,
-                                fontWeight: FontWeight.w600,
-                                color: Colors.white),
-                            placeholderTextStyle: TextStyle(
-                                fontSize: 16,
-                                fontWeight: FontWeight.w600,
-                                color: Theme.of(context)
-                                    .accentTextTheme!
-                                    .headline1!
-                                    .decorationColor!),
-                            validator: _isAmountEditable
-                                ? widget.currencyValueValidator
-                                : null),
+                        child: FocusTraversalOrder(
+                          order: NumericFocusOrder(1),
+                          child: BaseTextFormField(
+                              focusNode: widget.amountFocusNode,
+                              controller: amountController,
+                              enabled: _isAmountEditable,
+                              textAlign: TextAlign.left,
+                              keyboardType: TextInputType.numberWithOptions(
+                                  signed: false, decimal: true),
+                              inputFormatters: [
+                                FilteringTextInputFormatter.deny(
+                                    RegExp('[\\-|\\ ]'))
+                              ],
+                              hintText: '0.0000',
+                              borderColor: Colors.transparent,
+                              //widget.borderColor,
+                              textStyle: TextStyle(
+                                  fontSize: 16,
+                                  fontWeight: FontWeight.w600,
+                                  color: Colors.white),
+                              placeholderTextStyle: TextStyle(
+                                  fontSize: 16,
+                                  fontWeight: FontWeight.w600,
+                                  color: Theme.of(context)
+                                      .accentTextTheme.headline1!
+                                      .decorationColor!),
+                              validator: _isAmountEditable
+                                  ? widget.currencyValueValidator
+                                  : null),
+                        ),
                       ),
                       if (widget.hasAllAmount)
                         Container(
@@ -276,8 +277,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                           width: 32,
                           decoration: BoxDecoration(
                               color: Theme.of(context)
-                                  .primaryTextTheme!
-                                  .headline4!
+                                  .primaryTextTheme.headline4!
                                   .color!,
                               borderRadius:
                               BorderRadius.all(Radius.circular(6))),
@@ -290,8 +290,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                                       fontSize: 12,
                                       fontWeight: FontWeight.bold,
                                       color: Theme.of(context)
-                                          .primaryTextTheme!
-                                          .headline4!
+                                          .primaryTextTheme.headline4!
                                           .decorationColor!)),
                             ),
                           ),
@@ -302,8 +301,7 @@ class ExchangeCardState extends State<ExchangeCard> {
               ],
             )),
         Divider(height: 1,color: Theme.of(context)
-            .primaryTextTheme!
-            .headline5!
+            .primaryTextTheme.headline5!
             .decorationColor!),
         Padding(
           padding: EdgeInsets.only(top: 5),
@@ -321,8 +319,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                                 fontSize: 10,
                                 height: 1.2,
                                 color: Theme.of(context)
-                                    .accentTextTheme!
-                                    .headline1!
+                                    .accentTextTheme.headline1!
                                     .decorationColor!),
                           )
                         : Offstage(),
@@ -336,8 +333,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                                 fontSize: 10,
                                 height: 1.2,
                                 color: Theme.of(context)
-                                    .accentTextTheme!
-                                    .headline1!
+                                    .accentTextTheme.headline1!
                                     .decorationColor!))
                         : Offstage(),
                   ])),
@@ -351,71 +347,74 @@ class ExchangeCardState extends State<ExchangeCard> {
                       fontSize: 14,
                       fontWeight: FontWeight.w500,
                       color: Theme.of(context)
-                          .accentTextTheme!
-                          .headline1!
+                          .accentTextTheme.headline1!
                           .decorationColor!),
                 ))
             : Offstage(),
         _isAddressEditable
-            ? Padding(
-                padding: EdgeInsets.only(top: 20),
-                child: AddressTextField(
-                    focusNode: widget.addressFocusNode,
-                    controller: addressController,
-                    onURIScanned: (uri) {
-                      final paymentRequest = PaymentRequest.fromUri(uri);
-                      addressController.text = paymentRequest.address;
-
-                      if (amountController.text.isNotEmpty) {
-                        _showAmountPopup(context, paymentRequest);
-                        return;
-                      }
-                      widget.amountFocusNode?.requestFocus();
-                        amountController.text = paymentRequest.amount;
-                    },
-                    placeholder: widget.hasRefundAddress
-                        ? S.of(context).refund_address
-                        : null,
-                    options: [
-                      AddressTextFieldOption.paste,
-                      AddressTextFieldOption.qrCode,
-                      AddressTextFieldOption.addressBook,
-                    ],
-                    isBorderExist: false,
-                    textStyle: TextStyle(
-                        fontSize: 16,
-                        fontWeight: FontWeight.w600,
-                        color: Colors.white),
-                    hintStyle: TextStyle(
-                        fontSize: 16,
-                        fontWeight: FontWeight.w600,
-                        color: Theme.of(context)
-                            .accentTextTheme!
-                            .headline1!
-                            .decorationColor!),
-                    buttonColor: widget.addressButtonsColor,
-                    validator: widget.addressTextFieldValidator,
-                    onPushPasteButton: widget.onPushPasteButton,
-                    onPushAddressBookButton: widget.onPushAddressBookButton,
-                    selectedCurrency: _selectedCurrency
+            ? FocusTraversalOrder(
+                order: NumericFocusOrder(2),         
+                child: Padding(
+                  padding: EdgeInsets.only(top: 20),
+                  child: AddressTextField(
+                      focusNode: widget.addressFocusNode,
+                      controller: addressController,
+                      onURIScanned: (uri) {
+                        final paymentRequest = PaymentRequest.fromUri(uri);
+                        addressController.text = paymentRequest.address;
+            
+                        if (amountController.text.isNotEmpty) {
+                          _showAmountPopup(context, paymentRequest);
+                          return;
+                        }
+                        widget.amountFocusNode?.requestFocus();
+                          amountController.text = paymentRequest.amount;
+                      },
+                      placeholder: widget.hasRefundAddress
+                          ? S.of(context).refund_address
+                          : null,
+                      options: [
+                        AddressTextFieldOption.paste,
+                        AddressTextFieldOption.qrCode,
+                        AddressTextFieldOption.addressBook,
+                      ],
+                      isBorderExist: false,
+                      textStyle: TextStyle(
+                          fontSize: 16,
+                          fontWeight: FontWeight.w600,
+                          color: Colors.white),
+                      hintStyle: TextStyle(
+                          fontSize: 16,
+                          fontWeight: FontWeight.w600,
+                          color: Theme.of(context)
+                              .accentTextTheme.headline1!
+                              .decorationColor!),
+                      buttonColor: widget.addressButtonsColor,
+                      validator: widget.addressTextFieldValidator,
+                      onPushPasteButton: widget.onPushPasteButton,
+                      onPushAddressBookButton: widget.onPushAddressBookButton,
+                      selectedCurrency: _selectedCurrency
+                  ),
+            
                 ),
-
-              )
+            )
             : Padding(
                 padding: EdgeInsets.only(top: 10),
                 child: Builder(
                     builder: (context) => Stack(children: <Widget>[
-                          BaseTextFormField(
-                              controller: addressController,
-                              readOnly: true,
-                              borderColor: Colors.transparent,
-                              suffixIcon:
-                                  SizedBox(width: _isMoneroWallet ? 80 : 36),
-                              textStyle: TextStyle(
-                                  fontSize: 16,
-                                  fontWeight: FontWeight.w600,
-                                  color: Colors.white),
-                              validator: widget.addressTextFieldValidator),
+                    FocusTraversalOrder(
+                      order: NumericFocusOrder(3),
+                      child: BaseTextFormField(
+                          controller: addressController,
+                          borderColor: Colors.transparent,
+                          suffixIcon:
+                              SizedBox(width: _isMoneroWallet ? 80 : 36),
+                          textStyle: TextStyle(
+                              fontSize: 16,
+                              fontWeight: FontWeight.w600,
+                              color: Colors.white),
+                          validator: widget.addressTextFieldValidator),
+                          ),
                           Positioned(
                               top: 2,
                               right: 0,
@@ -432,10 +431,11 @@ class ExchangeCardState extends State<ExchangeCard> {
                                             child: InkWell(
                                               onTap: () async {
                                                 final contact =
-                                                    await Navigator.of(context,
-                                                            rootNavigator: true)
-                                                        .pushNamed(Routes
-                                                            .pickerAddressBook);
+                                                    await Navigator.of(context)
+                                                    .pushNamed(
+                                                  Routes.pickerAddressBook,
+                                                  arguments: widget.initialCurrency,
+                                                );
 
                                                 if (contact is ContactBase &&
                                                     contact.address != null) {
@@ -458,8 +458,7 @@ class ExchangeCardState extends State<ExchangeCard> {
                                                   child: Image.asset(
                                                     'assets/images/open_book.png',
                                                     color: Theme.of(context)
-                                                        .primaryTextTheme!
-                                                        .headline4!
+                                                        .primaryTextTheme.headline4!
                                                         .decorationColor!,
                                                   )),
                                             )),
diff --git a/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart b/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart
new file mode 100644
index 000000000..762c36a55
--- /dev/null
+++ b/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart
@@ -0,0 +1,58 @@
+import 'package:flutter/material.dart';
+
+class MobileExchangeCardsSection extends StatelessWidget {
+  final Widget firstExchangeCard;
+  final Widget secondExchangeCard;
+
+  const MobileExchangeCardsSection({
+    Key? key,
+    required this.firstExchangeCard,
+    required this.secondExchangeCard,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.only(bottom: 32),
+      decoration: BoxDecoration(
+        borderRadius: BorderRadius.only(
+          bottomLeft: Radius.circular(24),
+          bottomRight: Radius.circular(24),
+        ),
+        gradient: LinearGradient(
+          colors: [
+            Theme.of(context).primaryTextTheme.bodyText2!.color!,
+            Theme.of(context).primaryTextTheme.bodyText2!.decorationColor!,
+          ],
+          stops: [0.35, 1.0],
+          begin: Alignment.topLeft,
+          end: Alignment.bottomRight,
+        ),
+      ),
+      child: Column(
+        children: <Widget>[
+          Container(
+            decoration: BoxDecoration(
+              borderRadius: BorderRadius.only(
+                  bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)),
+              gradient: LinearGradient(
+                colors: [
+                  Theme.of(context).primaryTextTheme.subtitle2!.color!,
+                  Theme.of(context).primaryTextTheme.subtitle2!.decorationColor!,
+                ],
+                begin: Alignment.topLeft,
+                end: Alignment.bottomRight,
+              ),
+            ),
+            padding: EdgeInsets.fromLTRB(24, 100, 24, 32),
+            child: firstExchangeCard,
+          ),
+          Padding(
+            padding: EdgeInsets.only(top: 29, left: 24, right: 24),
+            child: secondExchangeCard,
+          )
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart
index 9eb17c762..f06e879a9 100644
--- a/lib/src/screens/exchange_trade/exchange_trade_page.dart
+++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart
@@ -1,4 +1,5 @@
 import 'dart:ui';
+import 'package:cake_wallet/utils/request_review_handler.dart';
 import 'package:mobx/mobx.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:flutter/material.dart';
@@ -351,8 +352,10 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
                       right: 24,
                       bottom: 24,
                       child: PrimaryButton(
-                          onPressed: () =>
-                              Navigator.of(popupContext).pop(),
+                          onPressed: () {
+                            Navigator.of(popupContext).pop();
+                            RequestReviewHandler.requestReview();
+                          },  
                           text: S.of(popupContext).send_got_it,
                           color: Theme.of(popupContext)
                               .accentTextTheme!
diff --git a/lib/src/screens/ionia/auth/ionia_create_account_page.dart b/lib/src/screens/ionia/auth/ionia_create_account_page.dart
index d2ced5dae..abdf3501c 100644
--- a/lib/src/screens/ionia/auth/ionia_create_account_page.dart
+++ b/lib/src/screens/ionia/auth/ionia_create_account_page.dart
@@ -66,6 +66,7 @@ class IoniaCreateAccountPage extends BasePage {
           validator: EmailValidator(),
           keyboardType: TextInputType.emailAddress,
           controller: _emailController,
+          onSubmit: (_) => _createAccount(),
         ),
       ),
       bottomSectionPadding: EdgeInsets.symmetric(vertical: 36, horizontal: 24),
@@ -77,12 +78,7 @@ class IoniaCreateAccountPage extends BasePage {
               Observer(
                 builder: (_) => LoadingPrimaryButton(
                   text: S.of(context).create_account,
-                  onPressed: () async {
-                    if (_formKey.currentState != null && !_formKey.currentState!.validate()) {
-                      return;
-                    }
-                    await _authViewModel.createUser(_emailController.text);
-                  },
+                  onPressed: _createAccount,
                   isLoading: _authViewModel.createUserState is IoniaCreateStateLoading,
                   color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
                   textColor: Colors.white,
@@ -151,4 +147,11 @@ class IoniaCreateAccountPage extends BasePage {
         Routes.ioniaVerifyIoniaOtpPage,
         arguments: [authViewModel.email, false],
       );
+
+  void _createAccount() async {
+    if (_formKey.currentState != null && !_formKey.currentState!.validate()) {
+      return;
+    }
+    await _authViewModel.createUser(_emailController.text);
+  }
 }
diff --git a/lib/src/screens/ionia/auth/ionia_login_page.dart b/lib/src/screens/ionia/auth/ionia_login_page.dart
index 6dc4aa6e5..e6e8680f3 100644
--- a/lib/src/screens/ionia/auth/ionia_login_page.dart
+++ b/lib/src/screens/ionia/auth/ionia_login_page.dart
@@ -57,6 +57,7 @@ class IoniaLoginPage extends BasePage {
           keyboardType: TextInputType.emailAddress,
           validator: EmailValidator(),
           controller: _emailController,
+          onSubmit: (text) => _login(),
         ),
       ),
       bottomSectionPadding: EdgeInsets.symmetric(vertical: 36, horizontal: 24),
@@ -68,12 +69,7 @@ class IoniaLoginPage extends BasePage {
               Observer(
                 builder: (_) => LoadingPrimaryButton(
                   text: S.of(context).login,
-                  onPressed: () async {
-                    if (_formKey.currentState != null && !_formKey.currentState!.validate()) {
-                      return;
-                    }
-                    await _authViewModel.signIn(_emailController.text);
-                  },
+                  onPressed: _login,
                   isLoading: _authViewModel.signInState is IoniaCreateStateLoading,
                   color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
                   textColor: Colors.white,
@@ -106,4 +102,11 @@ class IoniaLoginPage extends BasePage {
         Routes.ioniaVerifyIoniaOtpPage,
         arguments: [authViewModel.email, true],
       );
+
+  void _login() async {
+    if (_formKey.currentState != null && !_formKey.currentState!.validate()) {
+      return;
+    }
+    await _authViewModel.signIn(_emailController.text);
+  }
 }
diff --git a/lib/src/screens/ionia/auth/ionia_verify_otp_page.dart b/lib/src/screens/ionia/auth/ionia_verify_otp_page.dart
index 625bd36b0..e2123e164 100644
--- a/lib/src/screens/ionia/auth/ionia_verify_otp_page.dart
+++ b/lib/src/screens/ionia/auth/ionia_verify_otp_page.dart
@@ -82,6 +82,7 @@ class IoniaVerifyIoniaOtp extends BasePage {
                 keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
                 focusNode: _codeFocus,
                 controller: _codeController,
+                onSubmit: (_) => _verify(),
               ),
               SizedBox(height: 14),
               Text(
@@ -116,7 +117,7 @@ class IoniaVerifyIoniaOtp extends BasePage {
                   Observer(
                     builder: (_) => LoadingPrimaryButton(
                       text: S.of(context).continue_text,
-                      onPressed: () async => await _authViewModel.verifyEmail(_codeController.text),
+                      onPressed: _verify,
                       isDisabled: _authViewModel.otpState is IoniaOtpSendDisabled,
                       isLoading: _authViewModel.otpState is IoniaOtpValidating,
                       color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
@@ -148,4 +149,6 @@ class IoniaVerifyIoniaOtp extends BasePage {
   void _onOtpSuccessful(BuildContext context) =>
       Navigator.of(context)
         .pushNamedAndRemoveUntil(Routes.ioniaManageCardsPage, (route) => route.isFirst);
+
+  void _verify() async => await _authViewModel.verifyEmail(_codeController.text);
 }
diff --git a/lib/src/screens/ionia/cards/ionia_buy_gift_card.dart b/lib/src/screens/ionia/cards/ionia_buy_gift_card.dart
index 3182d366f..a60b967f2 100644
--- a/lib/src/screens/ionia/cards/ionia_buy_gift_card.dart
+++ b/lib/src/screens/ionia/cards/ionia_buy_gift_card.dart
@@ -6,6 +6,7 @@ import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
 import 'package:cake_wallet/src/widgets/primary_button.dart';
 import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
@@ -44,7 +45,6 @@ class IoniaBuyGiftCardPage extends BasePage {
 
   @override
   Widget body(BuildContext context) {
-    final _width = MediaQuery.of(context).size.width;
     final merchant = ioniaBuyCardViewModel.ioniaMerchant;
     return KeyboardActions(
       disableScroll: true,
@@ -67,7 +67,10 @@ class IoniaBuyGiftCardPage extends BasePage {
               Container(
                 padding: EdgeInsets.symmetric(horizontal: 25),
                 decoration: BoxDecoration(
-                  borderRadius: BorderRadius.only(bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)),
+                  borderRadius: BorderRadius.only(
+                    bottomLeft: Radius.circular(24),
+                    bottomRight: Radius.circular(24),
+                  ),
                   gradient: LinearGradient(colors: [
                     Theme.of(context).primaryTextTheme!.subtitle1!.color!,
                     Theme.of(context).primaryTextTheme!.subtitle1!.decorationColor!,
@@ -75,35 +78,28 @@ class IoniaBuyGiftCardPage extends BasePage {
                 ),
                 child: Column(
                   mainAxisSize: MainAxisSize.min,
-                  crossAxisAlignment: CrossAxisAlignment.stretch,
                   mainAxisAlignment: MainAxisAlignment.center,
                   children: [
                     SizedBox(height: 150),
-                    BaseTextFormField(
-                      controller: _amountController,
-                      focusNode: _amountFieldFocus,
-                      keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
-                      inputFormatters: [
-                        FilteringTextInputFormatter.deny(RegExp('[\-|\ ]')),
-                        FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.|\,)?\d{0,2}'))],
-                      hintText: '1000',
-                      placeholderTextStyle: TextStyle(
-                        color: Theme.of(context).primaryTextTheme!.headline5!.color!,
-                        fontWeight: FontWeight.w600,
-                        fontSize: 36,
-                      ),
-                      borderColor: Theme.of(context).primaryTextTheme!.headline5!.color!,
-                      textColor: Colors.white,
-                      textStyle: TextStyle(
-                        color: Colors.white,
-                        fontSize: 36,
-                      ),
-                      prefixIcon: Padding(
-                        padding: EdgeInsets.only(
-                          top: 5.0,
-                          left: _width / 4,
+                    SizedBox(
+                      width: 200,
+                      child: BaseTextFormField(
+                        controller: _amountController,
+                        focusNode: _amountFieldFocus,
+                        keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
+                        inputFormatters: [
+                          FilteringTextInputFormatter.deny(RegExp('[\-|\ ]')),
+                          FilteringTextInputFormatter.allow(
+                            RegExp(r'^\d+(\.|\,)?\d{0,2}'),
+                          ),
+                        ],
+                        hintText: '1000',
+                        placeholderTextStyle: TextStyle(
+                          color: Theme.of(context).primaryTextTheme.headline5!.color!,
+                          fontWeight: FontWeight.w600,
+                          fontSize: 36,
                         ),
-                        child: Text(
+                        prefixIcon: Text(
                           'USD: ',
                           style: TextStyle(
                             color: Colors.white,
@@ -111,8 +107,17 @@ class IoniaBuyGiftCardPage extends BasePage {
                             fontSize: 36,
                           ),
                         ),
+                        textColor: Colors.white,
+                        textStyle: TextStyle(
+                          color: Colors.white,
+                          fontSize: 36,
+                        ),
                       ),
                     ),
+                    Divider(
+                      color: Theme.of(context).primaryTextTheme.headline5!.color!,
+                      height: 1,
+                    ),
                     SizedBox(height: 8),
                     Row(
                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -140,7 +145,11 @@ class IoniaBuyGiftCardPage extends BasePage {
                 padding: const EdgeInsets.all(24.0),
                 child: CardItem(
                   title: merchant.legalName,
-                  backgroundColor: Theme.of(context).accentTextTheme!.headline1!.backgroundColor!.withOpacity(0.1),
+                  backgroundColor: Theme.of(context)
+                      .accentTextTheme!
+                      .headline1!
+                      .backgroundColor!
+                      .withOpacity(0.1),
                   discount: merchant.discount,
                   titleColor: Theme.of(context).accentTextTheme!.headline1!.backgroundColor!,
                   subtitleColor: Theme.of(context).hintColor,
diff --git a/lib/src/screens/monero_accounts/monero_account_list_page.dart b/lib/src/screens/monero_accounts/monero_account_list_page.dart
index 7fe15948f..cb2fe0f2d 100644
--- a/lib/src/screens/monero_accounts/monero_account_list_page.dart
+++ b/lib/src/screens/monero_accounts/monero_account_list_page.dart
@@ -1,9 +1,7 @@
-import 'dart:ui';
 import 'package:cake_wallet/src/widgets/section_divider.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
-import 'package:cake_wallet/palette.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart';
@@ -27,9 +25,6 @@ class MoneroAccountListPage extends StatelessWidget {
   }
 
   final MoneroAccountListViewModel accountListViewModel;
-  final closeIcon = Image.asset('assets/images/close.png',
-    color: Palette.darkBlueCraiola,
-  );
 
   ScrollController controller;
   double backgroundHeight;
@@ -39,131 +34,138 @@ class MoneroAccountListPage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return AlertBackground(
-      child: Stack(
-        alignment: Alignment.center,
-        children: <Widget>[
-          Column(
-            mainAxisSize: MainAxisSize.min,
-            children: <Widget>[
-              Container(
-                padding: EdgeInsets.only(left: 24, right: 24),
-                child: Text(
-                  S.of(context).choose_account,
-                  textAlign: TextAlign.center,
-                  style: TextStyle(
-                      fontSize: 18,
-                      fontWeight: FontWeight.bold,
-                      fontFamily: 'Lato',
-                      decoration: TextDecoration.none,
-                      color: Colors.white
-                  ),
-                ),
-              ),
-              Padding(
-                padding: EdgeInsets.only(left: 24, right: 24, top: 24),
-                child: GestureDetector(
-                  onTap: () => null,
-                  child: ClipRRect(
-                    borderRadius: BorderRadius.all(Radius.circular(14)),
-                    child: Container(
-                      height: 296,
-                      color: Theme.of(context).textTheme!.headline1!.decorationColor!,
-                      child: Column(
-                        children: <Widget>[
-                          Expanded(
-                              child: Observer(
-                                  builder: (_) {
-                                    final accounts = accountListViewModel.accounts;
-                                    isAlwaysShowScrollThumb = accounts == null
-                                        ? false
-                                        : accounts.length > 3;
-
-                                    return Stack(
-                                      alignment: Alignment.center,
-                                      children: <Widget>[
-                                        ListView.separated(
-                                          padding: EdgeInsets.zero,
-                                          controller: controller,
-                                          separatorBuilder: (context, index) =>
-                                          const SectionDivider(),
-                                          itemCount: accounts.length ?? 0,
-                                          itemBuilder: (context, index) {
-                                            final account = accounts[index];
-
-                                            return AccountTile(
-                                                isCurrent: account.isSelected,
-                                                accountName: account.label,
-                                                onTap: () {
-                                                  if (account.isSelected) {
-                                                    return;
-                                                  }
-
-                                                  accountListViewModel
-                                                      .select(account);
-                                                  Navigator.of(context).pop();
-                                                },
-                                                onEdit: () async =>
-                                                await Navigator.of(context)
-                                                    .pushNamed(
-                                                    Routes.accountCreation,
-                                                    arguments: account));
-                                          },
-                                        ),
-                                        isAlwaysShowScrollThumb
-                                            ? CakeScrollbar(
-                                            backgroundHeight: backgroundHeight,
-                                            thumbHeight: thumbHeight,
-                                            fromTop: accountListViewModel
-                                                .scrollOffsetFromTop
-                                        )
-                                            : Offstage(),
-                                      ],
-                                    );
-                                  }
-                              )
-                          ),
-                          GestureDetector(
-                            onTap: () async => await Navigator.of(context)
-                                .pushNamed(Routes.accountCreation),
-                            child: Container(
-                              height: 62,
-                              color: Theme.of(context).cardColor,
-                              padding: EdgeInsets.only(left: 24, right: 24),
-                              child: Center(
-                                child: Row(
-                                  mainAxisSize: MainAxisSize.min,
-                                  children: <Widget>[
-                                    Icon(
-                                      Icons.add,
-                                      color: Colors.white,
-                                    ),
-                                    Padding(
-                                      padding: EdgeInsets.only(left: 5),
-                                      child: Text(
-                                        S.of(context).create_new_account,
-                                        style: TextStyle(
-                                          fontSize: 15,
-                                          fontWeight: FontWeight.w600,
-                                          fontFamily: 'Lato',
-                                          color: Colors.white,
-                                          decoration: TextDecoration.none,
-                                        ),
-                                      ),
-                                    )
-                                  ],
-                                ),
-                              ),
-                            ),
-                          )
-                        ],
+      child: Column(
+        children: [
+          Expanded(
+            child: Stack(
+              alignment: Alignment.center,
+              children: <Widget>[
+                Column(
+                  mainAxisSize: MainAxisSize.min,
+                  children: <Widget>[
+                    Container(
+                      padding: EdgeInsets.only(left: 24, right: 24),
+                      child: Text(
+                        S.of(context).choose_account,
+                        textAlign: TextAlign.center,
+                        style: TextStyle(
+                            fontSize: 18,
+                            fontWeight: FontWeight.bold,
+                            fontFamily: 'Lato',
+                            decoration: TextDecoration.none,
+                            color: Colors.white
+                        ),
                       ),
                     ),
-                  ),
+                    Padding(
+                      padding: EdgeInsets.only(left: 24, right: 24, top: 24),
+                      child: GestureDetector(
+                        onTap: () => null,
+                        child: ClipRRect(
+                          borderRadius: BorderRadius.all(Radius.circular(14)),
+                          child: Container(
+                            height: 296,
+                            color: Theme.of(context).textTheme!.headline1!.decorationColor!,
+                            child: Column(
+                              children: <Widget>[
+                                Expanded(
+                                    child: Observer(
+                                        builder: (_) {
+                                          final accounts = accountListViewModel.accounts;
+                                          isAlwaysShowScrollThumb = accounts == null
+                                              ? false
+                                              : accounts.length > 3;
+
+                                          return Stack(
+                                            alignment: Alignment.center,
+                                            children: <Widget>[
+                                              ListView.separated(
+                                                padding: EdgeInsets.zero,
+                                                controller: controller,
+                                                separatorBuilder: (context, index) =>
+                                                const SectionDivider(),
+                                                itemCount: accounts.length ?? 0,
+                                                itemBuilder: (context, index) {
+                                                  final account = accounts[index];
+
+                                                  return AccountTile(
+                                                      isCurrent: account.isSelected,
+                                                      accountName: account.label,
+                                                      onTap: () {
+                                                        if (account.isSelected) {
+                                                          return;
+                                                        }
+
+                                                        accountListViewModel
+                                                            .select(account);
+                                                        Navigator.of(context).pop();
+                                                      },
+                                                      onEdit: () async =>
+                                                      await Navigator.of(context)
+                                                          .pushNamed(
+                                                          Routes.accountCreation,
+                                                          arguments: account));
+                                                },
+                                              ),
+                                              isAlwaysShowScrollThumb
+                                                  ? CakeScrollbar(
+                                                  backgroundHeight: backgroundHeight,
+                                                  thumbHeight: thumbHeight,
+                                                  fromTop: accountListViewModel
+                                                      .scrollOffsetFromTop
+                                              )
+                                                  : Offstage(),
+                                            ],
+                                          );
+                                        }
+                                    )
+                                ),
+                                GestureDetector(
+                                  onTap: () async => await Navigator.of(context)
+                                      .pushNamed(Routes.accountCreation),
+                                  child: Container(
+                                    height: 62,
+                                    color: Theme.of(context).cardColor,
+                                    padding: EdgeInsets.only(left: 24, right: 24),
+                                    child: Center(
+                                      child: Row(
+                                        mainAxisSize: MainAxisSize.min,
+                                        children: <Widget>[
+                                          Icon(
+                                            Icons.add,
+                                            color: Colors.white,
+                                          ),
+                                          Padding(
+                                            padding: EdgeInsets.only(left: 5),
+                                            child: Text(
+                                              S.of(context).create_new_account,
+                                              style: TextStyle(
+                                                fontSize: 15,
+                                                fontWeight: FontWeight.w600,
+                                                fontFamily: 'Lato',
+                                                color: Colors.white,
+                                                decoration: TextDecoration.none,
+                                              ),
+                                            ),
+                                          )
+                                        ],
+                                      ),
+                                    ),
+                                  ),
+                                )
+                              ],
+                            ),
+                          ),
+                        ),
+                      ),
+                    )
+                  ],
                 ),
-              )
-            ],
+                SizedBox(height: ResponsiveLayoutUtil.kPopupSpaceHeight),
+                AlertCloseButton()
+              ],
+            ),
           ),
-          AlertCloseButton(image: closeIcon)
         ],
       ),
     );
diff --git a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
index 05ff65889..cf0708f21 100644
--- a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
+++ b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
@@ -105,7 +105,7 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
                     return;
                   }
 
-                  widget.nodeViewModel.save(saveAsCurrent: true);
+                  widget.nodeViewModel.save();
                 }
 
                 Navigator.pop(context);
diff --git a/lib/src/screens/new_wallet/new_wallet_page.dart b/lib/src/screens/new_wallet/new_wallet_page.dart
index 9e0cd898c..5fe7522bc 100644
--- a/lib/src/screens/new_wallet/new_wallet_page.dart
+++ b/lib/src/screens/new_wallet/new_wallet_page.dart
@@ -1,11 +1,12 @@
 import 'package:cake_wallet/entities/generate_name.dart';
+import 'package:cake_wallet/main.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:mobx/mobx.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/core/wallet_name_validator.dart';
 import 'package:cake_wallet/src/widgets/seed_language_selector.dart';
@@ -24,18 +25,14 @@ class NewWalletPage extends BasePage {
 
   final walletNameImage = Image.asset('assets/images/wallet_name.png');
 
-  final walletNameLightImage =
-      Image.asset('assets/images/wallet_name_light.png');
+  final walletNameLightImage = Image.asset('assets/images/wallet_name_light.png');
 
   @override
   String get title => S.current.new_wallet;
 
   @override
   Widget body(BuildContext context) => WalletNameForm(
-      _walletNewVM,
-      currentTheme.type == ThemeType.dark
-          ? walletNameImage
-          : walletNameLightImage);
+      _walletNewVM, currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage);
 }
 
 class WalletNameForm extends StatefulWidget {
@@ -50,9 +47,9 @@ class WalletNameForm extends StatefulWidget {
 
 class _WalletNameFormState extends State<WalletNameForm> {
   _WalletNameFormState(this._walletNewVM)
-    : _formKey = GlobalKey<FormState>(),
-      _languageSelectorKey = GlobalKey<SeedLanguageSelectorState>(),
-      _controller = TextEditingController();
+      : _formKey = GlobalKey<FormState>(),
+        _languageSelectorKey = GlobalKey<SeedLanguageSelectorState>(),
+        _controller = TextEditingController();
 
   static const aspectRatioImage = 1.22;
 
@@ -64,10 +61,9 @@ class _WalletNameFormState extends State<WalletNameForm> {
 
   @override
   void initState() {
-    _stateReaction ??=
-        reaction((_) => _walletNewVM.state, (ExecutionState state) {
+    _stateReaction ??= reaction((_) => _walletNewVM.state, (ExecutionState state) async {
       if (state is ExecutedSuccessfullyState) {
-        Navigator.of(context)
+        Navigator.of(navigatorKey.currentContext!)
             .pushNamed(Routes.preSeed, arguments: _walletNewVM.type);
       }
 
@@ -90,117 +86,121 @@ class _WalletNameFormState extends State<WalletNameForm> {
 
   @override
   Widget build(BuildContext context) {
-    return Container(
+    return Padding(
       padding: EdgeInsets.only(top: 24),
       child: ScrollableWithBottomSection(
           contentPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
-          content:
-              Column(crossAxisAlignment: CrossAxisAlignment.center, children: [
-            Padding(
-              padding: EdgeInsets.only(left: 12, right: 12),
-              child: AspectRatio(
-                  aspectRatio: aspectRatioImage,
-                  child:
-                      FittedBox(child: widget.walletImage, fit: BoxFit.fill)),
-            ),
-            Padding(
-              padding: EdgeInsets.only(top: 24),
-              child: Form(
-                key: _formKey,
-                child: Stack(
-                  alignment: Alignment.centerRight,
-                  children: [
-                    TextFormField(
-                      onChanged: (value) => _walletNewVM.name = value,
-                      controller: _controller,
-                      textAlign: TextAlign.center,
-                      style: TextStyle(
-                          fontSize: 20.0,
-                          fontWeight: FontWeight.w600,
-                          color:
-                              Theme.of(context).primaryTextTheme!.headline6!.color!),
-                      decoration: InputDecoration(
-                        hintStyle: TextStyle(
-                            fontSize: 18.0,
-                            fontWeight: FontWeight.w500,
-                            color: Theme.of(context)
-                                .accentTextTheme!
-                                .headline2!
-                                .color!),
-                        hintText: S.of(context).wallet_name,
-                        focusedBorder: UnderlineInputBorder(
-                            borderSide: BorderSide(
-                                color: Theme.of(context)
-                                    .accentTextTheme!
-                                    .headline2!
-                                    .decorationColor!,
-                                width: 1.0)),
-                        enabledBorder: UnderlineInputBorder(
-                          borderSide: BorderSide(
-                              color: Theme.of(context)
-                                  .accentTextTheme!
-                                  .headline2!
-                                  .decorationColor!,
-                              width: 1.0),
-                        ),
-                        suffixIcon: IconButton(
-                          onPressed: () async {
-                            final rName = await generateName();
-                            FocusManager.instance.primaryFocus?.unfocus();
+          content: Center(
+            child: ConstrainedBox(
+              constraints:
+                  BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  Padding(
+                    padding: EdgeInsets.only(left: 12, right: 12),
+                    child: AspectRatio(
+                        aspectRatio: aspectRatioImage,
+                        child: FittedBox(child: widget.walletImage, fit: BoxFit.fill)),
+                  ),
+                  Padding(
+                    padding: EdgeInsets.only(top: 24),
+                    child: Form(
+                      key: _formKey,
+                      child: Stack(
+                        alignment: Alignment.centerRight,
+                        children: [
+                          TextFormField(
+                            onChanged: (value) => _walletNewVM.name = value,
+                            controller: _controller,
+                            textAlign: TextAlign.center,
+                            style: TextStyle(
+                                fontSize: 20.0,
+                                fontWeight: FontWeight.w600,
+                                color: Theme.of(context).primaryTextTheme!.headline6!.color!),
+                            decoration: InputDecoration(
+                              hintStyle: TextStyle(
+                                  fontSize: 18.0,
+                                  fontWeight: FontWeight.w500,
+                                  color: Theme.of(context).accentTextTheme!.headline2!.color!),
+                              hintText: S.of(context).wallet_name,
+                              focusedBorder: UnderlineInputBorder(
+                                  borderSide: BorderSide(
+                                      color: Theme.of(context)
+                                          .accentTextTheme!
+                                          .headline2!
+                                          .decorationColor!,
+                                      width: 1.0)),
+                              enabledBorder: UnderlineInputBorder(
+                                borderSide: BorderSide(
+                                    color: Theme.of(context)
+                                        .accentTextTheme!
+                                        .headline2!
+                                        .decorationColor!,
+                                    width: 1.0),
+                              ),
+                              suffixIcon: Semantics(
+                                label: 'Generate Name',
+                                child: IconButton(
+                                  onPressed: () async {
+                                    final rName = await generateName();
+                                    FocusManager.instance.primaryFocus?.unfocus();
 
-                            setState(() {
-                              _controller.text = rName;
-                              _walletNewVM.name = rName;
-                              _controller.selection = TextSelection.fromPosition(
-                                  TextPosition(offset: _controller.text.length));
-                            });
-                          },
-                          icon: Container(
-                            padding: const EdgeInsets.all(8),
-                            decoration: BoxDecoration(
-                              borderRadius: BorderRadius.circular(6.0),
-                              color: Theme.of(context).hintColor,
-                            ),
-                            width: 34,
-                            height: 34,
-                            child: Image.asset(
-                              'assets/images/refresh_icon.png',
-                              color: Theme.of(context)
-                                  .primaryTextTheme!
-                                  .headline4!
-                                  .decorationColor!,
+                                    setState(() {
+                                      _controller.text = rName;
+                                      _walletNewVM.name = rName;
+                                      _controller.selection = TextSelection.fromPosition(
+                                          TextPosition(offset: _controller.text.length));
+                                    });
+                                  },
+                                  icon: Container(
+                                    padding: const EdgeInsets.all(8),
+                                    decoration: BoxDecoration(
+                                      borderRadius: BorderRadius.circular(6.0),
+                                      color: Theme.of(context).hintColor,
+                                    ),
+                                    width: 34,
+                                    height: 34,
+                                    child: Image.asset(
+                                      'assets/images/refresh_icon.png',
+                                      color: Theme.of(context)
+                                          .primaryTextTheme!
+                                          .headline4!
+                                          .decorationColor!,
+                                    ),
+                                  ),
+                                ),
+                              ),
                             ),
+                            validator: WalletNameValidator(),
                           ),
-                        ),
+                        ],
                       ),
-                      validator: WalletNameValidator(),
                     ),
-                  ],
-                ),
+                  ),
+                  if (_walletNewVM.hasLanguageSelector) ...[
+                    Padding(
+                      padding: EdgeInsets.only(top: 40),
+                      child: Text(
+                        S.of(context).seed_language_choose,
+                        textAlign: TextAlign.center,
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            fontWeight: FontWeight.w500,
+                            color: Theme.of(context).primaryTextTheme!.headline6!.color!),
+                      ),
+                    ),
+                    Padding(
+                      padding: EdgeInsets.only(top: 24),
+                      child: SeedLanguageSelector(
+                          key: _languageSelectorKey, initialSelected: defaultSeedLanguage),
+                    )
+                  ]
+                ],
               ),
             ),
-            if (_walletNewVM.hasLanguageSelector) ...[
-              Padding(
-                padding: EdgeInsets.only(top: 40),
-                child: Text(
-                  S.of(context).seed_language_choose,
-                  textAlign: TextAlign.center,
-                  style: TextStyle(
-                      fontSize: 16.0,
-                      fontWeight: FontWeight.w500,
-                      color: Theme.of(context).primaryTextTheme!.headline6!.color!),
-                ),
-              ),
-              Padding(
-                padding: EdgeInsets.only(top: 24),
-                child: SeedLanguageSelector(
-                    key: _languageSelectorKey,
-                    initialSelected: defaultSeedLanguage),
-              )
-            ]
-          ]),
-          bottomSectionPadding:
-              EdgeInsets.all(24),
+          ),
+          bottomSectionPadding: EdgeInsets.all(24),
           bottomSection: Column(
             children: [
               Observer(
diff --git a/lib/src/screens/new_wallet/new_wallet_type_page.dart b/lib/src/screens/new_wallet/new_wallet_type_page.dart
index 2f32e3bc9..6b8565c61 100644
--- a/lib/src/screens/new_wallet/new_wallet_type_page.dart
+++ b/lib/src/screens/new_wallet/new_wallet_type_page.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:flutter/material.dart';
@@ -13,23 +14,19 @@ class NewWalletTypePage extends BasePage {
 
   final void Function(BuildContext, WalletType) onTypeSelected;
   final walletTypeImage = Image.asset('assets/images/wallet_type.png');
-  final walletTypeLightImage =
-      Image.asset('assets/images/wallet_type_light.png');
+  final walletTypeLightImage = Image.asset('assets/images/wallet_type_light.png');
 
   @override
   String get title => S.current.wallet_list_restore_wallet;
 
   @override
   Widget body(BuildContext context) => WalletTypeForm(
-    onTypeSelected: onTypeSelected,
-    walletImage: currentTheme.type == ThemeType.dark
-      ? walletTypeImage
-      : walletTypeLightImage);
+      onTypeSelected: onTypeSelected,
+      walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage);
 }
 
 class WalletTypeForm extends StatefulWidget {
-  WalletTypeForm({required this.onTypeSelected,
-       required this.walletImage});
+  WalletTypeForm({required this.onTypeSelected, required this.walletImage});
 
   final void Function(BuildContext, WalletType) onTypeSelected;
   final Image walletImage;
@@ -39,24 +36,17 @@ class WalletTypeForm extends StatefulWidget {
 }
 
 class WalletTypeFormState extends State<WalletTypeForm> {
-  WalletTypeFormState()
-    : types = availableWalletTypes; 
+  WalletTypeFormState() : types = availableWalletTypes;
 
   static const aspectRatioImage = 1.22;
 
-  final moneroIcon =
-      Image.asset('assets/images/monero_logo.png', height: 24, width: 24);
-  final bitcoinIcon =
-      Image.asset('assets/images/bitcoin.png', height: 24, width: 24);
-  final litecoinIcon =
-      Image.asset('assets/images/litecoin_icon.png', height: 24, width: 24);
+  final moneroIcon = Image.asset('assets/images/monero_logo.png', height: 24, width: 24);
+  final bitcoinIcon = Image.asset('assets/images/bitcoin.png', height: 24, width: 24);
+  final litecoinIcon = Image.asset('assets/images/litecoin_icon.png', height: 24, width: 24);
   final walletTypeImage = Image.asset('assets/images/wallet_type.png');
-  final walletTypeLightImage =
-      Image.asset('assets/images/wallet_type_light.png');
-  final havenIcon =
-      Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
-  final ethereumIcon =
-      Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
+  final walletTypeLightImage = Image.asset('assets/images/wallet_type_light.png');
+  final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
+  final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
 
   WalletType? selected;
   List<WalletType> types;
@@ -71,35 +61,40 @@ class WalletTypeFormState extends State<WalletTypeForm> {
   Widget build(BuildContext context) {
     return ScrollableWithBottomSection(
       contentPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
-      content: Column(
-        crossAxisAlignment: CrossAxisAlignment.center,
-        children: <Widget>[
-          Padding(
-            padding: EdgeInsets.only(left: 12, right: 12),
-            child: AspectRatio(
-                aspectRatio: aspectRatioImage,
-                child: FittedBox(child: widget.walletImage, fit: BoxFit.fill)),
+      content: Center(
+        child: ConstrainedBox(
+          constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+          child: Column(
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: <Widget>[
+              Padding(
+                padding: EdgeInsets.only(left: 12, right: 12),
+                child: AspectRatio(
+                    aspectRatio: aspectRatioImage,
+                    child: FittedBox(child: widget.walletImage, fit: BoxFit.fill)),
+              ),
+              Padding(
+                padding: EdgeInsets.only(top: 48),
+                child: Text(
+                  S.of(context).choose_wallet_currency,
+                  textAlign: TextAlign.center,
+                  style: TextStyle(
+                      fontSize: 16,
+                      fontWeight: FontWeight.w500,
+                      color: Theme.of(context).primaryTextTheme.headline6!.color!),
+                ),
+              ),
+              ...types.map((type) => Padding(
+                    padding: EdgeInsets.only(top: 24),
+                    child: SelectButton(
+                        image: _iconFor(type),
+                        text: walletTypeToDisplayName(type),
+                        isSelected: selected == type,
+                        onTap: () => setState(() => selected = type)),
+                  ))
+            ],
           ),
-          Padding(
-            padding: EdgeInsets.only(top: 48),
-            child: Text(
-              S.of(context).choose_wallet_currency,
-              textAlign: TextAlign.center,
-              style: TextStyle(
-                  fontSize: 16,
-                  fontWeight: FontWeight.w500,
-                  color: Theme.of(context).primaryTextTheme.headline6!.color!),
-            ),
-          ),
-          ...types.map((type) => Padding(
-                padding: EdgeInsets.only(top: 24),
-                child: SelectButton(
-                    image: _iconFor(type),
-                    text: walletTypeToDisplayName(type),
-                    isSelected: selected == type,
-                    onTap: () => setState(() => selected = type)),
-              ))
-        ],
+        ),
       ),
       bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
       bottomSection: PrimaryButton(
@@ -125,7 +120,8 @@ class WalletTypeFormState extends State<WalletTypeForm> {
       case WalletType.ethereum:
         return ethereumIcon;
       default:
-        throw Exception('_iconFor: Incorrect Wallet Type. Cannot find icon for Wallet Type: ${type.toString()}');
+        throw Exception(
+            '_iconFor: Incorrect Wallet Type. Cannot find icon for Wallet Type: ${type.toString()}');
     }
   }
 
diff --git a/lib/src/screens/nodes/node_create_or_edit_page.dart b/lib/src/screens/nodes/node_create_or_edit_page.dart
index 723d8b1cc..6ca77d8de 100644
--- a/lib/src/screens/nodes/node_create_or_edit_page.dart
+++ b/lib/src/screens/nodes/node_create_or_edit_page.dart
@@ -4,7 +4,6 @@ import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:cw_core/node.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
diff --git a/lib/src/screens/pin_code/pin_code_widget.dart b/lib/src/screens/pin_code/pin_code_widget.dart
index a647f3d95..0ce4ab333 100644
--- a/lib/src/screens/pin_code/pin_code_widget.dart
+++ b/lib/src/screens/pin_code/pin_code_widget.dart
@@ -1,17 +1,19 @@
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/show_bar.dart';
 import 'package:another_flushbar/flushbar.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/generated/i18n.dart';
+import 'package:flutter/services.dart';
 
 class PinCodeWidget extends StatefulWidget {
-  PinCodeWidget(
-      {required Key key,
-      required this.onFullPin,
-      required this.initialPinLength,
-      required this.onChangedPin,
-      required this.hasLengthSwitcher,
-      this.onChangedPinLength,})
-      : super(key: key);
+  PinCodeWidget({
+    required Key key,
+    required this.onFullPin,
+    required this.initialPinLength,
+    required this.onChangedPin,
+    required this.hasLengthSwitcher,
+    this.onChangedPinLength,
+  }) : super(key: key);
 
   final void Function(String pin, PinCodeState state) onFullPin;
   final void Function(String pin) onChangedPin;
@@ -25,10 +27,10 @@ class PinCodeWidget extends StatefulWidget {
 
 class PinCodeState<T extends PinCodeWidget> extends State<T> {
   PinCodeState()
-    : _aspectRatio = 0,
-      pinLength = 0,
-      pin = '',
-      title = '';
+      : _aspectRatio = 0,
+        pinLength = 0,
+        pin = '',
+        title = '';
   static const defaultPinLength = fourPinLength;
   static const sixPinLength = 6;
   static const fourPinLength = 4;
@@ -75,8 +77,7 @@ class PinCodeState<T extends PinCodeWidget> extends State<T> {
   void setDefaultPinLength() => changePinLength(widget.initialPinLength);
 
   void calculateAspectRatio() {
-    final renderBox =
-        _gridViewKey.currentContext!.findRenderObject() as RenderBox;
+    final renderBox = _gridViewKey.currentContext!.findRenderObject() as RenderBox;
     final cellWidth = renderBox.size.width / 3;
     final cellHeight = renderBox.size.height / 4;
 
@@ -89,8 +90,7 @@ class PinCodeState<T extends PinCodeWidget> extends State<T> {
 
   void changeProcessText(String text) {
     hideProgressText();
-    _progressBar = createBar<void>(text, duration: null)
-      ..show(_key.currentContext!);
+    _progressBar = createBar<void>(text, duration: null)..show(_key.currentContext!);
   }
 
   void close() {
@@ -104,8 +104,8 @@ class PinCodeState<T extends PinCodeWidget> extends State<T> {
   }
 
   @override
-  Widget build(BuildContext context) => Scaffold(
-      key: _key, body: body(context), resizeToAvoidBottomInset: false);
+  Widget build(BuildContext context) =>
+      Scaffold(key: _key, body: body(context), resizeToAvoidBottomInset: false);
 
   Widget body(BuildContext context) {
     final deleteIconImage = Image.asset(
@@ -117,157 +117,155 @@ class PinCodeState<T extends PinCodeWidget> extends State<T> {
       color: Theme.of(context).primaryTextTheme!.headline6!.color!,
     );
 
-    return Container(
-      color: Theme.of(context).backgroundColor,
-      padding: EdgeInsets.only(left: 40.0, right: 40.0, bottom: 40.0),
-      child: Column(children: <Widget>[
-        Spacer(flex: 2),
-        Text(title,
-            style: TextStyle(
-                fontSize: 20,
-                fontWeight: FontWeight.w500,
-                color: Theme.of(context).primaryTextTheme!.headline6!.color!)),
-        Spacer(flex: 3),
-        Container(
-          width: 180,
-          child: Row(
-            mainAxisAlignment: MainAxisAlignment.spaceBetween,
-            children: List.generate(pinLength, (index) {
-              const size = 10.0;
-              final isFilled = pin.length > index ? pin[index] != null : false;
-
-              return Container(
-                  width: size,
-                  height: size,
-                  decoration: BoxDecoration(
-                    shape: BoxShape.circle,
-                    color: isFilled
-                        ? Theme.of(context).primaryTextTheme!.headline6!.color!
-                        : Theme.of(context)
-                            .accentTextTheme!
-                            .bodyText2!
-                            .color!
-                            .withOpacity(0.25),
-                  ));
-            }),
-          ),
-        ),
-        Spacer(flex: 2),
-        if (widget.hasLengthSwitcher) ...[
-          TextButton(
-              onPressed: () {
-                changePinLength(pinLength == PinCodeState.fourPinLength
-                    ? PinCodeState.sixPinLength
-                    : PinCodeState.fourPinLength);
-              },
-              child: Text(
-                _changePinLengthText(),
+    return RawKeyboardListener(
+      focusNode: FocusNode(),
+      autofocus: true,
+      onKey: (keyEvent) {
+        if (keyEvent is RawKeyDownEvent) {
+          if (keyEvent.logicalKey.keyLabel == "Backspace") {
+            _pop();
+            return;
+          }
+          int? number = int.tryParse(keyEvent.character ?? '');
+          if (number != null) {
+            _push(number);
+          }
+        }
+      },
+      child: Container(
+        color: Theme.of(context).backgroundColor,
+        padding: EdgeInsets.only(left: 40.0, right: 40.0, bottom: 40.0),
+        child: Column(
+          children: <Widget>[
+            Spacer(flex: 2),
+            Text(title,
                 style: TextStyle(
-                    fontSize: 14.0,
-                    fontWeight: FontWeight.normal,
-                    color: Theme.of(context)
-                        .accentTextTheme!
-                        .bodyText2!
-                        .decorationColor!),
-              ))
-        ],
-        Spacer(flex: 1),
-        Flexible(
-            flex: 24,
-            child: Container(
-                key: _gridViewKey,
-                child: _aspectRatio > 0
-                    ? GridView.count(
-                        shrinkWrap: true,
-                        crossAxisCount: 3,
-                        childAspectRatio: _aspectRatio,
-                        physics: const NeverScrollableScrollPhysics(),
-                        children: List.generate(12, (index) {
-                          const double marginRight = 15;
-                          const double marginLeft = 15;
+                    fontSize: 20,
+                    fontWeight: FontWeight.w500,
+                    color: Theme.of(context).primaryTextTheme!.headline6!.color!)),
+            Spacer(flex: 3),
+            Container(
+              width: 180,
+              child: Row(
+                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                children: List.generate(pinLength, (index) {
+                  const size = 10.0;
+                  final isFilled = pin.length > index ? pin[index] != null : false;
 
-                          if (index == 9) {
-                            return Container(
-                              margin: EdgeInsets.only(
-                                  left: marginLeft, right: marginRight),
-                              child: TextButton(
-                                  onPressed: () => null,
-                                  // (widget.hasLengthSwitcher ||
-                                  //         !settingsStore
-                                  //             .allowBiometricalAuthentication)
-                                  //     ? null
-                                  //     : () {
-                                  // FIXME
-//                                        if (authStore != null) {
-//                                          WidgetsBinding.instance.addPostFrameCallback((_) {
-//                                            final biometricAuth = BiometricAuth();
-//                                            biometricAuth.isAuthenticated().then(
-//                                                    (isAuth) {
-//                                                  if (isAuth) {
-//                                                    authStore.biometricAuth();
-//                                                    _key.currentState.showSnackBar(
-//                                                      SnackBar(
-//                                                        content: Text(S.of(context).authenticated),
-//                                                        backgroundColor: Colors.green,
-//                                                      ),
-//                                                    );
-//                                                  }
-//                                                }
-//                                            );
-//                                          });
-//                                        }
-//                                       },
-                                  // FIX-ME: Style
-                                  //color: Theme.of(context).backgroundColor,
-                                  //shape: CircleBorder(),
-                                  child: Container()
-                                  // (widget.hasLengthSwitcher ||
-                                  //         !settingsStore
-                                  //             .allowBiometricalAuthentication)
-                                  //     ? Offstage()
-                                  //     : faceImage,
+                  return Container(
+                      width: size,
+                      height: size,
+                      decoration: BoxDecoration(
+                        shape: BoxShape.circle,
+                        color: isFilled
+                            ? Theme.of(context).primaryTextTheme!.headline6!.color!
+                            : Theme.of(context)
+                                .accentTextTheme!
+                                .bodyText2!
+                                .color!
+                                .withOpacity(0.25),
+                      ));
+                }),
+              ),
+            ),
+            Spacer(flex: 2),
+            if (widget.hasLengthSwitcher) ...[
+              TextButton(
+                onPressed: () {
+                  changePinLength(pinLength == PinCodeState.fourPinLength
+                      ? PinCodeState.sixPinLength
+                      : PinCodeState.fourPinLength);
+                },
+                child: Text(
+                  _changePinLengthText(),
+                  style: TextStyle(
+                      fontSize: 14.0,
+                      fontWeight: FontWeight.normal,
+                      color: Theme.of(context).accentTextTheme!.bodyText2!.decorationColor!),
+                ),
+              )
+            ],
+            Spacer(flex: 1),
+            Flexible(
+              flex: 24,
+              child: Center(
+                child: ConstrainedBox(
+                  constraints: BoxConstraints(
+                    maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint,
+                  ),
+                  child: Container(
+                    key: _gridViewKey,
+                    child: _aspectRatio > 0
+                        ? ScrollConfiguration(
+                            behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),
+                            child: GridView.count(
+                              shrinkWrap: true,
+                              crossAxisCount: 3,
+                              childAspectRatio: _aspectRatio,
+                              physics: const NeverScrollableScrollPhysics(),
+                              children: List.generate(12, (index) {
+                                const double marginRight = 15;
+                                const double marginLeft = 15;
+
+                                if (index == 9) {
+                                  // Empty container
+                                  return Container(
+                                    margin: EdgeInsets.only(left: marginLeft, right: marginRight),
+                                  );
+                                } else if (index == 10) {
+                                  index = 0;
+                                } else if (index == 11) {
+                                  return MergeSemantics(
+                                    child: Container(
+                                      margin: EdgeInsets.only(left: marginLeft, right: marginRight),
+                                      child: Semantics(
+                                        label: 'Delete',
+                                        button: true,
+                                        onTap: () => _pop(),
+                                        child: TextButton(
+                                          onPressed: () => _pop(),
+                                          style: TextButton.styleFrom(
+                                            backgroundColor: Theme.of(context).backgroundColor,
+                                            shape: CircleBorder(),
+                                          ),
+                                          child: deleteIconImage,
+                                        ),
+                                      ),
+                                    ),
+                                  );
+                                } else {
+                                  index++;
+                                }
+
+                                return Container(
+                                  margin: EdgeInsets.only(left: marginLeft, right: marginRight),
+                                  child: TextButton(
+                                    onPressed: () => _push(index),
+                                    style: TextButton.styleFrom(
+                                      backgroundColor: Theme.of(context).backgroundColor,
+                                      shape: CircleBorder(),
+                                    ),
+                                    child: Text('$index',
+                                        style: TextStyle(
+                                            fontSize: 30.0,
+                                            fontWeight: FontWeight.w600,
+                                            color: Theme.of(context)
+                                                .primaryTextTheme!
+                                                .headline6!
+                                                .color!)),
                                   ),
-                            );
-                          } else if (index == 10) {
-                            index = 0;
-                          } else if (index == 11) {
-                            return Container(
-                              margin: EdgeInsets.only(
-                                  left: marginLeft, right: marginRight),
-                              child: TextButton(
-                                onPressed: () => _pop(),
-                                // FIX-ME: Style
-                                //color: Theme.of(context).backgroundColor,
-                                //shape: CircleBorder(),
-                                child: deleteIconImage,
-                              ),
-                            );
-                          } else {
-                            index++;
-                          }
-
-                          return Container(
-                            margin: EdgeInsets.only(
-                                left: marginLeft, right: marginRight),
-                            child: TextButton(
-                              onPressed: () => _push(index),
-                              // FIX-ME: Style
-                              //color: Theme.of(context).backgroundColor,
-                              //shape: CircleBorder(),
-                              child: Text('$index',
-                                  style: TextStyle(
-                                      fontSize: 30.0,
-                                      fontWeight: FontWeight.w600,
-                                      color: Theme.of(context)
-                                          .primaryTextTheme!
-                                          .headline6!
-                                          .color!)),
+                                );
+                              }),
                             ),
-                          );
-                        }),
-                      )
-                    : null))
-      ]),
+                          )
+                        : null,
+                  ),
+                ),
+              ),
+            )
+          ],
+        ),
+      ),
     );
   }
 
diff --git a/lib/src/screens/receive/anonpay_invoice_page.dart b/lib/src/screens/receive/anonpay_invoice_page.dart
index 1ba2f6122..055307d08 100644
--- a/lib/src/screens/receive/anonpay_invoice_page.dart
+++ b/lib/src/screens/receive/anonpay_invoice_page.dart
@@ -8,6 +8,7 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/present_receive_option
 import 'package:cake_wallet/src/screens/receive/widgets/anonpay_input_form.dart';
 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
 import 'package:cake_wallet/view_model/dashboard/receive_option_view_model.dart';
 import 'package:flutter/material.dart';
@@ -85,7 +86,7 @@ class AnonPayInvoicePage extends BasePage {
         child: ScrollableWithBottomSection(
           contentPadding: EdgeInsets.only(bottom: 24),
           content: Container(
-            decoration: BoxDecoration(
+            decoration: DeviceInfo.instance.isMobile ? BoxDecoration(
               borderRadius: BorderRadius.only(
                   bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)),
               gradient: LinearGradient(
@@ -96,10 +97,10 @@ class AnonPayInvoicePage extends BasePage {
                 begin: Alignment.topLeft,
                 end: Alignment.bottomRight,
               ),
-            ),
+            ) : null,
             child: Observer(builder: (_) {
               return Padding(
-                padding: EdgeInsets.fromLTRB(24, 100, 24, 0),
+                padding: EdgeInsets.fromLTRB(24, 120, 24, 0),
                 child: AnonInvoiceForm(
                   nameController: _nameController,
                   descriptionController: _descriptionController,
@@ -174,7 +175,6 @@ class AnonPayInvoicePage extends BasePage {
     }
 
     reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) {
-      Navigator.pop(context);
       switch (option) {
         case ReceivePageOption.mainnet:
           Navigator.popAndPushNamed(context, Routes.addressPage);
diff --git a/lib/src/screens/receive/anonpay_receive_page.dart b/lib/src/screens/receive/anonpay_receive_page.dart
index 27b5d41a3..1ee947d49 100644
--- a/lib/src/screens/receive/anonpay_receive_page.dart
+++ b/lib/src/screens/receive/anonpay_receive_page.dart
@@ -1,5 +1,6 @@
 import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
 import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
+import 'package:cake_wallet/entities/qr_view_data.dart';
 import 'package:cake_wallet/entities/receive_page_option.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/routes.dart';
@@ -133,10 +134,9 @@ class AnonPayReceivePage extends BasePage {
                   await Navigator.pushNamed(
                     context,
                     Routes.fullscreenQR,
-                    arguments: {
-                      'qrData': invoiceInfo.clearnetUrl,
-                      'version': qr.QrVersions.auto,
-                    },
+                    arguments: QrViewData(data: invoiceInfo.clearnetUrl,
+                      version: qr.QrVersions.auto,
+                    )
                   );
                   // ignore: unawaited_futures
                   DeviceDisplayBrightness.setBrightness(brightness);
diff --git a/lib/src/screens/receive/fullscreen_qr_page.dart b/lib/src/screens/receive/fullscreen_qr_page.dart
index 885c548f0..4bde38710 100644
--- a/lib/src/screens/receive/fullscreen_qr_page.dart
+++ b/lib/src/screens/receive/fullscreen_qr_page.dart
@@ -1,13 +1,13 @@
+import 'package:cake_wallet/entities/qr_view_data.dart';
 import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
 
 class FullscreenQRPage extends BasePage {
-  FullscreenQRPage({required this.qrData, int? this.version});
+  FullscreenQRPage({required this.qrViewData});
 
-  final String qrData;
-  final int? version;
+  final QrViewData qrViewData;
 
   @override
   Color get backgroundLightColor => currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
@@ -63,7 +63,7 @@ class FullscreenQRPage extends BasePage {
     return Padding(
       padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.width * 0.05),
       child: Hero(
-        tag: Key(qrData),
+        tag: Key(qrViewData.heroTag ?? qrViewData.data),
         child: Center(
           child: AspectRatio(
             aspectRatio: 1.0,
@@ -71,7 +71,7 @@ class FullscreenQRPage extends BasePage {
               padding: EdgeInsets.all(10),
               decoration: BoxDecoration(
                   border: Border.all(width: 3, color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!)),
-              child: QrImage(data: qrData, version: version),
+              child: QrImage(data: qrViewData.data, version: qrViewData.version),
             ),
           ),
         ),
diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart
index 4a573b2e1..00a157d97 100644
--- a/lib/src/screens/receive/receive_page.dart
+++ b/lib/src/screens/receive/receive_page.dart
@@ -21,16 +21,28 @@ import 'package:cake_wallet/src/screens/receive/widgets/qr_widget.dart';
 import 'package:keyboard_actions/keyboard_actions.dart';
 
 class ReceivePage extends BasePage {
-  ReceivePage({required this.addressListViewModel}) : _cryptoAmountFocus = FocusNode();
+  ReceivePage({required this.addressListViewModel})
+      : _cryptoAmountFocus = FocusNode(),
+        _amountController = TextEditingController(),
+        _formKey = GlobalKey<FormState>() {
+    _amountController.addListener(() {
+      if (_formKey.currentState!.validate()) {
+        addressListViewModel.changeAmount(_amountController.text);
+      }
+    });
+  }
 
   final WalletAddressListViewModel addressListViewModel;
+  final TextEditingController _amountController;
+  final GlobalKey<FormState> _formKey;
+  static const _heroTag = 'receive_page';
 
   @override
   String get title => S.current.receive;
 
   @override
-  Color get backgroundLightColor => currentTheme.type == ThemeType.bright
-      ? Colors.transparent : Colors.white;
+  Color get backgroundLightColor =>
+      currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
 
   @override
   Color get backgroundDarkColor => Colors.transparent;
@@ -41,26 +53,7 @@ class ReceivePage extends BasePage {
   final FocusNode _cryptoAmountFocus;
 
   @override
-  Widget leading(BuildContext context) {
-    final _backButton = Icon(Icons.arrow_back_ios,
-      color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
-      size: 16,);
-
-    return SizedBox(
-      height: 37,
-      width: 37,
-      child: ButtonTheme(
-        minWidth: double.minPositive,
-        child: TextButton(
-          // FIX-ME: Style
-            //highlightColor: Colors.transparent,
-            //splashColor: Colors.transparent,
-            //padding: EdgeInsets.all(0),
-            onPressed: () => onClose(context),
-            child: _backButton),
-      ),
-    );
-  }
+  Color get titleColor => Colors.white;
 
   @override
   Widget middle(BuildContext context) {
@@ -87,13 +80,11 @@ class ReceivePage extends BasePage {
 
   @override
   Widget trailing(BuildContext context) {
-    final shareImage =
-        Image.asset('assets/images/share.png',
-            color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!);
-
     return Material(
         color: Colors.transparent,
-        child: IconButton(
+        child: Semantics(
+          label: 'Share',
+          child: IconButton(
             padding: EdgeInsets.zero,
             constraints: BoxConstraints(),
             highlightColor: Colors.transparent,
@@ -101,145 +92,141 @@ class ReceivePage extends BasePage {
             iconSize: 25,
             onPressed: () {
               ShareUtil.share(
-                text: addressListViewModel.address.address,
+                text: addressListViewModel.uri.toString(),
                 context: context,
               );
             },
-            icon: shareImage
-        )
-    );
+            icon: Icon(
+              Icons.share,
+              size: 20,
+              color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!,
+            ),
+          ),
+        ));
   }
 
   @override
   Widget body(BuildContext context) {
-    return (addressListViewModel.type == WalletType.monero || addressListViewModel.type == WalletType.haven)
+    return (addressListViewModel.type == WalletType.monero ||
+            addressListViewModel.type == WalletType.haven)
         ? KeyboardActions(
-        config: KeyboardActionsConfig(
-            keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
-            keyboardBarColor: Theme.of(context).accentTextTheme!.bodyText1!
-                .backgroundColor!,
-            nextFocus: false,
-            actions: [
-              KeyboardActionsItem(
-                focusNode: _cryptoAmountFocus,
-                toolbarButtons: [(_) => KeyboardDoneButton()],
-              )
-            ]),
-        child: SingleChildScrollView(
-          child: Column(
-            children: <Widget>[
-              Padding(
-                padding: EdgeInsets.fromLTRB(24, 80, 24, 24),
-                child: QRWidget(
-                    addressListViewModel: addressListViewModel,
-                    isAmountFieldShow: true,
-                    amountTextFieldFocusNode: _cryptoAmountFocus,
-                    isLight: currentTheme.type == ThemeType.light),
+            config: KeyboardActionsConfig(
+                keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
+                keyboardBarColor: Theme.of(context).accentTextTheme!.bodyText1!.backgroundColor!,
+                nextFocus: false,
+                actions: [
+                  KeyboardActionsItem(
+                    focusNode: _cryptoAmountFocus,
+                    toolbarButtons: [(_) => KeyboardDoneButton()],
+                  )
+                ]),
+            child: SingleChildScrollView(
+              child: Column(
+                children: <Widget>[
+                  Padding(
+                    padding: EdgeInsets.fromLTRB(24, 50, 24, 24),
+                    child: QRWidget(
+                        addressListViewModel: addressListViewModel,
+                        formKey: _formKey,
+                        heroTag: _heroTag,
+                        amountTextFieldFocusNode: _cryptoAmountFocus,
+                        amountController: _amountController,
+                        isLight: currentTheme.type == ThemeType.light),
+                  ),
+                  Observer(
+                      builder: (_) => ListView.separated(
+                          padding: EdgeInsets.all(0),
+                          separatorBuilder: (context, _) => const SectionDivider(),
+                          shrinkWrap: true,
+                          physics: NeverScrollableScrollPhysics(),
+                          itemCount: addressListViewModel.items.length,
+                          itemBuilder: (context, index) {
+                            final item = addressListViewModel.items[index];
+                            Widget cell = Container();
+
+                            if (item is WalletAccountListHeader) {
+                              cell = HeaderTile(
+                                  onTap: () async => await showPopUp<void>(
+                                      context: context,
+                                      builder: (_) => getIt.get<MoneroAccountListPage>()),
+                                  title: S.of(context).accounts,
+                                  icon: Icon(
+                                    Icons.arrow_forward_ios,
+                                    size: 14,
+                                    color: Theme.of(context).textTheme!.headline4!.color!,
+                                  ));
+                            }
+
+                            if (item is WalletAddressListHeader) {
+                              cell = HeaderTile(
+                                  onTap: () =>
+                                      Navigator.of(context).pushNamed(Routes.newSubaddress),
+                                  title: S.of(context).addresses,
+                                  icon: Icon(
+                                    Icons.add,
+                                    size: 20,
+                                    color: Theme.of(context).textTheme!.headline4!.color!,
+                                  ));
+                            }
+
+                            if (item is WalletAddressListItem) {
+                              cell = Observer(builder: (_) {
+                                final isCurrent =
+                                    item.address == addressListViewModel.address.address;
+                                final backgroundColor = isCurrent
+                                    ? Theme.of(context).textTheme!.headline2!.decorationColor!
+                                    : Theme.of(context).textTheme!.headline3!.decorationColor!;
+                                final textColor = isCurrent
+                                    ? Theme.of(context).textTheme!.headline2!.color!
+                                    : Theme.of(context).textTheme!.headline3!.color!;
+
+                                return AddressCell.fromItem(item,
+                                    isCurrent: isCurrent,
+                                    backgroundColor: backgroundColor,
+                                    textColor: textColor,
+                                    onTap: (_) => addressListViewModel.setAddress(item),
+                                    onEdit: () => Navigator.of(context)
+                                        .pushNamed(Routes.newSubaddress, arguments: item));
+                              });
+                            }
+
+                            return index != 0
+                                ? cell
+                                : ClipRRect(
+                                    borderRadius: BorderRadius.only(
+                                        topLeft: Radius.circular(30),
+                                        topRight: Radius.circular(30)),
+                                    child: cell,
+                                  );
+                          })),
+                ],
               ),
-              Observer(
-                  builder: (_) => ListView.separated(
-                      padding: EdgeInsets.all(0),
-                      separatorBuilder: (context, _) => const SectionDivider(),
-                      shrinkWrap: true,
-                      physics: NeverScrollableScrollPhysics(),
-                      itemCount: addressListViewModel.items.length,
-                      itemBuilder: (context, index) {
-                        final item = addressListViewModel.items[index];
-                        Widget cell = Container();
-
-                        if (item is WalletAccountListHeader) {
-                          cell = HeaderTile(
-                              onTap: () async => await showPopUp<void>(
-                                  context: context,
-                                  builder: (_) =>
-                                      getIt.get<MoneroAccountListPage>()),
-                              title: S.of(context).accounts,
-                              icon: Icon(
-                                Icons.arrow_forward_ios,
-                                size: 14,
-                                color:
-                                Theme.of(context).textTheme!.headline4!.color!,
-                              ));
-                        }
-
-                        if (item is WalletAddressListHeader) {
-                          cell = HeaderTile(
-                              onTap: () => Navigator.of(context)
-                                  .pushNamed(Routes.newSubaddress),
-                              title: S.of(context).addresses,
-                              icon: Icon(
-                                Icons.add,
-                                size: 20,
-                                color:
-                                Theme.of(context).textTheme!.headline4!.color!,
-                              ));
-                        }
-
-                        if (item is WalletAddressListItem) {
-                          cell = Observer(builder: (_) {
-                            final isCurrent = item.address ==
-                                addressListViewModel.address.address;
-                            final backgroundColor = isCurrent
-                                ? Theme.of(context)
-                                .textTheme!
-                                .headline2!
-                                .decorationColor!
-                                : Theme.of(context)
-                                .textTheme!
-                                .headline3!
-                                .decorationColor!;
-                            final textColor = isCurrent
-                                ? Theme.of(context).textTheme!.headline2!.color!
-                                : Theme.of(context).textTheme!.headline3!.color!;
-
-                            return AddressCell.fromItem(item,
-                                isCurrent: isCurrent,
-                                backgroundColor: backgroundColor,
-                                textColor: textColor,
-                                onTap: (_) => addressListViewModel.setAddress(item),
-                                onEdit: () => Navigator.of(context).pushNamed(
-                                    Routes.newSubaddress,
-                                    arguments: item));
-                          });
-                        }
-
-                        return index != 0
-                            ? cell
-                            : ClipRRect(
-                          borderRadius: BorderRadius.only(
-                              topLeft: Radius.circular(30),
-                              topRight: Radius.circular(30)),
-                          child: cell,
-                        );
-                      })),
-            ],
-          ),
-        )) : Padding(
-      padding: EdgeInsets.fromLTRB(24, 24, 24, 32),
-      child: Column(
-        children: [
-          Expanded(
-            flex: 7,
-            child: QRWidget(
-                addressListViewModel: addressListViewModel,
-                isAmountFieldShow: true,
-                amountTextFieldFocusNode: _cryptoAmountFocus,
-                isLight: currentTheme.type == ThemeType.light),
-          ),
-          Expanded(
-            flex: 2,
-            child: SizedBox(),
-          ),
-          Text(S.of(context).electrum_address_disclaimer,
-              textAlign: TextAlign.center,
-              style: TextStyle(
-                  fontSize: 15,
-                  color: Theme.of(context)
-                      .accentTextTheme!
-                      .headline3!
-                      .backgroundColor!)),
-        ],
-      ),
-    );
+            ))
+        : Padding(
+            padding: EdgeInsets.fromLTRB(24, 24, 24, 32),
+            child: Column(
+              children: [
+                Expanded(
+                  flex: 7,
+                  child: QRWidget(
+                      formKey: _formKey,
+                      heroTag: _heroTag,
+                      addressListViewModel: addressListViewModel,
+                      amountTextFieldFocusNode: _cryptoAmountFocus,
+                      amountController: _amountController,
+                      isLight: currentTheme.type == ThemeType.light),
+                ),
+                Expanded(
+                  flex: 2,
+                  child: SizedBox(),
+                ),
+                Text(S.of(context).electrum_address_disclaimer,
+                    textAlign: TextAlign.center,
+                    style: TextStyle(
+                        fontSize: 15,
+                        color: Theme.of(context).accentTextTheme!.headline3!.backgroundColor!)),
+              ],
+            ),
+          );
   }
 }
diff --git a/lib/src/screens/receive/widgets/address_cell.dart b/lib/src/screens/receive/widgets/address_cell.dart
index 137db108b..e1fe77e72 100644
--- a/lib/src/screens/receive/widgets/address_cell.dart
+++ b/lib/src/screens/receive/widgets/address_cell.dart
@@ -70,11 +70,16 @@ class AddressCell extends StatelessWidget {
             ),
           ),
         ));
-    return Slidable(
-      key: Key(address),
-      startActionPane: _actionPane(context),
-      endActionPane: _actionPane(context),
-      child: cell,
+    return Semantics(
+      label: 'Slidable',
+      selected: isCurrent,
+      enabled: !isCurrent,
+      child: Slidable(
+        key: Key(address),
+        startActionPane: _actionPane(context),
+        endActionPane: _actionPane(context),
+        child: cell,
+      ),
     );
   }
 
diff --git a/lib/src/screens/receive/widgets/currency_input_field.dart b/lib/src/screens/receive/widgets/currency_input_field.dart
new file mode 100644
index 000000000..286c6f1cd
--- /dev/null
+++ b/lib/src/screens/receive/widgets/currency_input_field.dart
@@ -0,0 +1,120 @@
+import 'package:cake_wallet/core/amount_validator.dart';
+import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
+import 'package:cw_core/currency.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+class CurrencyInputField extends StatelessWidget {
+  const CurrencyInputField({
+    super.key,
+    required this.onTapPicker,
+    required this.selectedCurrency,
+    this.focusNode,
+    required this.controller,
+  });
+  final Function() onTapPicker;
+  final Currency selectedCurrency;
+  final FocusNode? focusNode;
+  final TextEditingController controller;
+
+  @override
+  Widget build(BuildContext context) {
+    final arrowBottomPurple = Image.asset(
+      'assets/images/arrow_bottom_purple_icon.png',
+      color: Colors.white,
+      height: 8,
+    );
+    final _width = MediaQuery.of(context).size.width;
+
+    return Column(
+      children: [
+        Padding(
+          padding: EdgeInsets.only(top: 20),
+          child: SizedBox(
+            height: 40,
+            child: BaseTextFormField(
+              focusNode: focusNode,
+              controller: controller,
+              keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
+              inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.|\,)?\d{0,8}'))],
+              hintText: '0.000',
+              placeholderTextStyle: TextStyle(
+                color: Theme.of(context).primaryTextTheme.headline5!.color!,
+                fontWeight: FontWeight.w600,
+              ),
+              borderColor: Theme.of(context).accentTextTheme.headline6!.backgroundColor!,
+              textColor: Colors.white,
+              textStyle: TextStyle(
+                color: Colors.white,
+              ),
+              prefixIcon: Padding(
+                padding: EdgeInsets.only(
+                  left: _width / 4,
+                ),
+                child: Container(
+                  padding: EdgeInsets.only(right: 8),
+                  child: InkWell(
+                    onTap: onTapPicker,
+                    child: Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        mainAxisSize: MainAxisSize.min,
+                        children: <Widget>[
+                          Padding(
+                            padding: EdgeInsets.only(right: 5),
+                            child: arrowBottomPurple,
+                          ),
+                          Text(
+                            selectedCurrency.name.toUpperCase(),
+                            style: TextStyle(
+                              fontWeight: FontWeight.w600,
+                              fontSize: 16,
+                              color: Colors.white,
+                            ),
+                          ),
+                          if (selectedCurrency.tag != null)
+                            Padding(
+                              padding: const EdgeInsets.only(right: 3.0),
+                              child: Container(
+                                decoration: BoxDecoration(
+                                  color: Theme.of(context).primaryTextTheme.headline4!.color!,
+                                  borderRadius: BorderRadius.all(
+                                    Radius.circular(6),
+                                  ),
+                                ),
+                                child: Center(
+                                  child: Text(
+                                    selectedCurrency.tag!,
+                                    style: TextStyle(
+                                      fontSize: 12,
+                                      fontWeight: FontWeight.bold,
+                                      color: Theme.of(context)
+                                          .primaryTextTheme
+                                          .headline4!
+                                          .decorationColor!,
+                                    ),
+                                  ),
+                                ),
+                              ),
+                            ),
+                          Padding(
+                            padding: const EdgeInsets.only(bottom: 3.0),
+                            child: Text(
+                              ':',
+                              style: TextStyle(
+                                fontWeight: FontWeight.w600,
+                                fontSize: 20,
+                                color: Colors.white,
+                              ),
+                            ),
+                          ),
+                        ]),
+                  ),
+                ),
+              ),
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+}
diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart
index 96a19f850..fc58d4cec 100644
--- a/lib/src/screens/receive/widgets/qr_widget.dart
+++ b/lib/src/screens/receive/widgets/qr_widget.dart
@@ -1,45 +1,45 @@
+import 'package:cake_wallet/entities/qr_view_data.dart';
 import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart';
+import 'package:cake_wallet/src/screens/receive/widgets/currency_input_field.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/utils/show_bar.dart';
-import 'package:cw_core/wallet_type.dart';
+import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:device_display_brightness/device_display_brightness.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
-import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
-import 'package:cake_wallet/core/amount_validator.dart';
 import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
 
 class QRWidget extends StatelessWidget {
-  QRWidget(
-      {required this.addressListViewModel,
-      required this.isLight,
-      this.qrVersion,
-      this.isAmountFieldShow = false,
-      this.amountTextFieldFocusNode})
-      : amountController = TextEditingController(),
-        _formKey = GlobalKey<FormState>() {
-    amountController.addListener(() => addressListViewModel?.amount =
-        _formKey.currentState!.validate() ? amountController.text : '');
-  }
+  QRWidget({
+    required this.addressListViewModel,
+    required this.isLight,
+    this.qrVersion,
+    this.heroTag,
+    required this.amountController,
+    required this.formKey,
+    this.amountTextFieldFocusNode,
+  });
 
   final WalletAddressListViewModel addressListViewModel;
-  final bool isAmountFieldShow;
   final TextEditingController amountController;
   final FocusNode? amountTextFieldFocusNode;
-  final GlobalKey<FormState> _formKey;
+  final GlobalKey<FormState> formKey;
   final bool isLight;
   final int? qrVersion;
+  final String? heroTag;
 
   @override
   Widget build(BuildContext context) {
     final copyImage = Image.asset('assets/images/copy_address.png',
-        color: Theme.of(context).textTheme!.subtitle1!.decorationColor!);
+        color: Theme.of(context).textTheme.subtitle1!.decorationColor!);
 
     return Column(
       mainAxisSize: MainAxisSize.min,
-      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+      mainAxisAlignment: MainAxisAlignment.center,
       crossAxisAlignment: CrossAxisAlignment.center,
       children: <Widget>[
         Column(
@@ -51,129 +51,141 @@ class QRWidget extends StatelessWidget {
                 style: TextStyle(
                     fontSize: 14,
                     fontWeight: FontWeight.w500,
-                    color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!),
+                    color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!),
               ),
             ),
             Row(
               children: <Widget>[
                 Spacer(flex: 3),
                 Observer(
-                  builder: (_) {
-                    return Flexible(
-                      flex: 5,
-                      child: GestureDetector(
-                        onTap: () async {
-                          // Get the current brightness:
-                          final double brightness = await DeviceDisplayBrightness.getBrightness();
-
-                          // ignore: unawaited_futures
-                          DeviceDisplayBrightness.setBrightness(1.0);
-                          await Navigator.pushNamed(
-                            context,
-                            Routes.fullscreenQR,
-                            arguments: {
-                              'qrData': addressListViewModel.uri.toString(),
-                            },
-                          );
-                          // ignore: unawaited_futures
-                          DeviceDisplayBrightness.setBrightness(brightness);
-                        },
-                        child: Hero(
-                          tag: Key(addressListViewModel.uri.toString()),
-                          child: Center(
-                            child: AspectRatio(
-                              aspectRatio: 1.0,
-                              child: Container(
-                                padding: EdgeInsets.all(5),
-                                decoration: BoxDecoration(
-                                  border: Border.all(
-                                    width: 3,
-                                    color:
-                                        Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
-                                  ),
+                  builder: (_) => Flexible(
+                    flex: 5,
+                    child: GestureDetector(
+                      onTap: () {
+                        changeBrightnessForRoute(
+                          () async {
+                            await Navigator.pushNamed(context, Routes.fullscreenQR,
+                                arguments: QrViewData(
+                                  data: addressListViewModel.uri.toString(),
+                                  heroTag: heroTag,
+                                ));
+                          },
+                        );
+                      },
+                      child: Hero(
+                        tag: Key(heroTag ?? addressListViewModel.uri.toString()),
+                        child: Center(
+                          child: AspectRatio(
+                            aspectRatio: 1.0,
+                            child: Container(
+                              padding: EdgeInsets.all(5),
+                              decoration: BoxDecoration(
+                                border: Border.all(
+                                  width: 3,
+                                  color:
+                                      Theme.of(context).accentTextTheme.headline2!.backgroundColor!,
                                 ),
-                                child: QrImage(data: addressListViewModel.uri.toString(), version: qrVersion),
                               ),
+                              child: QrImage(data: addressListViewModel.uri.toString()),
                             ),
                           ),
                         ),
                       ),
-                    );
-                  }
+                    ),
+                  ),
                 ),
                 Spacer(flex: 3)
               ],
             ),
           ],
         ),
-        if (isAmountFieldShow)
-          Padding(
+        Observer(builder: (_) {
+          return Padding(
             padding: EdgeInsets.only(top: 10),
             child: Row(
               children: <Widget>[
                 Expanded(
                   child: Form(
-                    key: _formKey,
-                    child: BaseTextFormField(
+                    key: formKey,
+                    child: CurrencyInputField(
                       focusNode: amountTextFieldFocusNode,
                       controller: amountController,
-                      keyboardType: TextInputType.numberWithOptions(decimal: true),
-                      inputFormatters: [FilteringTextInputFormatter.deny(RegExp('[\\-|\\ ]'))],
-                      textAlign: TextAlign.center,
-                      hintText: S.of(context).receive_amount,
-                      textColor: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
-                      borderColor: Theme.of(context).textTheme!.headline5!.decorationColor!,
-                      validator: AmountValidator(
-                          currency: walletTypeToCryptoCurrency(addressListViewModel!.type),
-                          isAutovalidate: true),
-                      // FIX-ME: Check does it equal to autovalidate: true,
-                      autovalidateMode: AutovalidateMode.always,
-                      placeholderTextStyle: TextStyle(
-                        color: Theme.of(context).hoverColor,
-                        fontSize: 18,
-                        fontWeight: FontWeight.w500,
-                      ),
+                      onTapPicker: () => _presentPicker(context),
+                      selectedCurrency: addressListViewModel.selectedCurrency,
                     ),
                   ),
                 ),
               ],
             ),
-          ),
-          Padding(
-            padding: EdgeInsets.only(top: 8, bottom: 8),
-            child: Builder(
-              builder: (context) => Observer(
-                builder: (context) => GestureDetector(
-                  onTap: () {
-                    Clipboard.setData(ClipboardData(text: addressListViewModel!.address.address));
-                    showBar<void>(context, S.of(context).copied_to_clipboard);
-                  },
-                  child: Row(
-                    mainAxisSize: MainAxisSize.max,
-                    crossAxisAlignment: CrossAxisAlignment.start,
-                    children: <Widget>[
-                      Expanded(
-                        child: Text(
-                          addressListViewModel!.address.address,
-                          textAlign: TextAlign.center,
-                          style: TextStyle(
-                              fontSize: 15,
-                              fontWeight: FontWeight.w500,
-                              color:
-                                  Theme.of(context).accentTextTheme!.headline2!.backgroundColor!),
-                        ),
+          );
+        }),
+        Padding(
+          padding: EdgeInsets.only(top: 20, bottom: 8),
+          child: Builder(
+            builder: (context) => Observer(
+              builder: (context) => GestureDetector(
+                onTap: () {
+                  Clipboard.setData(ClipboardData(text: addressListViewModel.address.address));
+                  showBar<void>(context, S.of(context).copied_to_clipboard);
+                },
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: <Widget>[
+                    Expanded(
+                      child: Text(
+                        addressListViewModel.address.address,
+                        textAlign: TextAlign.center,
+                        style: TextStyle(
+                            fontSize: 15,
+                            fontWeight: FontWeight.w500,
+                            color: Theme.of(context).accentTextTheme.headline2!.backgroundColor!),
                       ),
-                      Padding(
-                        padding: EdgeInsets.only(left: 12),
-                        child: copyImage,
-                      )
-                    ],
-                  ),
+                    ),
+                    Padding(
+                      padding: EdgeInsets.only(left: 12),
+                      child: copyImage,
+                    )
+                  ],
                 ),
               ),
             ),
-          )
+          ),
+        )
       ],
     );
   }
+
+  void _presentPicker(BuildContext context) async {
+    await showPopUp<void>(
+      builder: (_) => CurrencyPicker(
+        selectedAtIndex: addressListViewModel.selectedCurrencyIndex,
+        items: addressListViewModel.currencies,
+        hintText: S.of(context).search_currency,
+        onItemSelected: addressListViewModel.selectCurrency,
+      ),
+      context: context,
+    );
+    // update amount if currency changed
+    addressListViewModel.changeAmount(amountController.text);
+  }
+
+  Future<void> changeBrightnessForRoute(Future<void> Function() navigation) async {
+    // if not mobile, just navigate
+    if (!DeviceInfo.instance.isMobile) {
+      navigation();
+      return;
+    }
+
+    // Get the current brightness:
+    final brightness = await DeviceDisplayBrightness.getBrightness();
+
+    // ignore: unawaited_futures
+    DeviceDisplayBrightness.setBrightness(1.0);
+
+    await navigation();
+
+    // ignore: unawaited_futures
+    DeviceDisplayBrightness.setBrightness(brightness);
+  }
 }
diff --git a/lib/src/screens/release_notes/release_notes_screen.dart b/lib/src/screens/release_notes/release_notes_screen.dart
new file mode 100644
index 000000000..f8b3730fb
--- /dev/null
+++ b/lib/src/screens/release_notes/release_notes_screen.dart
@@ -0,0 +1,141 @@
+import 'dart:convert';
+import 'package:cake_wallet/src/widgets/alert_background.dart';
+import 'package:cake_wallet/src/widgets/alert_close_button.dart';
+import 'package:cake_wallet/wallet_type_utils.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+class ReleaseNotesScreen extends StatelessWidget {
+  const ReleaseNotesScreen({
+    required this.title,
+  });
+
+  final String title;
+
+  Future<List<String>> _loadStrings() async {
+    String notesContent = await rootBundle.loadString(
+        isMoneroOnly ? 'assets/text/Monerocom_Release_Notes.txt' : 'assets/text/Release_Notes.txt');
+    return LineSplitter().convert(notesContent);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Stack(
+      alignment: Alignment.center,
+      children: [
+        AlertBackground(
+          child: AlertDialog(
+            insetPadding: EdgeInsets.only(left: 16, right: 16, bottom: 48),
+            elevation: 0.0,
+            contentPadding: EdgeInsets.zero,
+            shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(30))),
+            content: Container(
+              decoration: BoxDecoration(
+                  borderRadius: BorderRadius.circular(30.0),
+                  gradient: LinearGradient(colors: [
+                    Theme.of(context).colorScheme.secondary,
+                    Theme.of(context).scaffoldBackgroundColor,
+                  ], begin: Alignment.centerLeft, end: Alignment.centerRight)),
+              child: Padding(
+                padding: const EdgeInsets.symmetric(horizontal: 24.0),
+                child: Stack(
+                  children: [
+                    SingleChildScrollView(
+                      child: Padding(
+                        padding: const EdgeInsets.only(top: 16.0),
+                        child: Container(
+                          alignment: Alignment.bottomCenter,
+                          child: DefaultTextStyle(
+                            style: TextStyle(
+                              decoration: TextDecoration.none,
+                              fontSize: 24.0,
+                              fontWeight: FontWeight.bold,
+                              fontFamily: 'Lato',
+                              color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+                            ),
+                            child: Text(title),
+                          ),
+                        ),
+                      ),
+                    ),
+                    SingleChildScrollView(
+                      child: Padding(
+                        padding: EdgeInsets.only(top: 48, bottom: 16),
+                        child: Container(
+                          width: double.maxFinite,
+                          child: Column(
+                            children: <Widget>[
+                              ConstrainedBox(
+                                constraints: BoxConstraints(
+                                  maxHeight: MediaQuery.of(context).size.height * 0.7,
+                                ),
+                                child: _getNotesWidget(),
+                              )
+                            ],
+                          ),
+                        ),
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+            ),
+          ),
+        ),
+        AlertCloseButton(
+          bottom: 30,
+        )
+      ],
+    );
+  }
+
+  Widget _getNotesWidget() {
+    return FutureBuilder<List<String>>(
+      future: _loadStrings(),
+      builder: (BuildContext context, AsyncSnapshot<List<String>> snapshot) {
+        if (snapshot.hasData) {
+          return ListView.builder(
+            shrinkWrap: true,
+            itemCount: snapshot.data!.length,
+            itemBuilder: (BuildContext context, int index) {
+              return _getNoteItemWidget(snapshot.data![index], context);
+            },
+          );
+        } else if (snapshot.hasError) {
+          return Text('Error: ${snapshot.error}');
+        } else {
+          return Center(child: CircularProgressIndicator());
+        }
+      },
+    );
+  }
+
+  Widget _getNoteItemWidget(String myString, BuildContext context) {
+    return Column(
+      children: [
+        DefaultTextStyle(
+            style: TextStyle(
+              decoration: TextDecoration.none,
+              fontSize: 16.0,
+              fontFamily: 'Lato',
+              color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!,
+            ),
+            child: Row(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                Padding(
+                  padding: const EdgeInsets.only(right: 8.0),
+                  child: Text('•'),
+                ),
+                Expanded(
+                  child: Text(myString),
+                ),
+              ],
+            )),
+        SizedBox(
+          height: 16.0,
+        )
+      ],
+    );
+  }
+}
diff --git a/lib/src/screens/restore/restore_from_backup_page.dart b/lib/src/screens/restore/restore_from_backup_page.dart
index 1ed2aec4b..16aa3dbef 100644
--- a/lib/src/screens/restore/restore_from_backup_page.dart
+++ b/lib/src/screens/restore/restore_from_backup_page.dart
@@ -1,6 +1,7 @@
 import 'package:cake_wallet/core/execution_state.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
@@ -39,43 +40,48 @@ class RestoreFromBackupPage extends BasePage {
       }
     });
 
-    return Container(
-        padding: EdgeInsets.only(bottom: 24, left: 24, right: 24),
-        child: Column(children: [
-          Expanded(
-            child: Container(
-              child: Center(
-                  child: TextFormField(
-                      obscureText: true,
-                      enableSuggestions: false,
-                      autocorrect: false,
-                      decoration: InputDecoration(
-                          hintText: S.of(context).enter_backup_password),
-                      keyboardType: TextInputType.visiblePassword,
-                      controller: textEditingController,
-                      style: TextStyle(fontSize: 26, color: Colors.black))),
-            ),
-          ),
-          Container(
-              child: Row(children: [
-            Expanded(
-                child: PrimaryButton(
-                    onPressed: () => presentFilePicker(),
-                    text: S.of(context).select_backup_file,
-                    color: Colors.grey,
-                    textColor: Colors.white)),
-            SizedBox(width: 20),
-            Expanded(child: Observer(builder: (_) {
-              return LoadingPrimaryButton(
-                  isLoading:
-                      restoreFromBackupViewModel.state is IsExecutingState,
-                  onPressed: () => onImportHandler(context),
-                  text: S.of(context).import,
-                  color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
-                  textColor: Colors.white);
-            }))
-          ])),
-        ]));
+    return Center(
+      child: ConstrainedBox(
+        constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+        child: Padding(
+            padding: EdgeInsets.only(bottom: 24, left: 24, right: 24),
+            child: Column(children: [
+              Expanded(
+                child: Container(
+                  child: Center(
+                      child: TextFormField(
+                          obscureText: true,
+                          enableSuggestions: false,
+                          autocorrect: false,
+                          decoration: InputDecoration(
+                              hintText: S.of(context).enter_backup_password),
+                          keyboardType: TextInputType.visiblePassword,
+                          controller: textEditingController,
+                          style: TextStyle(fontSize: 26, color: Colors.black))),
+                ),
+              ),
+              Container(
+                  child: Row(children: [
+                Expanded(
+                    child: PrimaryButton(
+                        onPressed: () => presentFilePicker(),
+                        text: S.of(context).select_backup_file,
+                        color: Colors.grey,
+                        textColor: Colors.white)),
+                SizedBox(width: 20),
+                Expanded(child: Observer(builder: (_) {
+                  return LoadingPrimaryButton(
+                      isLoading:
+                          restoreFromBackupViewModel.state is IsExecutingState,
+                      onPressed: () => onImportHandler(context),
+                      text: S.of(context).import,
+                      color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
+                      textColor: Colors.white);
+                }))
+              ])),
+            ])),
+      ),
+    );
   }
 
   Future<void> presentFilePicker() async {
diff --git a/lib/src/screens/restore/restore_options_page.dart b/lib/src/screens/restore/restore_options_page.dart
index a49fd3cc7..c08d2b7e4 100644
--- a/lib/src/screens/restore/restore_options_page.dart
+++ b/lib/src/screens/restore/restore_options_page.dart
@@ -1,3 +1,13 @@
+import 'package:cake_wallet/core/execution_state.dart';
+import 'package:cake_wallet/di.dart';
+import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart';
+import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
+import 'package:cake_wallet/utils/language_list.dart';
+import 'package:cake_wallet/utils/show_pop_up.dart';
+import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
+import 'package:cake_wallet/view_model/restore/wallet_restore_from_qr_code.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
+import 'package:cake_wallet/wallet_type_utils.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:flutter/cupertino.dart';
@@ -6,43 +16,91 @@ import 'package:cake_wallet/src/screens/base_page.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 
 class RestoreOptionsPage extends BasePage {
-  RestoreOptionsPage();
-
-  static const _aspectRatioImage = 2.086;
+  RestoreOptionsPage({required this.isNewInstall});
 
   @override
   String get title => S.current.restore_restore_wallet;
 
+
+  final bool isNewInstall;
   final imageSeedKeys = Image.asset('assets/images/restore_wallet_image.png');
   final imageBackup = Image.asset('assets/images/backup.png');
+  final qrCode = Image.asset('assets/images/qr_code_icon.png');
 
   @override
   Widget body(BuildContext context) {
-    return Container(
-        width: double.infinity,
-        height: double.infinity,
-        padding: EdgeInsets.all(24),
-        child: SingleChildScrollView(
-          child: Column(
-            children: <Widget>[
-              RestoreButton(
-                  onPressed: () =>
-                      Navigator.pushNamed(context, Routes.restoreWalletOptionsFromWelcome),
-                  image: imageSeedKeys,
-                  title: S.of(context).restore_title_from_seed_keys,
-                  description:
-                      S.of(context).restore_description_from_seed_keys),
-              Padding(
-                padding: EdgeInsets.only(top: 24),
-                child: RestoreButton(
-                    onPressed: () =>
-                        Navigator.pushNamed(context, Routes.restoreFromBackup),
-                    image: imageBackup,
-                    title: S.of(context).restore_title_from_backup,
-                    description: S.of(context).restore_description_from_backup),
-              )
-            ],
-          ),
-        ));
+    return Center(
+      child: Container(
+          width: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint,
+          height: double.infinity,
+          padding: EdgeInsets.symmetric(vertical: 24),
+          child: SingleChildScrollView(
+            child: Column(
+              children: <Widget>[
+                RestoreButton(
+                    onPressed: () => Navigator.pushNamed(
+                        context, Routes.restoreWalletFromSeedKeys,
+                        arguments: isNewInstall),
+                    image: imageSeedKeys,
+                    title: S.of(context).restore_title_from_seed_keys,
+                    description: S.of(context).restore_description_from_seed_keys),
+                if (isNewInstall)
+                  Padding(
+                    padding: EdgeInsets.only(top: 24),
+                    child: RestoreButton(
+                        onPressed: () => Navigator.pushNamed(context, Routes.restoreFromBackup),
+                        image: imageBackup,
+                        title: S.of(context).restore_title_from_backup,
+                        description: S.of(context).restore_description_from_backup),
+                  ),
+                Padding(
+                  padding: EdgeInsets.only(top: 24),
+                  child: RestoreButton(
+                      onPressed: () async {
+                        bool isPinSet = false;
+                        if (isNewInstall) {
+                          await Navigator.pushNamed(context, Routes.setupPin,
+                              arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
+                            setupPinContext.close();
+                            isPinSet = true;
+                          });
+                        }
+                        if (!isNewInstall || isPinSet) {
+                          try {
+                            final restoreWallet =
+                                await WalletRestoreFromQRCode.scanQRCodeForRestoring(context);
+
+                            final restoreFromQRViewModel = getIt.get<WalletRestorationFromQRVM>(param1: restoreWallet.type);
+
+                            await restoreFromQRViewModel.create(restoreWallet: restoreWallet);
+                            if (restoreFromQRViewModel.state is FailureState) {
+                              _onWalletCreateFailure(context,
+                                  'Create wallet state: ${restoreFromQRViewModel.state.runtimeType.toString()}');
+                            }
+                          } catch (e) {
+                            _onWalletCreateFailure(context, e.toString());
+                          }
+                        }
+                      },
+                      image: qrCode,
+                      title: S.of(context).scan_qr_code,
+                      description: S.of(context).cold_or_recover_wallet),
+                )
+              ],
+            ),
+          )),
+    );
+  }
+
+  void _onWalletCreateFailure(BuildContext context, String error) {
+    showPopUp<void>(
+        context: context,
+        builder: (BuildContext context) {
+          return AlertWithOneAction(
+              alertTitle: S.current.error,
+              alertContent: error,
+              buttonText: S.of(context).ok,
+              buttonAction: () => Navigator.of(context).pop());
+        });
   }
 }
diff --git a/lib/src/screens/restore/restore_wallet_from_keys_page.dart b/lib/src/screens/restore/restore_wallet_from_keys_page.dart
deleted file mode 100644
index 85243870a..000000000
--- a/lib/src/screens/restore/restore_wallet_from_keys_page.dart
+++ /dev/null
@@ -1,212 +0,0 @@
-import 'package:cake_wallet/core/wallet_name_validator.dart';
-import 'package:cake_wallet/palette.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_mobx/flutter_mobx.dart';
-import 'package:cake_wallet/generated/i18n.dart';
-import 'package:cake_wallet/src/screens/base_page.dart';
-import 'package:cake_wallet/src/widgets/primary_button.dart';
-import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
-import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
-import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
-import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart';
-import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
-
-class RestoreWalletFromKeysPage extends BasePage {
-  RestoreWalletFromKeysPage(
-      {required this.walletRestorationFromKeysVM});
-
-  final WalletRestorationFromKeysVM walletRestorationFromKeysVM;
-
-  @override
-  String get title => S.current.restore_title_from_keys;
-
-  @override
-  Widget body(BuildContext context) => RestoreFromKeysFrom(walletRestorationFromKeysVM);
-}
-
-class RestoreFromKeysFrom extends StatefulWidget {
-  RestoreFromKeysFrom(this.walletRestorationFromKeysVM);
-
-  final WalletRestorationFromKeysVM walletRestorationFromKeysVM;
-
-  @override
-  _RestoreFromKeysFromState createState() => _RestoreFromKeysFromState();
-}
-
-class _RestoreFromKeysFromState extends State<RestoreFromKeysFrom> {
-  final _formKey = GlobalKey<FormState>();
-  final _blockchainHeightKey = GlobalKey<BlockchainHeightState>();
-  final _nameController = TextEditingController();
-  final _addressController = TextEditingController();
-  final _viewKeyController = TextEditingController();
-  final _spendKeyController = TextEditingController();
-  final _wifController = TextEditingController();
-
-  @override
-  void initState() {
-    _nameController.addListener(() =>
-    widget.walletRestorationFromKeysVM.name = _nameController.text);
-    _addressController.addListener(() =>
-    widget.walletRestorationFromKeysVM.address = _addressController.text);
-    _viewKeyController.addListener(() =>
-    widget.walletRestorationFromKeysVM.viewKey = _viewKeyController.text);
-    _spendKeyController.addListener(() =>
-    widget.walletRestorationFromKeysVM.spendKey = _spendKeyController.text);
-    _wifController.addListener(() =>
-    widget.walletRestorationFromKeysVM.wif = _wifController.text);
-
-    super.initState();
-  }
-
-  @override
-  void dispose() {
-    _nameController.dispose();
-    _addressController.dispose();
-    _viewKeyController.dispose();
-    _spendKeyController.dispose();
-    _wifController.dispose();
-    super.dispose();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-
-    /*reaction((_) => walletRestorationStore.state, (WalletRestorationState state) {
-      if (state is WalletRestoredSuccessfully) {
-        Navigator.of(context).popUntil((route) => route.isFirst);
-      }
-
-      if (state is WalletRestorationFailure) {
-        WidgetsBinding.instance.addPostFrameCallback((_) {
-          showPopUp<void>(
-              context: context,
-              builder: (BuildContext context) {
-                return AlertWithOneAction(
-                    alertTitle: S.current.restore_title_from_keys,
-                    alertContent: state.error,
-                    buttonText: S.of(context).ok,
-                    buttonAction: () => Navigator.of(context).pop()
-                );
-              });
-        });
-      }
-    });*/
-
-    return Container(
-      padding: EdgeInsets.only(left: 24, right: 24),
-      child: ScrollableWithBottomSection(
-        contentPadding: EdgeInsets.only(bottom: 24.0),
-        content: Form(
-          key: _formKey,
-          child: Column(children: <Widget>[
-            Row(
-              children: <Widget>[
-                Flexible(
-                    child: Container(
-                      padding: EdgeInsets.only(top: 20.0),
-                      child: BaseTextFormField(
-                        controller: _nameController,
-                        hintText: S.of(context).restore_wallet_name,
-                        validator: WalletNameValidator(),
-                      )
-                    ))
-              ],
-            ),
-            if (!widget.walletRestorationFromKeysVM.hasRestorationHeight)
-            Row(
-              children: <Widget>[
-                Flexible(
-                  child: Container(
-                    padding: EdgeInsets.only(top: 20.0),
-                    child: BaseTextFormField(
-                      controller: _wifController,
-                      hintText: 'WIF',
-                    )
-                ))
-              ],
-            ),
-            if (widget.walletRestorationFromKeysVM.hasRestorationHeight) ... [
-            Row(
-              children: <Widget>[
-                Flexible(
-                    child: Container(
-                      padding: EdgeInsets.only(top: 20.0),
-                      child: BaseTextFormField(
-                        controller: _addressController,
-                        keyboardType: TextInputType.multiline,
-                        maxLines: null,
-                        hintText: S.of(context).restore_address,
-                      )
-                    ))
-              ],
-            ),
-            Row(
-              children: <Widget>[
-                Flexible(
-                    child: Container(
-                      padding: EdgeInsets.only(top: 20.0),
-                      child: BaseTextFormField(
-                        controller: _viewKeyController,
-                        hintText: S.of(context).restore_view_key_private,
-                      )
-                    ))
-              ],
-            ),
-            Row(
-              children: <Widget>[
-                Flexible(
-                    child: Container(
-                      padding: EdgeInsets.only(top: 20.0),
-                      child: BaseTextFormField(
-                        controller: _spendKeyController,
-                        hintText: S.of(context).restore_spend_key_private,
-                      )
-                    ))
-              ],
-            ),
-            BlockchainHeightWidget(
-              key: _blockchainHeightKey,
-              onHeightChange: (height) {
-                widget.walletRestorationFromKeysVM.height = height;
-                print(height);
-            }),
-            Padding(
-              padding: EdgeInsets.only(left: 40, right: 40, top: 24),
-              child: Text(
-                S.of(context).restore_from_date_or_blockheight,
-                textAlign: TextAlign.center,
-                style: TextStyle(
-                    fontSize: 12,
-                    fontWeight: FontWeight.normal,
-                    color: Theme.of(context).hintColor
-                ),
-              ),
-            )],
-          ]),
-        ),
-        bottomSectionPadding: EdgeInsets.only(bottom: 24),
-        bottomSection: Observer(builder: (_) {
-          return LoadingPrimaryButton(
-            onPressed: () {
-              if (_formKey.currentState != null && _formKey.currentState!.validate()) {
-                /*walletRestorationStore.restoreFromKeys(
-                    name: _nameController.text,
-                    language: seedLanguageStore.selectedSeedLanguage,
-                    address: _addressController.text,
-                    viewKey: _viewKeyController.text,
-                    spendKey: _spendKeyController.text,
-                    restoreHeight: _blockchainHeightKey.currentState.height);*/
-              }
-            },
-            text: S.of(context).restore_recover,
-            color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
-            textColor: Colors.white,
-            //isDisabled: walletRestorationStore.disabledState,
-          );
-        }),
-      ),
-    );
-  }
-}
diff --git a/lib/src/screens/restore/restore_wallet_from_seed_page.dart b/lib/src/screens/restore/restore_wallet_from_seed_page.dart
deleted file mode 100644
index 31a854049..000000000
--- a/lib/src/screens/restore/restore_wallet_from_seed_page.dart
+++ /dev/null
@@ -1,199 +0,0 @@
-import 'package:cake_wallet/src/screens/restore/restore_from_keys.dart';
-import 'package:cake_wallet/src/screens/restore/wallet_restore_from_seed_form.dart';
-import 'package:cake_wallet/src/screens/seed_language/widgets/seed_language_picker.dart';
-import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
-import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
-import 'package:cake_wallet/src/widgets/primary_button.dart';
-import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
-import 'package:cake_wallet/utils/show_pop_up.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:cake_wallet/routes.dart';
-import 'package:cake_wallet/generated/i18n.dart';
-import 'package:cake_wallet/src/screens/base_page.dart';
-import 'package:cake_wallet/src/widgets/seed_widget.dart';
-import 'package:cw_core/wallet_type.dart';
-import 'package:cake_wallet/core/seed_validator.dart';
-import 'package:cake_wallet/core/mnemonic_length.dart';
-import 'package:smooth_page_indicator/smooth_page_indicator.dart';
-
-class RestoreWalletFromSeedPage extends BasePage {
-  RestoreWalletFromSeedPage({required this.type})
-    : _pages = <Widget>[];
-
-  final WalletType type;
-  final String language = 'en';
-
-  // final formKey = GlobalKey<_RestoreFromSeedFormState>();
-  // final formKey = GlobalKey<_RestoreFromSeedFormState>();
-
-  @override
-  String get title => S.current.restore_title_from_seed;
-
-  final controller = PageController(initialPage: 0);
-  List<Widget> _pages;
-
-  Widget _page(BuildContext context, int index) {
-    if (_pages == null || _pages.isEmpty) {
-      _setPages(context);
-    }
-
-    return _pages[index];
-  }
-
-  int _pageLength(BuildContext context) {
-    if (_pages == null || _pages.isEmpty) {
-      _setPages(context);
-    }
-
-    return _pages.length;
-  }
-
-  void _setPages(BuildContext context) {
-    _pages = <Widget>[
-      // FIX-ME: Added args (displayBlockHeightSelector: true, displayLanguageSelector: true, type: type)
-      WalletRestoreFromSeedForm(displayBlockHeightSelector: true, displayLanguageSelector: true, type: type),
-      RestoreFromKeysFrom(),
-    ];
-  }
-
-  @override
-  Widget body(BuildContext context) {
-    return Column(mainAxisAlignment: MainAxisAlignment.center, children: [
-      Expanded(
-          child: PageView.builder(
-              onPageChanged: (page) {
-                print('Page index $page');
-              },
-              controller: controller,
-              itemCount: _pageLength(context),
-              itemBuilder: (context, index) => _page(context, index))),
-      Padding(
-          padding: EdgeInsets.only(top: 10),
-          child: SmoothPageIndicator(
-            controller: controller,
-            count: _pageLength(context),
-            effect: ColorTransitionEffect(
-                spacing: 6.0,
-                radius: 6.0,
-                dotWidth: 6.0,
-                dotHeight: 6.0,
-                dotColor: Theme.of(context).hintColor.withOpacity(0.5),
-                activeDotColor: Theme.of(context).hintColor),
-          )),
-      Padding(
-          padding: EdgeInsets.only(top: 20, bottom: 24, left: 24, right: 24),
-          child: PrimaryButton(
-              text: S.of(context).restore_recover,
-              isDisabled: false,
-              onPressed: () => null,
-              color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
-              textColor: Colors.white)),
-    ]);
-
-    // return GestureDetector(
-    //   onTap: () =>
-    //       SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
-    //   child: ScrollableWithBottomSection(
-    //       bottomSection: Column(children: [
-    //         GestureDetector(
-    //             onTap: () {},
-    //             child: Text('Switch to restore from keys',
-    //                 style: TextStyle(fontSize: 15, color: Theme.of(context).hintColor))),
-    //         SizedBox(height: 30),
-    //         PrimaryButton(
-    //             text: S.of(context).restore_next,
-    //             isDisabled: false,
-    //             onPressed: () => null,
-    //             color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
-    //             textColor: Colors.white)
-    //       ]),
-    //       contentPadding: EdgeInsets.only(bottom: 24),
-    //       content: Container(
-    //           padding: EdgeInsets.only(left: 25, right: 25),
-    //           child: Column(children: [
-    //             SeedWidget(
-    //               maxLength: mnemonicLength(type),
-    //               onMnemonicChange: (seed) => null,
-    //               onFinish: () => Navigator.of(context).pushNamed(
-    //                   Routes.restoreWalletFromSeedDetails,
-    //                   arguments: [type, language, '']),
-    //               validator: SeedValidator(type: type, language: language),
-    //             ),
-    //             // SizedBox(height: 15),
-    //             // BaseTextFormField(hintText: 'Language', initialValue: 'English'),
-    //             BlockchainHeightWidget(
-    //                 // key: _blockchainHeightKey,
-    //                 onHeightChange: (height) {
-    //               // widget.walletRestorationFromKeysVM.height = height;
-    //               print(height);
-    //             })
-    //           ]))),
-    // );
-  }
-}
-
-class RestoreFromSeedForm extends StatefulWidget {
-  RestoreFromSeedForm(
-      {Key? key,
-      required this.type,
-      this.language,
-      this.leading,
-      this.middle})
-      : super(key: key);
-  final WalletType type;
-  final String? language;
-  final Widget? leading;
-  final Widget? middle;
-
-  @override
-  _RestoreFromSeedFormState createState() => _RestoreFromSeedFormState();
-}
-
-class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
-  // final _seedKey = GlobalKey<SeedWidgetState>();
-
-  String mnemonic() =>
-      ''; // _seedKey.currentState.items.map((e) => e.text).join(' ');
-
-  @override
-  Widget build(BuildContext context) {
-    return GestureDetector(
-      onTap: () =>
-          SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
-      child: Container(
-          padding: EdgeInsets.only(left: 24, right: 24),
-          // color: Colors.blue,
-          // height: 300,
-          child: Column(children: [
-            SeedWidget(
-              type: widget.type,
-              language: widget.language ?? '',
-              // key: _seedKey,
-              // maxLength: mnemonicLength(widget.type),
-              // onMnemonicChange: (seed) => null,
-              // onFinish: () => Navigator.of(context).pushNamed(
-              //     Routes.restoreWalletFromSeedDetails,
-              //     arguments: [widget.type, widget.language, mnemonic()]),
-              // leading: widget.leading,
-              // middle: widget.middle,
-              // validator:
-              //     SeedValidator(type: widget.type, language: widget.language),
-            ),
-            BlockchainHeightWidget(
-                // key: _blockchainHeightKey,
-                onHeightChange: (height) {
-              // widget.walletRestorationFromKeysVM.height = height;
-              print(height);
-            }),
-            Container(
-                color: Colors.green,
-                width: 100,
-                height: 56,
-                child: BaseTextFormField(
-                    hintText: 'Language', initialValue: 'English')),
-          ])),
-    );
-  }
-}
diff --git a/lib/src/screens/restore/sweeping_wallet_page.dart b/lib/src/screens/restore/sweeping_wallet_page.dart
new file mode 100644
index 000000000..a7828b385
--- /dev/null
+++ b/lib/src/screens/restore/sweeping_wallet_page.dart
@@ -0,0 +1,123 @@
+import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:flutter/material.dart';
+import 'package:cake_wallet/src/screens/base_page.dart';
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:flutter/scheduler.dart';
+
+class SweepingWalletPage extends BasePage {
+  SweepingWalletPage();
+
+  static const aspectRatioImage = 1.25;
+  final welcomeImageLight = Image.asset('assets/images/welcome_light.png');
+  final welcomeImageDark = Image.asset('assets/images/welcome.png');
+
+
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        backgroundColor: Theme.of(context).backgroundColor,
+        resizeToAvoidBottomInset: false,
+        body: body(context));
+  }
+
+  @override
+  Widget body(BuildContext context) {
+    final welcomeImage = currentTheme.type == ThemeType.dark ? welcomeImageDark : welcomeImageLight;
+
+    return SweepingWalletWidget(
+      aspectRatioImage: aspectRatioImage,
+      welcomeImage: welcomeImage,
+    );
+  }
+}
+
+class SweepingWalletWidget extends StatefulWidget {
+  const SweepingWalletWidget({
+    required this.aspectRatioImage,
+    required this.welcomeImage,
+  });
+
+  final double aspectRatioImage;
+  final Image welcomeImage;
+
+  @override
+  State<SweepingWalletWidget> createState() => _SweepingWalletWidgetState();
+}
+
+class _SweepingWalletWidgetState extends State<SweepingWalletWidget> {
+  @override
+  void initState() {
+    SchedulerBinding.instance.addPostFrameCallback((_) async {
+
+    });
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return WillPopScope(
+        onWillPop: () async => false,
+        child: Container(
+            padding: EdgeInsets.only(top: 64, bottom: 24, left: 24, right: 24),
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: <Widget>[
+                Flexible(
+                    flex: 2,
+                    child: AspectRatio(
+                        aspectRatio: widget.aspectRatioImage,
+                        child: FittedBox(child: widget.welcomeImage, fit: BoxFit.fill))),
+                Flexible(
+                    flex: 3,
+                    child: Column(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: <Widget>[
+                        Column(
+                          children: <Widget>[
+                            Padding(
+                              padding: EdgeInsets.only(top: 24),
+                              child: Text(
+                                S.of(context).please_wait,
+                                style: TextStyle(
+                                  fontSize: 18,
+                                  fontWeight: FontWeight.w500,
+                                  color: Theme.of(context).accentTextTheme!.headline2!.color!,
+                                ),
+                                textAlign: TextAlign.center,
+                              ),
+                            ),
+                            Padding(
+                              padding: EdgeInsets.only(top: 5),
+                              child: Text(
+                                S.of(context).sweeping_wallet,
+                                style: TextStyle(
+                                  fontSize: 36,
+                                  fontWeight: FontWeight.bold,
+                                  color: Theme.of(context).primaryTextTheme!.headline6!.color!,
+                                ),
+                                textAlign: TextAlign.center,
+                              ),
+                            ),
+                            Padding(
+                              padding: EdgeInsets.only(top: 5),
+                              child: Text(
+                                S.of(context).sweeping_wallet_alert,
+                                style: TextStyle(
+                                  fontSize: 16,
+                                  fontWeight: FontWeight.w500,
+                                  color: Theme.of(context).accentTextTheme!.headline2!.color!,
+                                ),
+                                textAlign: TextAlign.center,
+                              ),
+                            ),
+                          ],
+                        ),
+                      ],
+                    ))
+              ],
+            )));
+  }
+}
+
+
diff --git a/lib/src/screens/restore/wallet_restore_from_seed_form.dart b/lib/src/screens/restore/wallet_restore_from_seed_form.dart
index 5849eb2e6..3071d9a82 100644
--- a/lib/src/screens/restore/wallet_restore_from_seed_form.dart
+++ b/lib/src/screens/restore/wallet_restore_from_seed_form.dart
@@ -113,16 +113,10 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
           if (widget.displayLanguageSelector)
             GestureDetector(
                 onTap: () async {
-                  final selected = await showPopUp<String>(
+                  await showPopUp<void>(
                       context: context,
-                      builder: (BuildContext context) =>
-                          SeedLanguagePicker(selected: language));
-
-                  if (selected == null || selected.isEmpty) {
-                    return;
-                  }
-
-                  _changeLanguage(selected);
+                      builder: (_) => SeedLanguagePicker(
+                          selected: language, onItemSelected: _changeLanguage));
                 },
                 child: Container(
                     color: Colors.transparent,
diff --git a/lib/src/screens/restore/wallet_restore_page.dart b/lib/src/screens/restore/wallet_restore_page.dart
index ce9af985e..aa9d31f1b 100644
--- a/lib/src/screens/restore/wallet_restore_page.dart
+++ b/lib/src/screens/restore/wallet_restore_page.dart
@@ -1,5 +1,6 @@
 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
 import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -20,13 +21,12 @@ import 'package:cake_wallet/core/validator.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
 import 'package:cake_wallet/core/seed_validator.dart';
+import 'package:cake_wallet/view_model/restore/restore_mode.dart';
 
 class WalletRestorePage extends BasePage {
   WalletRestorePage(this.walletRestoreViewModel)
-      : walletRestoreFromSeedFormKey =
-            GlobalKey<WalletRestoreFromSeedFormState>(),
-        walletRestoreFromKeysFormKey =
-            GlobalKey<WalletRestoreFromKeysFromState>(),
+      : walletRestoreFromSeedFormKey = GlobalKey<WalletRestoreFromSeedFormState>(),
+        walletRestoreFromKeysFormKey = GlobalKey<WalletRestoreFromKeysFromState>(),
         _pages = [],
         _blockHeightFocusNode = FocusNode(),
         _controller = PageController(initialPage: 0) {
@@ -36,9 +36,8 @@ class WalletRestorePage extends BasePage {
           _pages.add(WalletRestoreFromSeedForm(
               displayBlockHeightSelector:
                   walletRestoreViewModel.hasBlockchainHeightLanguageSelector,
-              displayLanguageSelector:
-                  walletRestoreViewModel.hasSeedLanguageSelector,
-              type: walletRestoreViewModel.type!,
+              displayLanguageSelector: walletRestoreViewModel.hasSeedLanguageSelector,
+              type: walletRestoreViewModel.type,
               key: walletRestoreFromSeedFormKey,
               blockHeightFocusNode: _blockHeightFocusNode,
               onHeightOrDateEntered: (value) {
@@ -48,26 +47,22 @@ class WalletRestorePage extends BasePage {
               },
               onSeedChange: (String seed) {
                 if (walletRestoreViewModel.hasBlockchainHeightLanguageSelector) {
-                  final hasHeight = walletRestoreFromSeedFormKey
-                      .currentState!.blockchainHeightKey.currentState!.restoreHeightController
-                      .text
-                      .isNotEmpty;
+                  final hasHeight = walletRestoreFromSeedFormKey.currentState!.blockchainHeightKey
+                      .currentState!.restoreHeightController.text.isNotEmpty;
                   if (hasHeight) {
                     walletRestoreViewModel.isButtonEnabled = _isValidSeed();
                   }
                 } else {
-                    walletRestoreViewModel.isButtonEnabled = _isValidSeed();
+                  walletRestoreViewModel.isButtonEnabled = _isValidSeed();
                 }
               },
               onLanguageChange: (_) {
                 if (walletRestoreViewModel.hasBlockchainHeightLanguageSelector) {
-                  final hasHeight = walletRestoreFromSeedFormKey
-                    .currentState!.blockchainHeightKey.currentState!.restoreHeightController
-                    .text
-                    .isNotEmpty;
+                  final hasHeight = walletRestoreFromSeedFormKey.currentState!.blockchainHeightKey
+                      .currentState!.restoreHeightController.text.isNotEmpty;
 
                   if (hasHeight) {
-                    walletRestoreViewModel.isButtonEnabled = _isValidSeed(); 
+                    walletRestoreViewModel.isButtonEnabled = _isValidSeed();
                   }
                 } else {
                   walletRestoreViewModel.isButtonEnabled = _isValidSeed();
@@ -78,8 +73,7 @@ class WalletRestorePage extends BasePage {
           _pages.add(WalletRestoreFromKeysFrom(
               key: walletRestoreFromKeysFormKey,
               walletRestoreViewModel: walletRestoreViewModel,
-              onHeightOrDateEntered: (value) =>
-                  walletRestoreViewModel.isButtonEnabled = value));
+              onHeightOrDateEntered: (value) => walletRestoreViewModel.isButtonEnabled = value));
           break;
         default:
           break;
@@ -97,8 +91,7 @@ class WalletRestorePage extends BasePage {
                 fontSize: 18.0,
                 fontWeight: FontWeight.bold,
                 fontFamily: 'Lato',
-                color: titleColor ??
-                    Theme.of(context).primaryTextTheme!.headline6!.color!),
+                color: titleColor ?? Theme.of(context).primaryTextTheme.headline6!.color!),
           ));
 
   final WalletRestoreViewModel walletRestoreViewModel;
@@ -129,134 +122,134 @@ class WalletRestorePage extends BasePage {
     reaction((_) => walletRestoreViewModel.mode, (WalletRestoreMode mode) {
       walletRestoreViewModel.isButtonEnabled = false;
 
-      walletRestoreFromSeedFormKey.currentState!.blockchainHeightKey.currentState
-          !.restoreHeightController.text = '';
-      walletRestoreFromSeedFormKey.currentState!.blockchainHeightKey.currentState
-          !.dateController.text = '';
+      walletRestoreFromSeedFormKey
+          .currentState!.blockchainHeightKey.currentState!.restoreHeightController.text = '';
+      walletRestoreFromSeedFormKey
+          .currentState!.blockchainHeightKey.currentState!.dateController.text = '';
       walletRestoreFromSeedFormKey.currentState!.nameTextEditingController.text = '';
 
-      walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState
-          !.restoreHeightController.text = '';
-      walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState
-          !.dateController.text = '';
+      walletRestoreFromKeysFormKey
+          .currentState!.blockchainHeightKey.currentState!.restoreHeightController.text = '';
+      walletRestoreFromKeysFormKey
+          .currentState!.blockchainHeightKey.currentState!.dateController.text = '';
       walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.text = '';
     });
 
     return KeyboardActions(
-    config: KeyboardActionsConfig(
-            keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
-            keyboardBarColor: Theme.of(context).accentTextTheme!.bodyText1!
-                .backgroundColor!,
-            nextFocus: false,
-            actions: [
-              KeyboardActionsItem(
-                focusNode: _blockHeightFocusNode,
-                toolbarButtons: [(_) => KeyboardDoneButton()],
-              )
-            ]),
-    child: Container(
-          height: 0,
-          color: Theme.of(context).backgroundColor,
-	  child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
-      Expanded(
-          child: PageView.builder(
-              onPageChanged: (page) {
-                walletRestoreViewModel.mode =
-                    page == 0 ? WalletRestoreMode.seed : WalletRestoreMode.keys;
-              },
-              controller: _controller,
-              itemCount: _pages.length,
-              itemBuilder: (_, index) =>
-                  SingleChildScrollView(child: _pages[index]))),
-      if (_pages.length > 1)
-        Padding(
-            padding: EdgeInsets.only(top: 10),
-            child: SmoothPageIndicator(
-              controller: _controller,
-              count: _pages.length,
-              effect: ColorTransitionEffect(
-                  spacing: 6.0,
-                  radius: 6.0,
-                  dotWidth: 6.0,
-                  dotHeight: 6.0,
-                  dotColor: Theme.of(context).hintColor.withOpacity(0.5),
-                  activeDotColor: Theme.of(context).hintColor),
-            )),
-      Padding(
-          padding: EdgeInsets.only(top: 20, bottom: 24, left: 24, right: 24),
-          child: Observer(
-            builder: (context) {
-              return LoadingPrimaryButton(
-                onPressed: _confirmForm,
-                text: S.of(context).restore_recover,
-                color:
-                    Theme.of(context).accentTextTheme!.subtitle2!.decorationColor!,
-                textColor:
-                    Theme.of(context).accentTextTheme!.headline5!.decorationColor!,
-                isLoading: walletRestoreViewModel.state is IsExecutingState,
-                isDisabled: !walletRestoreViewModel.isButtonEnabled,
-              );
-            },
-          ))
-    ])));
+      config: KeyboardActionsConfig(
+        keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
+        keyboardBarColor: Theme.of(context).accentTextTheme.bodyText1!.backgroundColor!,
+        nextFocus: false,
+        actions: [
+          KeyboardActionsItem(
+            focusNode: _blockHeightFocusNode,
+            toolbarButtons: [(_) => KeyboardDoneButton()],
+          )
+        ],
+      ),
+      child: Container(
+        height: 0,
+        color: Theme.of(context).backgroundColor,
+        child: Center(
+          child: ConstrainedBox(
+            constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                Expanded(
+                  child: PageView.builder(
+                    onPageChanged: (page) {
+                      walletRestoreViewModel.mode =
+                          page == 0 ? WalletRestoreMode.seed : WalletRestoreMode.keys;
+                    },
+                    controller: _controller,
+                    itemCount: _pages.length,
+                    itemBuilder: (_, index) => SingleChildScrollView(child: _pages[index]),
+                  ),
+                ),
+                if (_pages.length > 1)
+                  Padding(
+                    padding: EdgeInsets.only(top: 10),
+                    child: SmoothPageIndicator(
+                      controller: _controller,
+                      count: _pages.length,
+                      effect: ColorTransitionEffect(
+                        spacing: 6.0,
+                        radius: 6.0,
+                        dotWidth: 6.0,
+                        dotHeight: 6.0,
+                        dotColor: Theme.of(context).hintColor.withOpacity(0.5),
+                        activeDotColor: Theme.of(context).hintColor,
+                      ),
+                    ),
+                  ),
+                Padding(
+                  padding: EdgeInsets.only(top: 20, bottom: 24, left: 24, right: 24),
+                  child: Observer(
+                    builder: (context) {
+                      return LoadingPrimaryButton(
+                        onPressed: _confirmForm,
+                        text: S.of(context).restore_recover,
+                        color: Theme.of(context).accentTextTheme.subtitle2!.decorationColor!,
+                        textColor: Theme.of(context).accentTextTheme.headline5!.decorationColor!,
+                        isLoading: walletRestoreViewModel.state is IsExecutingState,
+                        isDisabled: !walletRestoreViewModel.isButtonEnabled,
+                      );
+                    },
+                  ),
+                )
+              ],
+            ),
+          ),
+        ),
+      ),
+    );
   }
 
   bool _isValidSeed() {
-    final seedWords = walletRestoreFromSeedFormKey
-      .currentState
-      !.seedWidgetStateKey
-      .currentState
-      !.text
-      .split(' ');
+    final seedWords =
+        walletRestoreFromSeedFormKey.currentState!.seedWidgetStateKey.currentState!.text.split(' ');
 
-    if ((walletRestoreViewModel.type == WalletType.monero || walletRestoreViewModel.type == WalletType.haven) &&
+    if ((walletRestoreViewModel.type == WalletType.monero ||
+            walletRestoreViewModel.type == WalletType.haven) &&
         seedWords.length != WalletRestoreViewModelBase.moneroSeedMnemonicLength) {
       return false;
     }
-    
+
     if ((walletRestoreViewModel.type == WalletType.bitcoin ||
-        walletRestoreViewModel.type == WalletType.litecoin) && 
-      (seedWords.length != WalletRestoreViewModelBase.electrumSeedMnemonicLength &&
-        seedWords.length != WalletRestoreViewModelBase.electrumShortSeedMnemonicLength)) {
+            walletRestoreViewModel.type == WalletType.litecoin) &&
+        (seedWords.length != WalletRestoreViewModelBase.electrumSeedMnemonicLength &&
+            seedWords.length != WalletRestoreViewModelBase.electrumShortSeedMnemonicLength)) {
       return false;
     }
 
-    final words = walletRestoreFromSeedFormKey
-      .currentState
-      !.seedWidgetStateKey
-      .currentState
-      !.words
-      .toSet();
-    return seedWords
-      .toSet()
-      .difference(words)
-      .toSet()
-      .isEmpty;
+    final words =
+        walletRestoreFromSeedFormKey.currentState!.seedWidgetStateKey.currentState!.words.toSet();
+    return seedWords.toSet().difference(words).toSet().isEmpty;
   }
 
   Map<String, dynamic> _credentials() {
     final credentials = <String, dynamic>{};
 
     if (walletRestoreViewModel.mode == WalletRestoreMode.seed) {
-      credentials['seed'] = walletRestoreFromSeedFormKey
-          .currentState!.seedWidgetStateKey.currentState!.text;
+      credentials['seed'] =
+          walletRestoreFromSeedFormKey.currentState!.seedWidgetStateKey.currentState!.text;
 
       if (walletRestoreViewModel.hasBlockchainHeightLanguageSelector) {
-        credentials['height'] = walletRestoreFromSeedFormKey
-            .currentState!.blockchainHeightKey.currentState!.height;
+        credentials['height'] =
+            walletRestoreFromSeedFormKey.currentState!.blockchainHeightKey.currentState!.height;
       }
 
-      credentials['name'] = walletRestoreFromSeedFormKey.currentState!.nameTextEditingController.text;
+      credentials['name'] =
+          walletRestoreFromSeedFormKey.currentState!.nameTextEditingController.text;
     } else {
-      credentials['address'] =
-          walletRestoreFromKeysFormKey.currentState!.addressController.text;
-      credentials['viewKey'] =
-          walletRestoreFromKeysFormKey.currentState!.viewKeyController.text;
-      credentials['spendKey'] =
-          walletRestoreFromKeysFormKey.currentState!.spendKeyController.text;
-      credentials['height'] = walletRestoreFromKeysFormKey
-          .currentState!.blockchainHeightKey.currentState!.height;
-      credentials['name'] = walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.text;
+      credentials['address'] = walletRestoreFromKeysFormKey.currentState!.addressController.text;
+      credentials['viewKey'] = walletRestoreFromKeysFormKey.currentState!.viewKeyController.text;
+      credentials['spendKey'] = walletRestoreFromKeysFormKey.currentState!.spendKeyController.text;
+      credentials['height'] =
+          walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState!.height;
+      credentials['name'] =
+          walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.text;
     }
 
     return credentials;
@@ -272,10 +265,8 @@ class WalletRestorePage extends BasePage {
         : walletRestoreFromKeysFormKey.currentState!.formKey;
 
     final name = walletRestoreViewModel.mode == WalletRestoreMode.seed
-        ? walletRestoreFromSeedFormKey
-        .currentState!.nameTextEditingController.value.text
-        : walletRestoreFromKeysFormKey
-        .currentState!.nameTextEditingController.value.text;
+        ? walletRestoreFromSeedFormKey.currentState!.nameTextEditingController.value.text
+        : walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.value.text;
 
     if (!formKey.currentState!.validate()) {
       return;
@@ -301,5 +292,3 @@ class WalletRestorePage extends BasePage {
         });
   }
 }
-
-
diff --git a/lib/src/screens/root/root.dart b/lib/src/screens/root/root.dart
index 2526d15f3..fe7ea26a8 100644
--- a/lib/src/screens/root/root.dart
+++ b/lib/src/screens/root/root.dart
@@ -1,5 +1,6 @@
 import 'dart:async';
 import 'package:cake_wallet/core/auth_service.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/utils/payment_request.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/routes.dart';
@@ -54,7 +55,9 @@ class RootState extends State<Root> with WidgetsBindingObserver {
     WidgetsBinding.instance.addObserver(this);
     super.initState();
 
-    initUniLinks();
+    if (DeviceInfo.instance.isMobile) {
+      initUniLinks();
+    }
   }
 
   @override
diff --git a/lib/src/screens/seed/pre_seed_page.dart b/lib/src/screens/seed/pre_seed_page.dart
index c4ecbbf9a..86d88c96e 100644
--- a/lib/src/screens/seed/pre_seed_page.dart
+++ b/lib/src/screens/seed/pre_seed_page.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
@@ -33,44 +34,48 @@ class PreSeedPage extends BasePage {
     return WillPopScope(
         onWillPop: () async => false,
         child: Container(
+          alignment: Alignment.center,
           padding: EdgeInsets.all(24),
-          child: Column(
-            children: [
-              Flexible(
-                  flex: 2,
-                  child: AspectRatio(
-                      aspectRatio: 1,
-                      child: FittedBox(child: image, fit: BoxFit.contain))),
-              Flexible(
-                  flex: 3,
-                  child: Column(
-                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: [
-                      Padding(
-                        padding: EdgeInsets.only(top: 70, left: 16, right: 16),
-                        child: Text(
-                          S
-                              .of(context)
-                              .pre_seed_description(wordsCount.toString()),
-                          textAlign: TextAlign.center,
-                          style: TextStyle(
-                              fontSize: 14,
-                              fontWeight: FontWeight.normal,
-                              color: Theme.of(context)
-                                  .primaryTextTheme!
-                                  .caption!
-                                  .color!),
+          child: ConstrainedBox(
+              constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+            child: Column(
+              children: [
+                Flexible(
+                    flex: 2,
+                    child: AspectRatio(
+                        aspectRatio: 1,
+                        child: FittedBox(child: image, fit: BoxFit.contain))),
+                Flexible(
+                    flex: 3,
+                    child: Column(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        Padding(
+                          padding: EdgeInsets.only(top: 70, left: 16, right: 16),
+                          child: Text(
+                            S
+                                .of(context)
+                                .pre_seed_description(wordsCount.toString()),
+                            textAlign: TextAlign.center,
+                            style: TextStyle(
+                                fontSize: 14,
+                                fontWeight: FontWeight.normal,
+                                color: Theme.of(context)
+                                    .primaryTextTheme!
+                                    .caption!
+                                    .color!),
+                          ),
                         ),
-                      ),
-                      PrimaryButton(
-                          onPressed: () => Navigator.of(context)
-                              .popAndPushNamed(Routes.seed, arguments: true),
-                          text: S.of(context).pre_seed_button_text,
-                          color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
-                          textColor: Colors.white)
-                    ],
-                  ))
-            ],
+                        PrimaryButton(
+                            onPressed: () => Navigator.of(context)
+                                .popAndPushNamed(Routes.seed, arguments: true),
+                            text: S.of(context).pre_seed_button_text,
+                            color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
+                            textColor: Colors.white)
+                      ],
+                    ))
+              ],
+            ),
           ),
         ));
   }
diff --git a/lib/src/screens/seed/wallet_seed_page.dart b/lib/src/screens/seed/wallet_seed_page.dart
index 64895db36..034ab832c 100644
--- a/lib/src/screens/seed/wallet_seed_page.dart
+++ b/lib/src/screens/seed/wallet_seed_page.dart
@@ -2,6 +2,7 @@ import 'package:cake_wallet/palette.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
 import 'package:cake_wallet/utils/share_util.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/utils/show_bar.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:flutter/material.dart';
@@ -52,7 +53,7 @@ class WalletSeedPage extends BasePage {
 
   @override
   Widget? leading(BuildContext context) =>
-      isNewWalletCreated ? Offstage() : super.leading(context);
+      isNewWalletCreated ? null: super.leading(context);
 
   @override
   Widget trailing(BuildContext context) {
@@ -85,114 +86,119 @@ class WalletSeedPage extends BasePage {
 
     return WillPopScope(onWillPop: () async => false, child:  Container(
         padding: EdgeInsets.all(24),
-        child: Column(
-          children: <Widget>[
-            Flexible(
-                flex: 2,
-                child: AspectRatio(
-                    aspectRatio: 1,
-                    child: FittedBox(child: image, fit: BoxFit.fill))),
-            Flexible(
-                flex: 3,
-                child: Column(
-                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                  children: <Widget>[
-                    Padding(
-                      padding: EdgeInsets.only(top: 33),
-                      child: Observer(builder: (_) {
-                        return Column(
-                          crossAxisAlignment: CrossAxisAlignment.center,
-                          children: <Widget>[
-                            Text(
-                              walletSeedViewModel.name,
-                              style: TextStyle(
-                                  fontSize: 20,
-                                  fontWeight: FontWeight.w600,
-                                  color: Theme.of(context)
-                                      .primaryTextTheme!
-                                      .headline6!
-                                      .color!),
-                            ),
-                            Padding(
-                              padding:
-                                  EdgeInsets.only(top: 20, left: 16, right: 16),
-                              child: Text(
-                                walletSeedViewModel.seed,
-                                textAlign: TextAlign.center,
+        alignment: Alignment.center,
+        child: ConstrainedBox(
+          constraints:
+              BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+          child: Column(
+            children: <Widget>[
+              Flexible(
+                  flex: 2,
+                  child: AspectRatio(
+                      aspectRatio: 1,
+                      child: FittedBox(child: image, fit: BoxFit.fill))),
+              Flexible(
+                  flex: 3,
+                  child: Column(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: <Widget>[
+                      Padding(
+                        padding: EdgeInsets.only(top: 33),
+                        child: Observer(builder: (_) {
+                          return Column(
+                            crossAxisAlignment: CrossAxisAlignment.center,
+                            children: <Widget>[
+                              Text(
+                                walletSeedViewModel.name,
                                 style: TextStyle(
-                                    fontSize: 14,
-                                    fontWeight: FontWeight.normal,
+                                    fontSize: 20,
+                                    fontWeight: FontWeight.w600,
                                     color: Theme.of(context)
                                         .primaryTextTheme!
-                                        .caption!
+                                        .headline6!
                                         .color!),
                               ),
-                            )
-                          ],
-                        );
-                      }),
-                    ),
-                    Column(
-                      children: <Widget>[
-                        isNewWalletCreated
-                            ? Padding(
-                                padding: EdgeInsets.only(
-                                    bottom: 52, left: 43, right: 43),
+                              Padding(
+                                padding:
+                                    EdgeInsets.only(top: 20, left: 16, right: 16),
                                 child: Text(
-                                  S.of(context).seed_reminder,
+                                  walletSeedViewModel.seed,
                                   textAlign: TextAlign.center,
                                   style: TextStyle(
-                                      fontSize: 12,
+                                      fontSize: 14,
                                       fontWeight: FontWeight.normal,
                                       color: Theme.of(context)
                                           .primaryTextTheme!
-                                          .overline!
+                                          .caption!
                                           .color!),
                                 ),
                               )
-                            : Offstage(),
-                        Row(
-                          mainAxisSize: MainAxisSize.max,
-                          children: <Widget>[
-                            Flexible(
-                                child: Container(
-                              padding: EdgeInsets.only(right: 8.0),
-                              child: PrimaryButton(
-                                  onPressed: () {
-                                    ShareUtil.share(
-                                      text: walletSeedViewModel.seed,
-                                      context: context,
-                                    );
-                                  },
-                                  text: S.of(context).save,
-                                  color: Colors.green,
-                                  textColor: Colors.white),
-                            )),
-                            Flexible(
-                                child: Container(
-                              padding: EdgeInsets.only(left: 8.0),
-                              child: Builder(
-                                  builder: (context) => PrimaryButton(
-                                      onPressed: () {
-                                        Clipboard.setData(ClipboardData(
-                                            text: walletSeedViewModel.seed));
-                                        showBar<void>(context,
-                                            S.of(context).copied_to_clipboard);
-                                      },
-                                      text: S.of(context).copy,
-                                      color: Theme.of(context)
-                                          .accentTextTheme!
-                                          .bodyText2!
-                                          .color!,
-                                      textColor: Colors.white)),
-                            ))
-                          ],
-                        )
-                      ],
-                    )
-                  ],
-                ))
-          ],
+                            ],
+                          );
+                        }),
+                      ),
+                      Column(
+                        children: <Widget>[
+                          isNewWalletCreated
+                              ? Padding(
+                                  padding: EdgeInsets.only(
+                                      bottom: 52, left: 43, right: 43),
+                                  child: Text(
+                                    S.of(context).seed_reminder,
+                                    textAlign: TextAlign.center,
+                                    style: TextStyle(
+                                        fontSize: 12,
+                                        fontWeight: FontWeight.normal,
+                                        color: Theme.of(context)
+                                            .primaryTextTheme!
+                                            .overline!
+                                            .color!),
+                                  ),
+                                )
+                              : Offstage(),
+                          Row(
+                            mainAxisSize: MainAxisSize.max,
+                            children: <Widget>[
+                              Flexible(
+                                  child: Container(
+                                padding: EdgeInsets.only(right: 8.0),
+                                child: PrimaryButton(
+                                    onPressed: () {
+                                      ShareUtil.share(
+                                        text: walletSeedViewModel.seed,
+                                        context: context,
+                                      );
+                                    },
+                                    text: S.of(context).save,
+                                    color: Colors.green,
+                                    textColor: Colors.white),
+                              )),
+                              Flexible(
+                                  child: Container(
+                                padding: EdgeInsets.only(left: 8.0),
+                                child: Builder(
+                                    builder: (context) => PrimaryButton(
+                                        onPressed: () {
+                                          Clipboard.setData(ClipboardData(
+                                              text: walletSeedViewModel.seed));
+                                          showBar<void>(context,
+                                              S.of(context).copied_to_clipboard);
+                                        },
+                                        text: S.of(context).copy,
+                                        color: Theme.of(context)
+                                            .accentTextTheme!
+                                            .bodyText2!
+                                            .color!,
+                                        textColor: Colors.white)),
+                              ))
+                            ],
+                          )
+                        ],
+                      )
+                    ],
+                  ))
+            ],
+          ),
         )));
   }
 }
diff --git a/lib/src/screens/seed_language/widgets/seed_language_picker.dart b/lib/src/screens/seed_language/widgets/seed_language_picker.dart
index 64e050149..0aa22088f 100644
--- a/lib/src/screens/seed_language/widgets/seed_language_picker.dart
+++ b/lib/src/screens/seed_language/widgets/seed_language_picker.dart
@@ -1,9 +1,6 @@
-import 'dart:ui';
-import 'package:cake_wallet/src/widgets/alert_background.dart';
-import 'package:cake_wallet/src/widgets/alert_close_button.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:cake_wallet/palette.dart';
+import 'package:cake_wallet/src/widgets/picker.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 
 List<Image> flagImages = [
@@ -50,138 +47,36 @@ const List<String> seedLanguages = [
 enum Places { topLeft, topRight, bottomLeft, bottomRight, inside }
 
 class SeedLanguagePicker extends StatefulWidget {
-  SeedLanguagePicker({
-    Key? key,
-    this.selected = defaultSeedLanguage})
+  SeedLanguagePicker({Key? key, this.selected = defaultSeedLanguage, required this.onItemSelected})
       : super(key: key);
 
   final String selected;
+  final Function(String) onItemSelected;
 
   @override
   SeedLanguagePickerState createState() =>
-      SeedLanguagePickerState(selected: selected);
+      SeedLanguagePickerState(selected: selected, onItemSelected: onItemSelected);
 }
 
 class SeedLanguagePickerState extends State<SeedLanguagePicker> {
-  SeedLanguagePickerState({required this.selected});
+  SeedLanguagePickerState({required this.selected, required this.onItemSelected});
 
-  final closeButton = Image.asset('assets/images/close.png');
-  String selected;
+  final String selected;
+  final Function(String) onItemSelected;
 
   @override
   Widget build(BuildContext context) {
-    return AlertBackground(
-        child: Stack(
-      alignment: Alignment.center,
-      children: <Widget>[
-        Column(
-          mainAxisSize: MainAxisSize.min,
-          children: <Widget>[
-            Container(
-              padding: EdgeInsets.only(left: 24, right: 24),
-              child: Text(
-                S.of(context).seed_choose,
-                textAlign: TextAlign.center,
-                style: TextStyle(
-                    fontSize: 18,
-                    fontWeight: FontWeight.bold,
-                    fontFamily: 'Lato',
-                    decoration: TextDecoration.none,
-                    color: Colors.white),
-              ),
-            ),
-            Padding(
-              padding: EdgeInsets.only(top: 24),
-              child: ClipRRect(
-                borderRadius: BorderRadius.all(Radius.circular(14)),
-                child: Container(
-                  height: 300,
-                  width: 300,
-                  color:
-                      Theme.of(context).accentTextTheme!.headline6!.backgroundColor!,
-                  child: GridView.count(
-                    padding: EdgeInsets.all(0),
-                    shrinkWrap: true,
-                    crossAxisCount: 3,
-                    childAspectRatio: 4 / 3,
-                    physics: const NeverScrollableScrollPhysics(),
-                    crossAxisSpacing: 1,
-                    mainAxisSpacing: 1,
-                    children: List.generate(11, (index) {
-                      if (index == 10) {
-                        return gridTile(
-                            isCurrent: false,
-                            image: null,
-                            text: '',
-                            onTap: () {});
-                      }
-
-                      final code = languageCodes[index];
-                      final flag = flagImages[index];
-                      final isCurrent =
-                          index == seedLanguages.indexOf(selected);
-
-                      return gridTile(
-                          isCurrent: isCurrent,
-                          image: flag,
-                          text: code,
-                          onTap: () {
-                            selected = seedLanguages[index];
-                            Navigator.of(context).pop(selected);
-                          });
-                    }),
-                  ),
-                ),
-              ),
-            )
-          ],
-        ),
-        AlertCloseButton(image: closeButton)
-      ],
-    ));
-  }
-
-  Widget gridTile(
-      {required bool isCurrent,
-      required String text,
-      required VoidCallback onTap,
-      Image? image}) {
-    final color = isCurrent
-        ? Theme.of(context).textTheme!.bodyText1!.color!
-        : Theme.of(context).accentTextTheme!.headline6!.color!;
-    final textColor = isCurrent
-        ? Palette.blueCraiola
-        : Theme.of(context).primaryTextTheme!.headline6!.color!;
-
-    return GestureDetector(
-        onTap: onTap,
-        child: Container(
-          padding: EdgeInsets.all(10),
-          color: color,
-          child: Center(
-            child: Row(
-              mainAxisSize: MainAxisSize.min,
-              mainAxisAlignment: MainAxisAlignment.center,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              children: <Widget>[
-                image ?? Offstage(),
-                Padding(
-                  padding: image != null
-                      ? EdgeInsets.only(left: 10)
-                      : EdgeInsets.only(left: 0),
-                  child: Text(
-                    text,
-                    style: TextStyle(
-                        fontSize: 18,
-                        fontWeight: FontWeight.w600,
-                        fontFamily: 'Lato',
-                        decoration: TextDecoration.none,
-                        color: textColor),
-                  ),
-                )
-              ],
-            ),
-          ),
-        ));
+    return Picker(
+      selectedAtIndex: seedLanguages.indexOf(selected),
+      items: seedLanguages,
+      images: flagImages,
+      isGridView: true,
+      title: S.of(context).seed_choose,
+      hintText: S.of(context).seed_choose,
+      matchingCriteria: (String language, String searchText) {
+        return language.toLowerCase().contains(searchText);
+      },
+      onItemSelected: onItemSelected,
+    );
   }
 }
diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart
index 881536944..ee0d8431c 100644
--- a/lib/src/screens/send/send_page.dart
+++ b/lib/src/screens/send/send_page.dart
@@ -1,10 +1,14 @@
 import 'package:cake_wallet/entities/fiat_currency.dart';
 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.dart';
 import 'package:cake_wallet/src/screens/send/widgets/send_card.dart';
+import 'package:cake_wallet/src/widgets/add_template_button.dart';
 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
 import 'package:cake_wallet/src/widgets/picker.dart';
 import 'package:cake_wallet/src/widgets/template_tile.dart';
+import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:cake_wallet/utils/payment_request.dart';
+import 'package:cake_wallet/utils/request_review_handler.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/view_model/send/output.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -19,7 +23,6 @@ import 'package:cake_wallet/src/widgets/trail_button.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
 import 'package:cake_wallet/generated/i18n.dart';
-import 'package:dotted_border/dotted_border.dart';
 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
 import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
 import 'package:smooth_page_indicator/smooth_page_indicator.dart';
@@ -50,9 +53,51 @@ class SendPage extends BasePage {
   @override
   bool get extendBodyBehindAppBar => true;
 
+  @override
+  Widget? leading(BuildContext context) {
+    final _backButton = Icon(Icons.arrow_back_ios,
+      color: titleColor,
+      size: 16,
+    );
+    final _closeButton = currentTheme.type == ThemeType.dark
+        ? closeButtonImageDarkTheme : closeButtonImage;
+
+    bool isMobileView = ResponsiveLayoutUtil.instance.isMobile(context);
+
+    return MergeSemantics(
+      child: SizedBox(
+        height: isMobileView ? 37 : 45,
+        width: isMobileView ? 37 : 45,
+        child: ButtonTheme(
+          minWidth: double.minPositive,
+          child: Semantics(
+            label: !isMobileView ? 'Close' : 'Back',
+            child: TextButton(
+              style: ButtonStyle(
+                overlayColor: MaterialStateColor.resolveWith(
+                        (states) => Colors.transparent),
+              ),
+              onPressed: () => onClose(context),
+              child: !isMobileView ? _closeButton : _backButton,
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+
   @override
   AppBarStyle get appBarStyle => AppBarStyle.transparent;
 
+  double _sendCardHeight(BuildContext context) {
+    final double initialHeight = sendViewModel.isElectrumWallet ? 490 : 465;
+
+    if (!ResponsiveLayoutUtil.instance.isMobile(context)) {
+      return initialHeight - 66;
+    }
+    return initialHeight;
+  }
+
   @override
   void onClose(BuildContext context) {
     sendViewModel.onClose();
@@ -104,178 +149,137 @@ class SendPage extends BasePage {
       key: _formKey,
       child: ScrollableWithBottomSection(
           contentPadding: EdgeInsets.only(bottom: 24),
-          content: Column(
-            children: <Widget>[
-              Container(
-                  height: sendViewModel.isElectrumWallet ? 490 : 465,
-                  child: Observer(
-                    builder: (_) {
-                      return PageView.builder(
-                          scrollDirection: Axis.horizontal,
-                          controller: controller,
-                          itemCount: sendViewModel.outputs.length,
-                          itemBuilder: (context, index) {
-                            final output = sendViewModel.outputs[index];
-
-                            return SendCard(
-                              key: output.key,
-                              output: output,
-                              sendViewModel: sendViewModel,
-                              initialPaymentRequest: initialPaymentRequest,
-                            );
-                          });
-                    },
-                  )),
-              Padding(
-                padding:
-                    EdgeInsets.only(top: 10, left: 24, right: 24, bottom: 10),
-                child: Container(
-                  height: 10,
-                  child: Observer(
-                    builder: (_) {
-                      final count = sendViewModel.outputs.length;
-
-                      return count > 1
-                          ? SmoothPageIndicator(
-                              controller: controller,
-                              count: count,
-                              effect: ScrollingDotsEffect(
-                                  spacing: 6.0,
-                                  radius: 6.0,
-                                  dotWidth: 6.0,
-                                  dotHeight: 6.0,
-                                  dotColor: Theme.of(context)
-                                      .primaryTextTheme!
-                                      .headline3!
-                                      .backgroundColor!,
-                                  activeDotColor: Theme.of(context)
-                                      .primaryTextTheme!
-                                      .headline2!
-                                      .backgroundColor!),
-                            )
-                          : Offstage();
-                    },
-                  ),
-                ),
-              ),
-              if (sendViewModel.hasMultiRecipient)
-              Container(
-                height: 40,
-                width: double.infinity,
-                padding: EdgeInsets.only(left: 24),
-                child: SingleChildScrollView(
-                  scrollDirection: Axis.horizontal,
-                  child: Observer(
-                    builder: (_) {
-                      final templates = sendViewModel.templates;
-                      final itemCount = templates.length;
-
-                      return Row(
-                        children: <Widget>[
-                          GestureDetector(
-                            onTap: () => Navigator.of(context)
-                                .pushNamed(Routes.sendTemplate),
-                            child: Container(
-                              padding: EdgeInsets.only(left: 1, right: 10),
-                              child: DottedBorder(
-                                borderType: BorderType.RRect,
-                                dashPattern: [6, 4],
-                                color: Theme.of(context)
-                                    .primaryTextTheme!
-                                    .headline2!
-                                    .decorationColor!,
-                                strokeWidth: 2,
-                                radius: Radius.circular(20),
-                                child: Container(
-                                  height: 34,
-                                  padding: EdgeInsets.only(left: 10, right: 10),
-                                  alignment: Alignment.center,
-                                  decoration: BoxDecoration(
-                                    borderRadius:
-                                        BorderRadius.all(Radius.circular(20)),
-                                    color: Colors.transparent,
-                                  ),
-                                  child: templates.length >= 1
-                                      ? Icon(
-                                          Icons.add,
-                                          color: Theme.of(context)
-                                              .primaryTextTheme!
-                                              .headline2!
-                                              .color!,
-                                        )
-                                      : Text(
-                                          S.of(context).new_template,
-                                          style: TextStyle(
-                                            fontSize: 14,
-                                            fontWeight: FontWeight.w600,
-                                            color: Theme.of(context)
-                                                .primaryTextTheme!
-                                                .headline2!
-                                                .color!,
-                                          ),
-                                        ),
-                                ),
-                              ),
-                            ),
-                          ),
-                          ListView.builder(
+          content: FocusTraversalGroup(
+            policy: OrderedTraversalPolicy(),
+            child: Column(
+              children: <Widget>[
+                Container(
+                    height: _sendCardHeight(context),
+                    child: Observer(
+                      builder: (_) {
+                        return PageView.builder(
                             scrollDirection: Axis.horizontal,
-                            shrinkWrap: true,
-                            physics: NeverScrollableScrollPhysics(),
-                            itemCount: itemCount,
+                            controller: controller,
+                            itemCount: sendViewModel.outputs.length,
                             itemBuilder: (context, index) {
-                              final template = templates[index];
-                              return TemplateTile(
-                                key: UniqueKey(),
-                                to: template.name,
-                                amount: template.isCurrencySelected ? template.amount : template.amountFiat,
-                                from: template.isCurrencySelected ? template.cryptoCurrency : template.fiatCurrency,
-                                onTap: () async {
-                                  final fiatFromTemplate = FiatCurrency.all.singleWhere((element) => element.title == template.fiatCurrency);
-                                  final output = _defineCurrentOutput();
-                                  output.address = template.address;
-                                  if(template.isCurrencySelected){
-                                    output.setCryptoAmount(template.amount);
-                                  }else{
-                                    sendViewModel.setFiatCurrency(fiatFromTemplate);
-                                    output.setFiatAmount(template.amountFiat);
-                                  }
-                                  output.resetParsedAddress();
-                                  await output.fetchParsedAddress(context);
-                                },
-                                onRemove: () {
-                                  showPopUp<void>(
-                                    context: context,
-                                    builder: (dialogContext) {
-                                      return AlertWithTwoActions(
-                                          alertTitle: S.of(context).template,
-                                          alertContent: S
-                                              .of(context)
-                                              .confirm_delete_template,
-                                          rightButtonText: S.of(context).delete,
-                                          leftButtonText: S.of(context).cancel,
-                                          actionRightButton: () {
-                                            Navigator.of(dialogContext).pop();
-                                            sendViewModel.sendTemplateViewModel
-                                                .removeTemplate(
-                                                    template: template);
-                                          },
-                                          actionLeftButton: () =>
-                                              Navigator.of(dialogContext)
-                                                  .pop());
-                                    },
-                                  );
-                                },
+                              final output = sendViewModel.outputs[index];
+          
+                              return SendCard(
+                                key: output.key,
+                                output: output,
+                                sendViewModel: sendViewModel,
+                                initialPaymentRequest: initialPaymentRequest,
                               );
-                            },
-                          ),
-                        ],
-                      );
-                    },
+                            });
+                      },
+                    )),
+                Padding(
+                  padding:
+                      EdgeInsets.only(top: 10, left: 24, right: 24, bottom: 10),
+                  child: Container(
+                    height: 10,
+                    child: Observer(
+                      builder: (_) {
+                        final count = sendViewModel.outputs.length;
+          
+                        return count > 1
+                            ? SmoothPageIndicator(
+                                controller: controller,
+                                count: count,
+                                effect: ScrollingDotsEffect(
+                                    spacing: 6.0,
+                                    radius: 6.0,
+                                    dotWidth: 6.0,
+                                    dotHeight: 6.0,
+                                    dotColor: Theme.of(context)
+                                        .primaryTextTheme.headline3!
+                                        .backgroundColor!,
+                                    activeDotColor: Theme.of(context)
+                                        .primaryTextTheme.headline2!
+                                        .backgroundColor!),
+                              )
+                            : Offstage();
+                      },
+                    ),
                   ),
                 ),
-              )
-            ],
+                if (sendViewModel.hasMultiRecipient)
+                Container(
+                  height: 40,
+                  width: double.infinity,
+                  padding: EdgeInsets.only(left: 24),
+                  child: SingleChildScrollView(
+                    scrollDirection: Axis.horizontal,
+                    child: Observer(
+                      builder: (_) {
+                        final templates = sendViewModel.templates;
+                        final itemCount = templates.length;
+          
+                        return Row(
+                          children: <Widget>[
+                            AddTemplateButton(
+                              onTap: () => Navigator.of(context).pushNamed(Routes.sendTemplate),
+                              currentTemplatesLength: templates.length,
+                            ),
+                            ListView.builder(
+                              scrollDirection: Axis.horizontal,
+                              shrinkWrap: true,
+                              physics: NeverScrollableScrollPhysics(),
+                              itemCount: itemCount,
+                              itemBuilder: (context, index) {
+                                final template = templates[index];
+                                return TemplateTile(
+                                  key: UniqueKey(),
+                                  to: template.name,
+                                  amount: template.isCurrencySelected ? template.amount : template.amountFiat,
+                                  from: template.isCurrencySelected ? template.cryptoCurrency : template.fiatCurrency,
+                                  onTap: () async {
+                                    final fiatFromTemplate = FiatCurrency.all.singleWhere((element) => element.title == template.fiatCurrency);
+                                    final output = _defineCurrentOutput();
+                                    output.address = template.address;
+                                    if(template.isCurrencySelected){
+                                      output.setCryptoAmount(template.amount);
+                                    }else{
+                                      sendViewModel.setFiatCurrency(fiatFromTemplate);
+                                      output.setFiatAmount(template.amountFiat);
+                                    }
+                                    output.resetParsedAddress();
+                                    await output.fetchParsedAddress(context);
+                                  },
+                                  onRemove: () {
+                                    showPopUp<void>(
+                                      context: context,
+                                      builder: (dialogContext) {
+                                        return AlertWithTwoActions(
+                                            alertTitle: S.of(context).template,
+                                            alertContent: S
+                                                .of(context)
+                                                .confirm_delete_template,
+                                            rightButtonText: S.of(context).delete,
+                                            leftButtonText: S.of(context).cancel,
+                                            actionRightButton: () {
+                                              Navigator.of(dialogContext).pop();
+                                              sendViewModel.sendTemplateViewModel
+                                                  .removeTemplate(
+                                                      template: template);
+                                            },
+                                            actionLeftButton: () =>
+                                                Navigator.of(dialogContext)
+                                                    .pop());
+                                      },
+                                    );
+                                  },
+                                );
+                              },
+                            ),
+                          ],
+                        );
+                      },
+                    ),
+                  ),
+                )
+              ],
+            ),
           ),
           bottomSectionPadding:
               EdgeInsets.only(left: 24, right: 24, bottom: 24),
@@ -290,8 +294,7 @@ class SendPage extends BasePage {
                       text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})',
                       color: Colors.transparent,
                       textColor: Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
+                          .accentTextTheme.headline3!
                           .decorationColor!,
                     )
                   )
@@ -309,13 +312,11 @@ class SendPage extends BasePage {
                       text: S.of(context).add_receiver,
                       color: Colors.transparent,
                       textColor: Theme.of(context)
-                          .accentTextTheme!
-                          .headline3!
+                          .accentTextTheme.headline3!
                           .decorationColor!,
                       isDottedBorder: true,
                       borderColor: Theme.of(context)
-                          .primaryTextTheme!
-                          .headline3!
+                          .primaryTextTheme.headline3!
                           .decorationColor!,
                     )),
               Observer(
@@ -335,7 +336,7 @@ class SendPage extends BasePage {
                               item.address.isEmpty || item.cryptoAmount.isEmpty)
                           .toList();
 
-                      if (notValidItems?.isNotEmpty ?? false) {
+                      if (notValidItems.isNotEmpty ?? false) {
                         showErrorValidationAlert(context);
                         return;
                       }
@@ -344,7 +345,7 @@ class SendPage extends BasePage {
 
                     },
                     text: S.of(context).send,
-                    color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
+                    color: Theme.of(context).accentTextTheme.bodyText1!.color!,
                     textColor: Colors.white,
                     isLoading: sendViewModel.state is IsExecutingState ||
                         sendViewModel.state is TransactionCommitting,
@@ -414,9 +415,11 @@ class SendPage extends BasePage {
                                     alertContent: S.of(context).send_success(
                                         sendViewModel.selectedCryptoCurrency.toString()),
                                     buttonText: S.of(context).ok,
-                                    buttonAction: () =>
-                                        Navigator.of(context).pop());
-                              }
+                                    buttonAction: () {
+                                      Navigator.of(context).pop();
+                                      RequestReviewHandler.requestReview();
+                                  });
+                                }
 
                               return Offstage();
                             });
diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart
index 082067d95..cdae9a8df 100644
--- a/lib/src/screens/send/widgets/send_card.dart
+++ b/lib/src/screens/send/widgets/send_card.dart
@@ -1,6 +1,7 @@
 import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
 import 'package:cake_wallet/utils/payment_request.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cw_core/transaction_priority.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
@@ -119,7 +120,7 @@ class SendCardState extends State<SendCard>
               color: Colors.transparent,
             )),
         Container(
-          decoration: BoxDecoration(
+          decoration: ResponsiveLayoutUtil.instance.isMobile(context) ? BoxDecoration(
             borderRadius: BorderRadius.only(
                 bottomLeft: Radius.circular(24),
                 bottomRight: Radius.circular(24)),
@@ -130,9 +131,14 @@ class SendCardState extends State<SendCard>
                   .subtitle1!
                   .decorationColor!,
             ], begin: Alignment.topLeft, end: Alignment.bottomRight),
-          ),
+          ) : null,
           child: Padding(
-            padding: EdgeInsets.fromLTRB(24, 100, 24, 32),
+            padding: EdgeInsets.fromLTRB(
+              24,
+              ResponsiveLayoutUtil.instance.isMobile(context) ? 100 : 55,
+              24,
+              ResponsiveLayoutUtil.instance.isMobile(context) ? 32 : 0,
+            ),
             child: SingleChildScrollView(
                 child: Observer(builder: (_) => Column(
                   mainAxisSize: MainAxisSize.min,
diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart
index 264cae0d3..edcb57945 100644
--- a/lib/src/screens/settings/connection_sync_page.dart
+++ b/lib/src/screens/settings/connection_sync_page.dart
@@ -41,9 +41,13 @@ class ConnectionSyncPage extends BasePage {
               handler: (context) => Navigator.of(context).pushNamed(Routes.rescan),
             ),
           StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
-          NodeHeaderListRow(
-            title: S.of(context).add_new_node,
-            onTap: (_) async => await Navigator.of(context).pushNamed(Routes.newNode),
+          Semantics(
+            button: true,
+            child: NodeHeaderListRow(
+              title: S.of(context).add_new_node,
+              onTap: (_) async =>
+                  await Navigator.of(context).pushNamed(Routes.newNode),
+            ),
           ),
           StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
           SizedBox(height: 100),
@@ -60,31 +64,39 @@ class ConnectionSyncPage extends BasePage {
                   itemBuilder: (_, sectionIndex, index) {
                     final node = nodeListViewModel.nodes[index];
                     final isSelected = node.keyIndex == nodeListViewModel.currentNode.keyIndex;
-                    final nodeListRow = NodeListRow(
-                      title: node.uriRaw,
-                      isSelected: isSelected,
-                      isAlive: node.requestNode(),
-                      onTap: (_) async {
-                        if (isSelected) {
-                          return;
-                        }
+                    final nodeListRow = Semantics(
+                      label: 'Slidable',
+                      selected: isSelected,
+                      enabled: !isSelected,
+                      child: NodeListRow(
+                        title: node.uriRaw,
+                        isSelected: isSelected,
+                        isAlive: node.requestNode(),
+                        onTap: (_) async {
+                          if (isSelected) {
+                            return;
+                          }
 
-                        await showPopUp<void>(
-                            context: context,
-                            builder: (BuildContext context) {
-                              return AlertWithTwoActions(
-                                alertTitle: S.of(context).change_current_node_title,
-                                alertContent: nodeListViewModel.getAlertContent(node.uriRaw),
-                                leftButtonText: S.of(context).cancel,
-                                rightButtonText: S.of(context).change,
-                                actionLeftButton: () => Navigator.of(context).pop(),
-                                actionRightButton: () async {
-                                  await nodeListViewModel.setAsCurrent(node);
-                                  Navigator.of(context).pop();
-                                },
-                              );
-                            });
-                      },
+                          await showPopUp<void>(
+                              context: context,
+                              builder: (BuildContext context) {
+                                return AlertWithTwoActions(
+                                  alertTitle:
+                                      S.of(context).change_current_node_title,
+                                  alertContent: nodeListViewModel
+                                      .getAlertContent(node.uriRaw),
+                                  leftButtonText: S.of(context).cancel,
+                                  rightButtonText: S.of(context).change,
+                                  actionLeftButton: () =>
+                                      Navigator.of(context).pop(),
+                                  actionRightButton: () async {
+                                    await nodeListViewModel.setAsCurrent(node);
+                                    Navigator.of(context).pop();
+                                  },
+                                );
+                              });
+                        },
+                      ),
                     );
 
                     final dismissibleRow = Slidable(
diff --git a/lib/src/screens/settings/desktop_settings/desktop_settings_page.dart b/lib/src/screens/settings/desktop_settings/desktop_settings_page.dart
new file mode 100644
index 000000000..eee54eb45
--- /dev/null
+++ b/lib/src/screens/settings/desktop_settings/desktop_settings_page.dart
@@ -0,0 +1,105 @@
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:cake_wallet/src/widgets/setting_action_button.dart';
+import 'package:cake_wallet/src/widgets/setting_actions.dart';
+import 'package:cake_wallet/typography.dart';
+import 'package:flutter/material.dart';
+import 'package:cake_wallet/router.dart' as Router;
+
+final _settingsNavigatorKey = GlobalKey<NavigatorState>();
+
+class DesktopSettingsPage extends StatefulWidget {
+  const DesktopSettingsPage({super.key});
+
+  @override
+  State<DesktopSettingsPage> createState() => _DesktopSettingsPageState();
+}
+
+class _DesktopSettingsPageState extends State<DesktopSettingsPage> {
+  final int itemCount = SettingActions.desktopSettings.length;
+
+  int? currentPage;
+
+  void _onItemChange(int index) {
+    setState(() {
+      currentPage = index;
+    });
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      body: Container(
+        height: MediaQuery.of(context).size.height,
+        child: Column(
+          mainAxisSize: MainAxisSize.min,
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            Padding(
+              padding: const EdgeInsets.all(24),
+              child: Text(
+                S.current.settings,
+                style: textXLarge(),
+              ),
+            ),
+            Expanded(
+              child: Row(
+                children: [
+                  Expanded(
+                    flex: 1,
+                    child: ListView.separated(
+                      padding: EdgeInsets.only(top: 0),
+                      itemBuilder: (_, index) {
+                        final item = SettingActions.desktopSettings[index];
+                        final isLastTile = index == itemCount - 1;
+                        return SettingActionButton(
+                          isLastTile: isLastTile,
+                          selectionActive: currentPage != null,
+                          isSelected: currentPage == index,
+                          isArrowVisible: true,
+                          onTap: () {
+                            if (currentPage != index) {
+                              final settingContext =
+                                  _settingsNavigatorKey.currentState?.context ?? context;
+                              item.onTap.call(settingContext);
+                              _onItemChange(index);
+                            }
+                          },
+                          image: item.image,
+                          title: item.name,
+                        );
+                      },
+                      separatorBuilder: (_, index) => Container(
+                        height: 1,
+                        color: Theme.of(context).primaryTextTheme.caption!.decorationColor!,
+                      ),
+                      itemCount: itemCount,
+                    ),
+                  ),
+                  Flexible(
+                    flex: 2,
+                    child: ConstrainedBox(
+                      constraints: BoxConstraints(maxWidth: 500),
+                      child: Navigator(
+                        key: _settingsNavigatorKey,
+                        initialRoute: Routes.empty_no_route,
+                        onGenerateRoute: (settings) => Router.createRoute(settings),
+                        onGenerateInitialRoutes:
+                            (NavigatorState navigator, String initialRouteName) {
+                          return [
+                            navigator
+                                .widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
+                          ];
+                        },
+                      ),
+                    ),
+                  )
+                ],
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/src/screens/settings/display_settings_page.dart b/lib/src/screens/settings/display_settings_page.dart
index 39123a7eb..c7baa9b6a 100644
--- a/lib/src/screens/settings/display_settings_page.dart
+++ b/lib/src/screens/settings/display_settings_page.dart
@@ -7,9 +7,9 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.da
 import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
 import 'package:cake_wallet/themes/theme_base.dart';
 import 'package:cake_wallet/themes/theme_list.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
 import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart';
-import 'package:cake_wallet/wallet_type_utils.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 
@@ -34,6 +34,13 @@ class DisplaySettingsPage extends BasePage {
             onValueChange: (_, bool value) {
                _displaySettingsViewModel.setShouldDisplayBalance(value);          
             }),
+            SettingsSwitcherCell(
+              title: S.current.show_market_place,
+              value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard,
+              onValueChange: (_, bool value) {
+                _displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value);
+              },
+            ),
             //if (!isHaven) it does not work correctly
             if(!_displaySettingsViewModel.disabledFiatApiMode)
               SettingsPickerCell<FiatCurrency>(
@@ -65,14 +72,15 @@ class DisplaySettingsPage extends BasePage {
                 return LanguageService.list[code]?.toLowerCase().contains(searchText) ?? false;
               },
             ),
-            SettingsChoicesCell(
-              ChoicesListItem<ThemeBase>(
-                title: S.current.color_theme,
-                items: ThemeList.all,
-                selectedItem: _displaySettingsViewModel.theme,
-                onItemSelected: (ThemeBase theme) => _displaySettingsViewModel.setTheme(theme),
+            if (DeviceInfo.instance.isMobile)
+              SettingsChoicesCell(
+                ChoicesListItem<ThemeBase>(
+                  title: S.current.color_theme,
+                  items: ThemeList.all,
+                  selectedItem: _displaySettingsViewModel.theme,
+                  onItemSelected: (ThemeBase theme) => _displaySettingsViewModel.setTheme(theme),
+                ),
               ),
-            ),
           ],
         ),
       );
diff --git a/lib/src/screens/settings/privacy_page.dart b/lib/src/screens/settings/privacy_page.dart
index b11b41199..81e2715f2 100644
--- a/lib/src/screens/settings/privacy_page.dart
+++ b/lib/src/screens/settings/privacy_page.dart
@@ -8,6 +8,7 @@ import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
 import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
+import 'dart:io' show Platform;
 
 class PrivacyPage extends BasePage {
   PrivacyPage(this._privacySettingsViewModel);
@@ -48,6 +49,13 @@ class PrivacyPage extends BasePage {
                 onValueChange: (BuildContext _, bool value) {
                   _privacySettingsViewModel.setShouldSaveRecipientAddress(value);
                 }),
+            if (Platform.isAndroid)
+            SettingsSwitcherCell(
+                title: S.current.prevent_screenshots,
+                value: _privacySettingsViewModel.isAppSecure,
+                onValueChange: (BuildContext _, bool value) {
+                  _privacySettingsViewModel.setIsAppSecure(value);
+                }),
           ],
         );
       }),
diff --git a/lib/src/screens/settings/security_backup_page.dart b/lib/src/screens/settings/security_backup_page.dart
index 0cc8aa15d..0933560f7 100644
--- a/lib/src/screens/settings/security_backup_page.dart
+++ b/lib/src/screens/settings/security_backup_page.dart
@@ -1,6 +1,6 @@
+import 'package:cake_wallet/core/auth_service.dart';
 import 'package:cake_wallet/entities/pin_code_required_duration.dart';
 import 'package:cake_wallet/routes.dart';
-import 'package:cake_wallet/src/screens/auth/auth_page.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart';
@@ -13,7 +13,9 @@ import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 
 class SecurityBackupPage extends BasePage {
-  SecurityBackupPage(this._securitySettingsViewModel);
+  SecurityBackupPage(this._securitySettingsViewModel, this._authService);
+
+  final AuthService _authService;
 
   @override
   String get title => S.current.security_and_backup;
@@ -27,35 +29,24 @@ class SecurityBackupPage extends BasePage {
       child: Column(mainAxisSize: MainAxisSize.min, children: [
         SettingsCellWithArrow(
           title: S.current.show_keys,
-          handler: (_) => Navigator.of(context).pushNamed(Routes.auth,
-              arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
-            if (isAuthenticatedSuccessfully) {
-              auth.close(route: Routes.showKeys);
-            }
-          }),
+          handler: (_) => _authService.authenticateAction(context, route: Routes.showKeys),
         ),
         StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
         SettingsCellWithArrow(
           title: S.current.create_backup,
-          handler: (_) => Navigator.of(context).pushNamed(Routes.auth,
-              arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
-            if (isAuthenticatedSuccessfully) {
-              auth.close(route: Routes.backup);
-            }
-          }),
+          handler: (_) => _authService.authenticateAction(context, route: Routes.backup),
         ),
         StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
         SettingsCellWithArrow(
-            title: S.current.settings_change_pin,
-            handler: (_) => Navigator.of(context).pushNamed(Routes.auth,
-                    arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
-                  auth.close(
-                    route: isAuthenticatedSuccessfully ? Routes.setupPin : null,
-                    arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
-                      setupPinContext.close();
-                    },
-                  );
-                })),
+          title: S.current.settings_change_pin,
+          handler: (_) => _authService.authenticateAction(
+            context,
+            route: Routes.setupPin,
+            arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
+              setupPinContext.close();
+            },
+          ),
+        ),
         StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
         Observer(builder: (_) {
           return SettingsSwitcherCell(
@@ -63,8 +54,8 @@ class SecurityBackupPage extends BasePage {
               value: _securitySettingsViewModel.allowBiometricalAuthentication,
               onValueChange: (BuildContext context, bool value) {
                 if (value) {
-                  Navigator.of(context).pushNamed(Routes.auth,
-                      arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
+                  _authService.authenticateAction(context,
+                      onAuthSuccess: (isAuthenticatedSuccessfully) async {
                     if (isAuthenticatedSuccessfully) {
                       if (await _securitySettingsViewModel.biometricAuthenticated()) {
                         _securitySettingsViewModel
@@ -74,8 +65,6 @@ class SecurityBackupPage extends BasePage {
                       _securitySettingsViewModel
                           .setAllowBiometricalAuthentication(isAuthenticatedSuccessfully);
                     }
-
-                    auth.close();
                   });
                 } else {
                   _securitySettingsViewModel.setAllowBiometricalAuthentication(value);
diff --git a/lib/src/screens/subaddress/address_edit_or_create_page.dart b/lib/src/screens/subaddress/address_edit_or_create_page.dart
index b7394182c..c0b003dec 100644
--- a/lib/src/screens/subaddress/address_edit_or_create_page.dart
+++ b/lib/src/screens/subaddress/address_edit_or_create_page.dart
@@ -1,5 +1,4 @@
 import 'package:mobx/mobx.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
@@ -23,18 +22,14 @@ class AddressEditOrCreatePage extends BasePage {
   final GlobalKey<FormState> _formKey;
   final TextEditingController _labelController;
 
+  bool _isEffectsInstalled = false;
+
   @override
   String get title => S.current.new_subaddress_title;
 
   @override
   Widget body(BuildContext context) {
-    reaction((_) => addressEditOrCreateViewModel.state,
-        (AddressEditOrCreateState state) {
-      if (state is AddressSavedSuccessfully) {
-        WidgetsBinding.instance
-            .addPostFrameCallback((_) => Navigator.of(context).pop());
-      }
-    });
+    _setEffects(context);
 
     return Form(
         key: _formKey,
@@ -70,4 +65,19 @@ class AddressEditOrCreatePage extends BasePage {
           ),
         ));
   }
+
+  void _setEffects(BuildContext context) {
+    if (_isEffectsInstalled) {
+      return;
+    }
+    reaction((_) => addressEditOrCreateViewModel.state,
+            (AddressEditOrCreateState state) {
+          if (state is AddressSavedSuccessfully) {
+            WidgetsBinding.instance
+                .addPostFrameCallback((_) => Navigator.of(context).pop());
+          }
+        });
+
+    _isEffectsInstalled = true;
+  }
 }
\ No newline at end of file
diff --git a/lib/src/screens/support/support_page.dart b/lib/src/screens/support/support_page.dart
index 5edb723bc..801f81775 100644
--- a/lib/src/screens/support/support_page.dart
+++ b/lib/src/screens/support/support_page.dart
@@ -1,6 +1,7 @@
 import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
 import 'package:cake_wallet/src/screens/settings/widgets/settings_link_provider_cell.dart';
 import 'package:cake_wallet/src/widgets/standard_list.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:cake_wallet/view_model/settings/link_list_item.dart';
 import 'package:cake_wallet/view_model/settings/regular_list_item.dart';
 import 'package:cake_wallet/view_model/support_view_model.dart';
@@ -18,32 +19,34 @@ class SupportPage extends BasePage {
 
   @override
   Widget body(BuildContext context) {
-    final iconColor =
-        Theme.of(context).accentTextTheme!.headline1!.backgroundColor!;
+    final iconColor = Theme.of(context).accentTextTheme!.headline1!.backgroundColor!;
     // FIX-ME: Added `context` it was not used here before, maby bug ?
-    return SectionStandardList(
-        context: context,
-        sectionCount: 1,
-        itemCounter: (int _) => supportViewModel.items.length,
-        itemBuilder: (_, __, index) {
-          final item = supportViewModel.items[index];
+    return Center(
+      child: ConstrainedBox(
+        constraints: BoxConstraints(maxWidth: 500),
+        child: SectionStandardList(
+            context: context,
+            sectionCount: 1,
+            itemCounter: (int _) => supportViewModel.items.length,
+            itemBuilder: (_, __, index) {
+              final item = supportViewModel.items[index];
 
-          if (item is RegularListItem) {
-            return SettingsCellWithArrow(
-                title: item.title, handler: item.handler);
-          }
+              if (item is RegularListItem) {
+                return SettingsCellWithArrow(title: item.title, handler: item.handler);
+              }
 
-          if (item is LinkListItem) {
-            return SettingsLinkProviderCell(
-                title: item.title,
-                icon: item.icon,
-                iconColor: item.hasIconColor ? iconColor : null,
-                link: item.link,
-                linkTitle: item.linkTitle);
-          }
+              if (item is LinkListItem) {
+                return SettingsLinkProviderCell(
+                    title: item.title,
+                    icon: item.icon,
+                    iconColor: item.hasIconColor ? iconColor : null,
+                    link: item.link,
+                    linkTitle: item.linkTitle);
+              }
 
-          return Container();
-        });
+              return Container();
+            }),
+      ),
+    );
   }
-
-}
\ No newline at end of file
+}
diff --git a/lib/src/screens/unspent_coins/unspent_coins_details_page.dart b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart
index d8ce24d88..00c7b9796 100644
--- a/lib/src/screens/unspent_coins/unspent_coins_details_page.dart
+++ b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart
@@ -1,13 +1,16 @@
+import 'package:cake_wallet/src/screens/transaction_details/blockexplorer_list_item.dart';
 import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart';
 import 'package:cake_wallet/src/screens/transaction_details/widgets/textfield_list_row.dart';
 import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart';
 import 'package:cake_wallet/src/widgets/standard_list.dart';
+import 'package:cake_wallet/utils/show_bar.dart';
 import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_details_view_model.dart';
 import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/src/widgets/list_row.dart';
 import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
 import 'package:cake_wallet/src/screens/base_page.dart';
+import 'package:flutter/services.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 
@@ -30,9 +33,13 @@ class UnspentCoinsDetailsPage extends BasePage {
           final item = unspentCoinsDetailsViewModel.items[index];
 
           if (item is StandartListItem) {
-            return ListRow(
-                title: '${item.title}:',
-                value: item.value);
+            return GestureDetector(
+              onTap: () {
+                Clipboard.setData(ClipboardData(text: item.value));
+                showBar<void>(context, S.of(context).transaction_details_copied(item.title));
+              },
+              child: ListRow(title: '${item.title}:', value: item.value),
+            );
           }
 
           if (item is TextFieldListItem) {
@@ -44,14 +51,21 @@ class UnspentCoinsDetailsPage extends BasePage {
           }
 
           if (item is UnspentCoinsSwitchItem) {
-            return Observer(builder: (_) => UnspentCoinsSwitchRow(
-              title: item.title,
-              switchValue: item.switchValue(),
-              onSwitchValueChange: item.onSwitchValueChange
-            ));
+            return Observer(
+                builder: (_) => UnspentCoinsSwitchRow(
+                    title: item.title,
+                    switchValue: item.switchValue(),
+                    onSwitchValueChange: item.onSwitchValueChange));
+          }
+
+          if (item is BlockExplorerListItem) {
+            return GestureDetector(
+              onTap: item.onTap,
+              child: ListRow(title: '${item.title}:', value: item.value),
+            );
           }
 
           return Container();
         });
   }
-}
\ No newline at end of file
+}
diff --git a/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart
index fac036f0e..b1916d06c 100644
--- a/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart
+++ b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart
@@ -1,5 +1,6 @@
 import 'package:auto_size_text/auto_size_text.dart';
 import 'package:cake_wallet/palette.dart';
+import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:cake_wallet/generated/i18n.dart';
@@ -28,99 +29,77 @@ class UnspentCoinsListItem extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    final itemColor = isSending? selectedItemColor : unselectedItemColor;
-    final _note = (note?.isNotEmpty ?? false) ? note : address;
-
+    final itemColor = isSending ? selectedItemColor : unselectedItemColor;
     return Container(
-        height: 62,
-        padding: EdgeInsets.all(12),
-        decoration: BoxDecoration(
-            borderRadius: BorderRadius.all(Radius.circular(12)),
-            color: itemColor),
+        height: 70,
+        padding: EdgeInsets.symmetric(vertical: 6, horizontal: 12),
+        decoration:
+            BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(12)), color: itemColor),
         child: Row(
-          mainAxisSize: MainAxisSize.max,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
             Padding(
                 padding: EdgeInsets.only(right: 12),
-                child: GestureDetector(
-                  onTap: () => onCheckBoxTap?.call(),
-                  child: Container(
-                    height: 24.0,
-                    width: 24.0,
-                    decoration: BoxDecoration(
-                        border: Border.all(
-                            color: Theme.of(context)
-                                .primaryTextTheme!
-                                .caption!
-                                .color!,
-                            width: 1.0),
-                        borderRadius: BorderRadius.all(
-                            Radius.circular(8.0)),
-                        color: itemColor),
-                    child: isSending
-                      ? Icon(
-                        Icons.check,
-                        color: Colors.blue,
-                        size: 20.0,
-                      )
-                      : Offstage(),
-                  )
-                )
-            ),
+                child: StandardCheckbox(
+                    value: isSending, onChanged: (value) => onCheckBoxTap?.call())),
             Expanded(
                 child: Column(
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
                     crossAxisAlignment: CrossAxisAlignment.start,
                     children: [
-                      Row(
-                        mainAxisSize: MainAxisSize.max,
-                        mainAxisAlignment: MainAxisAlignment.start,
-                        crossAxisAlignment: CrossAxisAlignment.center,
-                        children: [
-                          Expanded(
-                            child: AutoSizeText(
-                              amount,
-                              style: TextStyle(
-                                  color: amountColor,
-                                  fontSize: 16,
-                                  fontWeight: FontWeight.w600
-                              ),
-                              maxLines: 1,
-                            ),
+                  Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      Column(
+                        crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                        if (note.isNotEmpty)
+                          AutoSizeText(
+                            note,
+                            style: TextStyle(
+                                color: amountColor, fontSize: 15, fontWeight: FontWeight.w600),
+                            maxLines: 1,
                           ),
-                          if (isFrozen) Container(
+                        AutoSizeText(
+                          amount,
+                          style:
+                              TextStyle(color: amountColor, fontSize: 15, fontWeight: FontWeight.w600),
+                          maxLines: 1,
+                        )
+                      ]),
+                      if (isFrozen)
+                        Container(
                             height: 17,
                             padding: EdgeInsets.only(left: 6, right: 6),
                             decoration: BoxDecoration(
-                              borderRadius: BorderRadius.all(Radius.circular(8.5)),
-                              color: Colors.white),
+                                borderRadius: BorderRadius.all(Radius.circular(8.5)),
+                                color: Colors.white),
                             alignment: Alignment.center,
                             child: Text(
-                                S.of(context).frozen,
-                                style: TextStyle(
-                                  color: amountColor,
-                                  fontSize: 7,
-                                  fontWeight: FontWeight.w600
-                                ),
-                            )
-                          )
-                        ],
-                      ),
-                      Text(
-                        _note,
-                        style: TextStyle(
-                          color: addressColor,
-                          fontSize: 12,
+                              S.of(context).frozen,
+                              style:
+                              TextStyle(color: amountColor, fontSize: 7, fontWeight: FontWeight.w600),
+                            ))
+                    ],
+                  ),
+                  Expanded(
+                    child: Row(
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        AutoSizeText(
+                          address,
+                          style: TextStyle(
+                            color: addressColor,
+                            fontSize: 12,
+                          ),
+                          maxLines: 1,
                         ),
-                        maxLines: 1,
-                        overflow: TextOverflow.ellipsis
-                      )
-                    ]
-                )
-            )
+                      ],
+                    ),
+                  ),
+                ])),
           ],
-        )
-    );
+        ));
   }
-}
\ No newline at end of file
+}
diff --git a/lib/src/screens/wallet_keys/wallet_keys_page.dart b/lib/src/screens/wallet_keys/wallet_keys_page.dart
index 8c378d174..da58c4b31 100644
--- a/lib/src/screens/wallet_keys/wallet_keys_page.dart
+++ b/lib/src/screens/wallet_keys/wallet_keys_page.dart
@@ -1,9 +1,9 @@
 import 'package:auto_size_text/auto_size_text.dart';
+import 'package:cake_wallet/entities/qr_view_data.dart';
 import 'package:cake_wallet/src/widgets/section_divider.dart';
 import 'package:cake_wallet/utils/show_bar.dart';
 import 'package:device_display_brightness/device_display_brightness.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
@@ -25,15 +25,14 @@ class WalletKeysPage extends BasePage {
       onPressed: () async {
         // Get the current brightness:
         final double brightness = await DeviceDisplayBrightness.getBrightness();
+        final url = await walletKeysViewModel.url;
 
         // ignore: unawaited_futures
         DeviceDisplayBrightness.setBrightness(1.0);
         await Navigator.pushNamed(
           context,
           Routes.fullscreenQR,
-          arguments: {
-            'qrData': (await walletKeysViewModel.url).toString(),
-          },
+          arguments: QrViewData(data: url.toString()),
         );
         // ignore: unawaited_futures
         DeviceDisplayBrightness.setBrightness(brightness);
diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart
index 19800b2e8..c75c18380 100644
--- a/lib/src/screens/wallet_list/wallet_list_page.dart
+++ b/lib/src/screens/wallet_list/wallet_list_page.dart
@@ -1,5 +1,6 @@
-import 'package:cake_wallet/src/screens/auth/auth_page.dart';
+import 'package:cake_wallet/core/auth_service.dart';
 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:cake_wallet/utils/show_bar.dart';
 import 'package:cake_wallet/utils/show_pop_up.dart';
 import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
@@ -18,49 +19,43 @@ import 'package:flutter_slidable/flutter_slidable.dart';
 import 'package:cake_wallet/wallet_type_utils.dart';
 
 class WalletListPage extends BasePage {
-  WalletListPage({required this.walletListViewModel});
+  WalletListPage({required this.walletListViewModel, required this.authService});
 
   final WalletListViewModel walletListViewModel;
+  final AuthService authService;
 
   @override
   Widget body(BuildContext context) =>
-      WalletListBody(walletListViewModel: walletListViewModel);
+      WalletListBody(walletListViewModel: walletListViewModel, authService: authService);
 }
 
 class WalletListBody extends StatefulWidget {
-  WalletListBody({required this.walletListViewModel});
+  WalletListBody({required this.walletListViewModel, required this.authService});
 
   final WalletListViewModel walletListViewModel;
+  final AuthService authService;
 
   @override
   WalletListBodyState createState() => WalletListBodyState();
 }
 
 class WalletListBodyState extends State<WalletListBody> {
-  final moneroIcon =
-      Image.asset('assets/images/monero_logo.png', height: 24, width: 24);
-  final bitcoinIcon =
-      Image.asset('assets/images/bitcoin.png', height: 24, width: 24);
-  final litecoinIcon =
-      Image.asset('assets/images/litecoin_icon.png', height: 24, width: 24);
-  final nonWalletTypeIcon =
-      Image.asset('assets/images/close.png', height: 24, width: 24);
-  final havenIcon =
-      Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
-  final ethereumIcon =
-      Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
+  final moneroIcon = Image.asset('assets/images/monero_logo.png', height: 24, width: 24);
+  final bitcoinIcon = Image.asset('assets/images/bitcoin.png', height: 24, width: 24);
+  final litecoinIcon = Image.asset('assets/images/litecoin_icon.png', height: 24, width: 24);
+  final nonWalletTypeIcon = Image.asset('assets/images/close.png', height: 24, width: 24);
+  final havenIcon = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
+  final ethereumIcon = Image.asset('assets/images/eth_icon.png', height: 24, width: 24);
   final scrollController = ScrollController();
   final double tileHeight = 60;
   Flushbar<void>? _progressBar;
 
   @override
   Widget build(BuildContext context) {
-    final newWalletImage = Image.asset('assets/images/new_wallet.png',
-        height: 12, width: 12, color: Colors.white);
+    final newWalletImage =
+        Image.asset('assets/images/new_wallet.png', height: 12, width: 12, color: Colors.white);
     final restoreWalletImage = Image.asset('assets/images/restore_wallet.png',
-        height: 12,
-        width: 12,
-        color: Theme.of(context).primaryTextTheme!.headline6!.color!);
+        height: 12, width: 12, color: Theme.of(context).primaryTextTheme.headline6!.color!);
 
     return Container(
       padding: EdgeInsets.only(top: 16),
@@ -71,16 +66,13 @@ class WalletListBodyState extends State<WalletListBody> {
               builder: (_) => ListView.separated(
                   shrinkWrap: true,
                   physics: const NeverScrollableScrollPhysics(),
-                  separatorBuilder: (_, index) => Divider(
-                      color: Theme.of(context).backgroundColor, height: 32),
+                  separatorBuilder: (_, index) =>
+                      Divider(color: Theme.of(context).backgroundColor, height: 32),
                   itemCount: widget.walletListViewModel.wallets.length,
                   itemBuilder: (__, index) {
                     final wallet = widget.walletListViewModel.wallets[index];
                     final currentColor = wallet.isCurrent
-                        ? Theme.of(context)
-                            .accentTextTheme!
-                            .subtitle2!
-                            .decorationColor!
+                        ? Theme.of(context).accentTextTheme.subtitle2!.decorationColor!
                         : Theme.of(context).backgroundColor;
                     final row = GestureDetector(
                         onTap: () async {
@@ -92,19 +84,15 @@ class WalletListBodyState extends State<WalletListBody> {
                                   context: context,
                                   builder: (dialogContext) {
                                     return AlertWithTwoActions(
-                                        alertTitle: S
-                                            .of(context)
-                                            .change_wallet_alert_title,
-                                        alertContent: S
-                                            .of(context)
-                                            .change_wallet_alert_content(
-                                                wallet.name),
+                                        alertTitle: S.of(context).change_wallet_alert_title,
+                                        alertContent:
+                                            S.of(context).change_wallet_alert_content(wallet.name),
                                         leftButtonText: S.of(context).cancel,
                                         rightButtonText: S.of(context).change,
                                         actionLeftButton: () =>
-                                            Navigator.of(context).pop(false),
+                                            Navigator.of(dialogContext).pop(false),
                                         actionRightButton: () =>
-                                            Navigator.of(context).pop(true));
+                                            Navigator.of(dialogContext).pop(true));
                                   }) ??
                               false;
 
@@ -133,12 +121,11 @@ class WalletListBodyState extends State<WalletListBody> {
                                   color: Theme.of(context).backgroundColor,
                                   alignment: Alignment.centerLeft,
                                   child: Row(
-                                    crossAxisAlignment:
-                                        CrossAxisAlignment.center,
+                                    crossAxisAlignment: CrossAxisAlignment.center,
                                     children: <Widget>[
                                       wallet.isEnabled
-                                        ? _imageFor(type: wallet.type)
-                                        : nonWalletTypeIcon,
+                                          ? _imageFor(type: wallet.type)
+                                          : nonWalletTypeIcon,
                                       SizedBox(width: 10),
                                       Text(
                                         wallet.name,
@@ -146,7 +133,7 @@ class WalletListBodyState extends State<WalletListBody> {
                                             fontSize: 22,
                                             fontWeight: FontWeight.w500,
                                             color: Theme.of(context)
-                                                .primaryTextTheme!
+                                                .primaryTextTheme
                                                 .headline6!
                                                 .color!),
                                       )
@@ -165,43 +152,35 @@ class WalletListBodyState extends State<WalletListBody> {
                             startActionPane: _actionPane(wallet),
                             endActionPane: _actionPane(wallet),
                             child: row,
-                    );
+                          );
                   }),
             ),
           ),
-          bottomSectionPadding:
-              EdgeInsets.only(bottom: 24, right: 24, left: 24),
+          bottomSectionPadding: EdgeInsets.only(bottom: 24, right: 24, left: 24),
           bottomSection: Column(children: <Widget>[
             PrimaryImageButton(
               onPressed: () {
-    	      	  if (isSingleCoin) {
-          		    Navigator.of(context).pushNamed(Routes.newWallet, arguments: widget.walletListViewModel.currentWalletType);
-          		  } else {
-          		    Navigator.of(context).pushNamed(Routes.newWalletType);
-          		  }
-	            },
+                if (isSingleCoin) {
+                  Navigator.of(context).pushNamed(Routes.newWallet,
+                      arguments: widget.walletListViewModel.currentWalletType);
+                } else {
+                  Navigator.of(context).pushNamed(Routes.newWalletType);
+                }
+              },
               image: newWalletImage,
               text: S.of(context).wallet_list_create_new_wallet,
-              color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
+              color: Theme.of(context).accentTextTheme.bodyText1!.color!,
               textColor: Colors.white,
             ),
             SizedBox(height: 10.0),
             PrimaryImageButton(
                 onPressed: () {
-		              if (isSingleCoin) {
-                       Navigator
-                        .of(context)
-		       	            .pushNamed(
-                  				Routes.restoreWallet,
-                  				arguments: widget.walletListViewModel.currentWalletType);
-          		    } else {
-          		      Navigator.of(context).pushNamed(Routes.restoreWalletType); 
-          		    }
-		            },
+                  Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false);
+                },
                 image: restoreWalletImage,
                 text: S.of(context).wallet_list_restore_wallet,
-                color: Theme.of(context).accentTextTheme!.caption!.color!,
-                textColor: Theme.of(context).primaryTextTheme!.headline6!.color!)
+                color: Theme.of(context).accentTextTheme.caption!.color!,
+                textColor: Theme.of(context).primaryTextTheme.headline6!.color!)
           ])),
     );
   }
@@ -224,53 +203,40 @@ class WalletListBodyState extends State<WalletListBody> {
   }
 
   Future<void> _loadWallet(WalletListItem wallet) async {
-    if (await widget.walletListViewModel.checkIfAuthRequired()) {
-      await Navigator.of(context).pushNamed(Routes.auth,
-          arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
-        if (!isAuthenticatedSuccessfully) {
-          return;
-        }
+    await widget.authService.authenticateAction(context,
+        onAuthSuccess: (isAuthenticatedSuccessfully) async {
+      if (!isAuthenticatedSuccessfully) {
+        return;
+      }
 
-        try {
-          auth.changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
-          await widget.walletListViewModel.loadWallet(wallet);
-          auth.hideProgressText();
-          auth.close();
-          WidgetsBinding.instance.addPostFrameCallback((_) {
-            Navigator.of(context).pop();
-          });
-        } catch (e) {
-          auth.changeProcessText(
-              S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
-        }
-      });
-    } else {
       try {
         changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
         await widget.walletListViewModel.loadWallet(wallet);
-        hideProgressText();
-        Navigator.of(context).pop();
+        await hideProgressText();
+        // only pop the wallets route in mobile as it will go back to dashboard page
+        // in desktop platforms the navigation tree is different
+        if (DeviceInfo.instance.isMobile) {
+          WidgetsBinding.instance.addPostFrameCallback((_) {
+            Navigator.of(context).pop();
+          });
+        }
       } catch (e) {
         changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
       }
-    }
+    });
   }
 
   Future<void> _removeWallet(WalletListItem wallet) async {
-    if (widget.walletListViewModel.checkIfAuthRequired()) {
-      await Navigator.of(context).pushNamed(Routes.auth,
-          arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
-        if (!isAuthenticatedSuccessfully) {
-          return;
-        }
-        _onSuccessfulAuth(wallet, auth);
-      });
-    } else {
-      _onSuccessfulAuth(wallet, null);
-    }
+    widget.authService.authenticateAction(context,
+        onAuthSuccess: (isAuthenticatedSuccessfully) async {
+      if (!isAuthenticatedSuccessfully) {
+        return;
+      }
+      _onSuccessfulAuth(wallet);
+    });
   }
 
-  void _onSuccessfulAuth(WalletListItem wallet, AuthPageState? auth) async {
+  void _onSuccessfulAuth(WalletListItem wallet) async {
     bool confirmed = false;
     await showPopUp<void>(
         context: context,
@@ -290,31 +256,26 @@ class WalletListBodyState extends State<WalletListBody> {
 
     if (confirmed) {
       try {
-        auth != null
-            ? auth.changeProcessText(S.of(context).wallet_list_removing_wallet(wallet.name))
-            : changeProcessText(S.of(context).wallet_list_removing_wallet(wallet.name));
+        changeProcessText(S.of(context).wallet_list_removing_wallet(wallet.name));
         await widget.walletListViewModel.remove(wallet);
+        hideProgressText();
       } catch (e) {
-        auth != null
-            ? auth.changeProcessText(
-                S.of(context).wallet_list_failed_to_remove(wallet.name, e.toString()),
-              )
-            : changeProcessText(
-                S.of(context).wallet_list_failed_to_remove(wallet.name, e.toString()),
-              );
+        changeProcessText(
+          S.of(context).wallet_list_failed_to_remove(wallet.name, e.toString()),
+        );
       }
     }
-
-    auth?.close();
   }
 
   void changeProcessText(String text) {
     _progressBar = createBar<void>(text, duration: null)..show(context);
   }
 
-  void hideProgressText() {
-    _progressBar?.dismiss();
-    _progressBar = null;
+  Future<void> hideProgressText() async {
+    await Future.delayed(Duration(milliseconds: 50), () {
+      _progressBar?.dismiss();
+      _progressBar = null;
+    });
   }
 
   ActionPane _actionPane(WalletListItem wallet) => ActionPane(
diff --git a/lib/src/screens/welcome/welcome_page.dart b/lib/src/screens/welcome/welcome_page.dart
index a50d8ba8c..0249093bd 100644
--- a/lib/src/screens/welcome/welcome_page.dart
+++ b/lib/src/screens/welcome/welcome_page.dart
@@ -1,4 +1,5 @@
 import 'package:cake_wallet/themes/theme_base.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/src/widgets/primary_button.dart';
@@ -19,7 +20,7 @@ class WelcomePage extends BasePage {
     if (isHaven) {
       return S.of(context).haven_app;
     }
-    
+
     return S.of(context).cake_wallet;
   }
 
@@ -31,172 +32,138 @@ class WelcomePage extends BasePage {
     if (isHaven) {
       return S.of(context).haven_app_wallet_text;
     }
-    
+
     return S.of(context).first_wallet_text;
   }
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-        backgroundColor: Theme
-            .of(context)
-            .backgroundColor,
+        backgroundColor: Theme.of(context).backgroundColor,
         resizeToAvoidBottomInset: false,
         body: body(context));
   }
 
   @override
   Widget body(BuildContext context) {
-    final welcomeImage = currentTheme.type == ThemeType.dark
-        ? welcomeImageDark : welcomeImageLight;
+    final welcomeImage = currentTheme.type == ThemeType.dark ? welcomeImageDark : welcomeImageLight;
 
     final newWalletImage = Image.asset('assets/images/new_wallet.png',
         height: 12,
         width: 12,
-        color: Theme
-            .of(context)
-            .accentTextTheme!
-            .headline5!
-            .decorationColor!);
+        color: Theme.of(context).accentTextTheme!.headline5!.decorationColor!);
     final restoreWalletImage = Image.asset('assets/images/restore_wallet.png',
-        height: 12,
-        width: 12,
-        color: Theme.of(context)
-            .primaryTextTheme!
-            .headline6!
-            .color!);
+        height: 12, width: 12, color: Theme.of(context).primaryTextTheme!.headline6!.color!);
 
-    return WillPopScope(onWillPop: () async => false, child: Container(
-        padding: EdgeInsets.only(top: 64, bottom: 24, left: 24, right: 24),
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.spaceBetween,
-          children: <Widget>[
-            Flexible(
-                flex: 2,
-                child: AspectRatio(
-                    aspectRatio: aspectRatioImage,
-                    child: FittedBox(child: welcomeImage, fit: BoxFit.fill)
-                )
-            ),
-            Flexible(
-                flex: 3,
+    return WillPopScope(
+        onWillPop: () async => false,
+        child: Container(
+            padding: EdgeInsets.only(top: 64, bottom: 24, left: 24, right: 24),
+            child: Center(
+              child: ConstrainedBox(
+                constraints:
+                    BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
                 child: Column(
                   mainAxisAlignment: MainAxisAlignment.spaceBetween,
                   children: <Widget>[
-                    Column(
-                      children: <Widget>[
-                        Padding(
-                          padding: EdgeInsets.only(top: 24),
-                          child: Text(
-                            S
-                                .of(context)
-                                .welcome,
-                            style: TextStyle(
-                              fontSize: 18,
-                              fontWeight: FontWeight.w500,
-                              color: Theme
-                                  .of(context)
-                                  .accentTextTheme!
-                                  .headline2!
-                                  .color!,
+                    Flexible(
+                        flex: 2,
+                        child: AspectRatio(
+                            aspectRatio: aspectRatioImage,
+                            child: FittedBox(child: welcomeImage, fit: BoxFit.fill))),
+                    Flexible(
+                        flex: 3,
+                        child: Column(
+                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                          children: <Widget>[
+                            Column(
+                              children: <Widget>[
+                                Padding(
+                                  padding: EdgeInsets.only(top: 24),
+                                  child: Text(
+                                    S.of(context).welcome,
+                                    style: TextStyle(
+                                      fontSize: 18,
+                                      fontWeight: FontWeight.w500,
+                                      color: Theme.of(context).accentTextTheme!.headline2!.color!,
+                                    ),
+                                    textAlign: TextAlign.center,
+                                  ),
+                                ),
+                                Padding(
+                                  padding: EdgeInsets.only(top: 5),
+                                  child: Text(
+                                    appTitle(context),
+                                    style: TextStyle(
+                                      fontSize: 36,
+                                      fontWeight: FontWeight.bold,
+                                      color: Theme.of(context).primaryTextTheme!.headline6!.color!,
+                                    ),
+                                    textAlign: TextAlign.center,
+                                  ),
+                                ),
+                                Padding(
+                                  padding: EdgeInsets.only(top: 5),
+                                  child: Text(
+                                    appDescription(context),
+                                    style: TextStyle(
+                                      fontSize: 16,
+                                      fontWeight: FontWeight.w500,
+                                      color: Theme.of(context).accentTextTheme!.headline2!.color!,
+                                    ),
+                                    textAlign: TextAlign.center,
+                                  ),
+                                ),
+                              ],
                             ),
-                            textAlign: TextAlign.center,
-                          ),
-                        ),
-                        Padding(
-                          padding: EdgeInsets.only(top: 5),
-                          child: Text(
-                            appTitle(context),
-                            style: TextStyle(
-                              fontSize: 36,
-                              fontWeight: FontWeight.bold,
-                              color: Theme.of(context)
-                                  .primaryTextTheme!
-                                  .headline6!
-                                  .color!,
-                            ),
-                            textAlign: TextAlign.center,
-                          ),
-                        ),
-                        Padding(
-                          padding: EdgeInsets.only(top: 5),
-                          child: Text(
-                            appDescription(context),
-                            style: TextStyle(
-                              fontSize: 16,
-                              fontWeight: FontWeight.w500,
-                              color: Theme
-                                  .of(context)
-                                  .accentTextTheme!
-                                  .headline2!
-                                  .color!,
-                            ),
-                            textAlign: TextAlign.center,
-                          ),
-                        ),
-                      ],
-                    ),
-                    Column(
-                      children: <Widget>[
-                        Text(
-                          S
-                              .of(context)
-                              .please_make_selection,
-                          style: TextStyle(
-                            fontSize: 12,
-                            fontWeight: FontWeight.normal,
-                            color: Theme.of(context)
-                                .accentTextTheme!
-                                .headline2!
-                                .color!,
-                          ),
-                          textAlign: TextAlign.center,
-                        ),
-                        Padding(
-                          padding: EdgeInsets.only(top: 24),
-                          child: PrimaryImageButton(
-                            onPressed: () =>
-                                Navigator.pushNamed(context,
-                                    Routes.newWalletFromWelcome),
-                            image: newWalletImage,
-                            text: S.of(context).create_new,
-                            color: Theme.of(context)
-                                .accentTextTheme!
-                                .subtitle2!
-                                .decorationColor!,
-                            textColor: Theme
-                                .of(context)
-                                .accentTextTheme!
-                                .headline5!
-                                .decorationColor!,
-                          ),
-                        ),
-                        Padding(
-                          padding: EdgeInsets.only(top: 10),
-                          child: PrimaryImageButton(
-                              onPressed: () {
-                                Navigator.pushNamed(context, Routes.restoreOptions);
-                              },
-                              image: restoreWalletImage,
-                              text: S
-                                  .of(context)
-                                  .restore_wallet,
-                              color: Theme.of(context)
-                                  .accentTextTheme!
-                                  .caption!
-                                  .color!,
-                              textColor: Theme.of(context)
-                                  .primaryTextTheme!
-                                  .headline6!
-                                  .color!),
-                        )
-                      ],
-                    )
+                            Column(
+                              children: <Widget>[
+                                Text(
+                                  S.of(context).please_make_selection,
+                                  style: TextStyle(
+                                    fontSize: 12,
+                                    fontWeight: FontWeight.normal,
+                                    color: Theme.of(context).accentTextTheme!.headline2!.color!,
+                                  ),
+                                  textAlign: TextAlign.center,
+                                ),
+                                Padding(
+                                  padding: EdgeInsets.only(top: 24),
+                                  child: PrimaryImageButton(
+                                    onPressed: () =>
+                                        Navigator.pushNamed(context, Routes.newWalletFromWelcome),
+                                    image: newWalletImage,
+                                    text: S.of(context).create_new,
+                                    color: Theme.of(context)
+                                        .accentTextTheme!
+                                        .subtitle2!
+                                        .decorationColor!,
+                                    textColor: Theme.of(context)
+                                        .accentTextTheme!
+                                        .headline5!
+                                        .decorationColor!,
+                                  ),
+                                ),
+                                Padding(
+                                  padding: EdgeInsets.only(top: 10),
+                                  child: PrimaryImageButton(
+                                      onPressed: () {
+                                        Navigator.pushNamed(context, Routes.restoreOptions,
+                                            arguments: true);
+                                      },
+                                      image: restoreWalletImage,
+                                      text: S.of(context).restore_wallet,
+                                      color: Theme.of(context).accentTextTheme!.caption!.color!,
+                                      textColor:
+                                          Theme.of(context).primaryTextTheme!.headline6!.color!),
+                                )
+                              ],
+                            )
+                          ],
+                        ))
                   ],
-                )
-            )
-          ],
-        )
-    ));
+                ),
+              ),
+            )));
   }
 }
diff --git a/lib/src/widgets/add_template_button.dart b/lib/src/widgets/add_template_button.dart
new file mode 100644
index 000000000..249c493a6
--- /dev/null
+++ b/lib/src/widgets/add_template_button.dart
@@ -0,0 +1,52 @@
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
+import 'package:dotted_border/dotted_border.dart';
+import 'package:flutter/material.dart';
+
+class AddTemplateButton extends StatelessWidget {
+  final Function() onTap;
+  final int currentTemplatesLength;
+
+  const AddTemplateButton({Key? key, required this.onTap, required this.currentTemplatesLength})
+      : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: onTap,
+      child: Container(
+        padding: EdgeInsets.only(left: 1, right: 10),
+        child: DottedBorder(
+          borderType: BorderType.RRect,
+          dashPattern: [6, 4],
+          color: Theme.of(context).primaryTextTheme.headline3!.decorationColor!,
+          strokeWidth: 2,
+          radius: Radius.circular(20),
+          child: Container(
+            height: 34,
+            padding: EdgeInsets.symmetric(
+                horizontal: ResponsiveLayoutUtil.instance.isMobile(context) ? 10 : 30),
+            alignment: Alignment.center,
+            decoration: BoxDecoration(
+              borderRadius: BorderRadius.all(Radius.circular(20)),
+              color: Colors.transparent,
+            ),
+            child: currentTemplatesLength >= 1
+                ? Icon(
+                    Icons.add,
+                    color: Theme.of(context).primaryTextTheme.headline2!.color!,
+                  )
+                : Text(
+                    S.of(context).new_template,
+                    style: TextStyle(
+                      fontSize: 14,
+                      fontWeight: FontWeight.w600,
+                      color: Theme.of(context).primaryTextTheme.headline2!.color!,
+                    ),
+                  ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/src/widgets/address_text_field.dart b/lib/src/widgets/address_text_field.dart
index 4acc9a145..059dc51aa 100644
--- a/lib/src/widgets/address_text_field.dart
+++ b/lib/src/widgets/address_text_field.dart
@@ -1,3 +1,6 @@
+import 'dart:io';
+
+import 'package:cake_wallet/utils/device_info.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/routes.dart';
@@ -65,7 +68,7 @@ class AddressTextField extends StatelessWidget {
           style: textStyle ??
               TextStyle(
                   fontSize: 16,
-                  color: Theme.of(context).primaryTextTheme!.headline6!.color!),
+                  color: Theme.of(context).primaryTextTheme.headline6!.color!),
           decoration: InputDecoration(
             suffixIcon: SizedBox(
               width: prefixIconWidth * options.length +
@@ -102,7 +105,8 @@ class AddressTextField extends StatelessWidget {
               width: prefixIconWidth * options.length +
                   (spaceBetweenPrefixIcons * options.length),
               child: Row(
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                mainAxisAlignment: DeviceInfo.instance.isMobile 
+                  ? MainAxisAlignment.spaceBetween : MainAxisAlignment.end,
                 children: [
                   SizedBox(width: 5),
                   if (this.options.contains(AddressTextFieldOption.paste)) ...[
@@ -117,8 +121,7 @@ class AddressTextField extends StatelessWidget {
                               decoration: BoxDecoration(
                                   color: buttonColor ??
                                       Theme.of(context)
-                                          .accentTextTheme!
-                                          .headline6!
+                                          .accentTextTheme.headline6!
                                           .color!,
                                   borderRadius:
                                       BorderRadius.all(Radius.circular(6))),
@@ -126,13 +129,13 @@ class AddressTextField extends StatelessWidget {
                                 'assets/images/paste_ios.png',
                                 color: iconColor ??
                                     Theme.of(context)
-                                        .primaryTextTheme!
-                                        .headline4!
+                                        .primaryTextTheme.headline4!
                                         .decorationColor!,
                               )),
                         )),
                   ],
-                  if (this.options.contains(AddressTextFieldOption.qrCode)) ...[
+                  if (this.options.contains(AddressTextFieldOption.qrCode) && DeviceInfo.instance.isMobile) 
+                  ...[
                     Container(
                         width: prefixIconWidth,
                         height: prefixIconHeight,
@@ -144,8 +147,7 @@ class AddressTextField extends StatelessWidget {
                               decoration: BoxDecoration(
                                   color: buttonColor ??
                                       Theme.of(context)
-                                          .accentTextTheme!
-                                          .headline6!
+                                          .accentTextTheme.headline6!
                                           .color!,
                                   borderRadius:
                                       BorderRadius.all(Radius.circular(6))),
@@ -153,12 +155,11 @@ class AddressTextField extends StatelessWidget {
                                 'assets/images/qr_code_icon.png',
                                 color: iconColor ??
                                     Theme.of(context)
-                                        .primaryTextTheme!
-                                        .headline4!
+                                        .primaryTextTheme.headline4!
                                         .decorationColor!,
                               )),
                         ))
-                  ],
+                  ] else SizedBox(width: 5),
                   if (this
                       .options
                       .contains(AddressTextFieldOption.addressBook)) ...[
@@ -173,8 +174,7 @@ class AddressTextField extends StatelessWidget {
                               decoration: BoxDecoration(
                                   color: buttonColor ??
                                       Theme.of(context)
-                                          .accentTextTheme!
-                                          .headline6!
+                                          .accentTextTheme.headline6!
                                           .color!,
                                   borderRadius:
                                       BorderRadius.all(Radius.circular(6))),
@@ -182,8 +182,7 @@ class AddressTextField extends StatelessWidget {
                                 'assets/images/open_book.png',
                                 color: iconColor ??
                                     Theme.of(context)
-                                        .primaryTextTheme!
-                                        .headline4!
+                                        .primaryTextTheme.headline4!
                                         .decorationColor!,
                               )),
                         ))
@@ -211,7 +210,7 @@ class AddressTextField extends StatelessWidget {
   }
 
   Future<void> _presetAddressBookPicker(BuildContext context) async {
-    final contact = await Navigator.of(context, rootNavigator: true)
+    final contact = await Navigator.of(context)
         .pushNamed(Routes.pickerAddressBook,arguments: selectedCurrency);
 
     if (contact is ContactBase && contact.address != null) {
diff --git a/lib/src/widgets/alert_background.dart b/lib/src/widgets/alert_background.dart
index 0b4dab470..1b72597af 100644
--- a/lib/src/widgets/alert_background.dart
+++ b/lib/src/widgets/alert_background.dart
@@ -1,5 +1,5 @@
 import 'dart:ui';
-import 'package:flutter/cupertino.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/palette.dart';
 
@@ -21,10 +21,15 @@ class AlertBackground extends StatelessWidget {
           filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
           child: Container(
             decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)),
-            child: child,
+            child: Center(
+              child: Container(
+                width: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint,
+                child: child,
+              ),
+            ),
           ),
         ),
       ),
     );
   }
-}
\ No newline at end of file
+}
diff --git a/lib/src/widgets/alert_close_button.dart b/lib/src/widgets/alert_close_button.dart
index 35a5cd45c..a3657190a 100644
--- a/lib/src/widgets/alert_close_button.dart
+++ b/lib/src/widgets/alert_close_button.dart
@@ -2,9 +2,10 @@ import 'package:cake_wallet/palette.dart';
 import 'package:flutter/material.dart';
 
 class AlertCloseButton extends StatelessWidget {
-  AlertCloseButton({this.image});
+  AlertCloseButton({this.image, this.bottom});
 
   final Image? image;
+  final double? bottom;
 
   final closeButton = Image.asset(
     'assets/images/close.png',
@@ -14,21 +15,18 @@ class AlertCloseButton extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return Positioned(
-        bottom: 60,
-        child: GestureDetector(
-          onTap: () => Navigator.of(context).pop(),
-          child: Container(
-            height: 42,
-            width: 42,
-            decoration: BoxDecoration(
-              color: Colors.white,
-              shape: BoxShape.circle
-            ),
-            child: Center(
-              child: image ?? closeButton,
-            ),
+      bottom: bottom ?? 60,
+      child: GestureDetector(
+        onTap: () => Navigator.of(context).pop(),
+        child: Container(
+          height: 42,
+          width: 42,
+          decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle),
+          child: Center(
+            child: image ?? closeButton,
           ),
-        )
+        ),
+      ),
     );
   }
-}
\ No newline at end of file
+}
diff --git a/lib/src/widgets/base_text_form_field.dart b/lib/src/widgets/base_text_form_field.dart
index 19d43e9c2..ff2102843 100644
--- a/lib/src/widgets/base_text_form_field.dart
+++ b/lib/src/widgets/base_text_form_field.dart
@@ -27,6 +27,7 @@ class BaseTextFormField extends StatelessWidget {
       this.maxLength,
       this.focusNode,
       this.initialValue,
+      this.onSubmit,
       this.borderWidth = 1.0});
 
   final TextEditingController? controller;
@@ -54,6 +55,7 @@ class BaseTextFormField extends StatelessWidget {
   final bool? enableInteractiveSelection;
   final String? initialValue;
   final double borderWidth;
+  final void Function(String)? onSubmit;
 
   @override
   Widget build(BuildContext context) {
@@ -71,11 +73,12 @@ class BaseTextFormField extends StatelessWidget {
       inputFormatters: inputFormatters,
       enabled: enabled,
       maxLength: maxLength,
+      onFieldSubmitted: onSubmit,
       style: textStyle ??
           TextStyle(
               fontSize: 16.0,
               color:
-                  textColor ?? Theme.of(context).primaryTextTheme!.headline6!.color!),
+                  textColor ?? Theme.of(context).primaryTextTheme.headline6!.color!),
       decoration: InputDecoration(
           prefix: prefix,
           prefixIcon: prefixIcon,
@@ -89,17 +92,17 @@ class BaseTextFormField extends StatelessWidget {
           focusedBorder: UnderlineInputBorder(
               borderSide: BorderSide(
                   color: borderColor ??
-                      Theme.of(context).primaryTextTheme!.headline6!.backgroundColor!,
+                      Theme.of(context).primaryTextTheme.headline6!.backgroundColor!,
                   width: borderWidth)),
           disabledBorder: UnderlineInputBorder(
               borderSide: BorderSide(
                   color: borderColor ??
-                      Theme.of(context).primaryTextTheme!.headline6!.backgroundColor!,
+                      Theme.of(context).primaryTextTheme.headline6!.backgroundColor!,
                   width: borderWidth)),
           enabledBorder: UnderlineInputBorder(
               borderSide: BorderSide(
                   color: borderColor ??
-                      Theme.of(context).primaryTextTheme!.headline6!.backgroundColor!,
+                      Theme.of(context).primaryTextTheme.headline6!.backgroundColor!,
                   width: borderWidth))),
       validator: validator,
     );
diff --git a/lib/src/widgets/check_box_picker.dart b/lib/src/widgets/check_box_picker.dart
index 80461e26d..e874f587a 100644
--- a/lib/src/widgets/check_box_picker.dart
+++ b/lib/src/widgets/check_box_picker.dart
@@ -1,4 +1,5 @@
 import 'package:cake_wallet/palette.dart';
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/src/widgets/alert_background.dart';
 import 'package:cake_wallet/src/widgets/alert_close_button.dart';
@@ -32,62 +33,70 @@ class CheckBoxPickerState extends State<CheckBoxPicker> {
   @override
   Widget build(BuildContext context) {
     return AlertBackground(
-      child: Stack(
-        alignment: Alignment.center,
-        children: <Widget>[
-          Column(
-            mainAxisSize: MainAxisSize.min,
-            children: <Widget>[
-              if (widget.title.isNotEmpty)
-                Container(
-                  padding: EdgeInsets.symmetric(horizontal: 24),
-                  child: Text(
-                    widget.title,
-                    textAlign: TextAlign.center,
-                    style: TextStyle(
-                      fontSize: 18,
-                      fontFamily: 'Lato',
-                      fontWeight: FontWeight.bold,
-                      decoration: TextDecoration.none,
-                      color: Colors.white,
-                    ),
-                  ),
-                ),
-              Padding(
-                padding: EdgeInsets.only(left: 24, right: 24, top: 24),
-                child: ClipRRect(
-                  borderRadius: BorderRadius.all(Radius.circular(30)),
-                  child: Container(
-                    color: Theme.of(context).accentTextTheme.headline6!.color!,
-                    child: ConstrainedBox(
-                      constraints: BoxConstraints(
-                        maxHeight: MediaQuery.of(context).size.height * 0.65,
+      child: Column(
+        children: [
+          Expanded(
+            child: Stack(
+              alignment: Alignment.center,
+              children: [
+                Column(
+                  mainAxisSize: MainAxisSize.min,
+                  children: <Widget>[
+                    if (widget.title.isNotEmpty)
+                      Container(
+                        padding: EdgeInsets.symmetric(horizontal: 24),
+                        child: Text(
+                          widget.title,
+                          textAlign: TextAlign.center,
+                          style: TextStyle(
+                            fontSize: 18,
+                            fontFamily: 'Lato',
+                            fontWeight: FontWeight.bold,
+                            decoration: TextDecoration.none,
+                            color: Colors.white,
+                          ),
+                        ),
                       ),
-                      child: Column(
-                        mainAxisSize: MainAxisSize.min,
-                        children: [
-                          Flexible(
-                            child: Stack(
-                              alignment: Alignment.center,
-                              children: <Widget>[
-                                (items.length) > 3
-                                    ? Scrollbar(
-                                        controller: controller,
-                                        child: itemsList(),
-                                      )
-                                    : itemsList(),
+                    Padding(
+                      padding: EdgeInsets.only(left: 24, right: 24, top: 24),
+                      child: ClipRRect(
+                        borderRadius: BorderRadius.all(Radius.circular(30)),
+                        child: Container(
+                          color: Theme.of(context).accentTextTheme.headline6!.color!,
+                          child: ConstrainedBox(
+                            constraints: BoxConstraints(
+                              maxHeight: MediaQuery.of(context).size.height * 0.65,
+                              maxWidth: ResponsiveLayoutUtil.kPopupWidth,
+                            ),
+                            child: Column(
+                              mainAxisSize: MainAxisSize.min,
+                              children: [
+                                Flexible(
+                                  child: Stack(
+                                    alignment: Alignment.center,
+                                    children: <Widget>[
+                                      items.length > 3
+                                          ? Scrollbar(
+                                              controller: controller,
+                                              child: itemsList(),
+                                            )
+                                          : itemsList(),
+                                    ],
+                                  ),
+                                ),
                               ],
                             ),
                           ),
-                        ],
+                        ),
                       ),
                     ),
-                  ),
+                  ],
                 ),
-              )
-            ],
+                SizedBox(height: ResponsiveLayoutUtil.kPopupSpaceHeight),
+                AlertCloseButton(),
+              ],
+            ),
           ),
-          AlertCloseButton(),
         ],
       ),
     );
@@ -146,7 +155,7 @@ class CheckBoxPickerState extends State<CheckBoxPicker> {
             if (value == null) {
               return;
             }
-            
+
             item.value = value;
             widget.onChanged(index, value);
             setState(() {});
diff --git a/lib/src/widgets/introducing_card.dart b/lib/src/widgets/introducing_card.dart
index 52b81fd65..59885d440 100644
--- a/lib/src/widgets/introducing_card.dart
+++ b/lib/src/widgets/introducing_card.dart
@@ -33,54 +33,59 @@ class IntroducingCard extends StatelessWidget {
           children: [
             Expanded(
               flex: 1,
-              child: Padding(
-                padding: const EdgeInsets.all(24),
-                child: Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  children: [
-                    AutoSizeText(title ?? '',
-                        style: TextStyle(
-                            fontSize: 24,
-                            fontFamily: 'Lato',
-                            fontWeight: FontWeight.bold,
-                            color: Theme.of(context)
-                                .accentTextTheme!
-                                .headline2!
-                                .backgroundColor!,
-                            height: 1),
-                        maxLines: 1,
-                        textAlign: TextAlign.center),
-                    SizedBox(height: 14),
-                    Text(subTitle ?? '',
-                        textAlign: TextAlign.left,
-                        style: TextStyle(
-                            fontSize: 12,
-                            fontFamily: 'Lato',
-                            color: Theme.of(context)
-                                .accentTextTheme!
-                                .headline2!
-                                .backgroundColor!,
-                            height: 1)),
-                  ],
+              child: MergeSemantics(
+                child: Padding(
+                  padding: const EdgeInsets.all(24),
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      AutoSizeText(title ?? '',
+                          style: TextStyle(
+                              fontSize: 24,
+                              fontFamily: 'Lato',
+                              fontWeight: FontWeight.bold,
+                              color: Theme.of(context)
+                                  .accentTextTheme!
+                                  .headline2!
+                                  .backgroundColor!,
+                              height: 1),
+                          maxLines: 1,
+                          textAlign: TextAlign.center),
+                      SizedBox(height: 14),
+                      Text(subTitle ?? '',
+                          textAlign: TextAlign.left,
+                          style: TextStyle(
+                              fontSize: 12,
+                              fontFamily: 'Lato',
+                              color: Theme.of(context)
+                                  .accentTextTheme!
+                                  .headline2!
+                                  .backgroundColor!,
+                              height: 1)),
+                    ],
+                  ),
                 ),
               ),
             ),
             Padding(
               padding: const EdgeInsets.fromLTRB(0,16,16,0),
-              child: GestureDetector(
-                onTap: closeCard,
-                child: Container(
-                  height: 23,
-                  width: 23,
-                  decoration: BoxDecoration(
-                      color: Colors.white, shape: BoxShape.circle),
-                  child: Center(
-                      child: Image.asset(
-                    'assets/images/x.png',
-                    color: Palette.darkBlueCraiola,
-                    height: 15,
-                    width: 15,
-                  )),
+              child: Semantics(
+                label: 'Close',
+                child: GestureDetector(
+                  onTap: closeCard,
+                  child: Container(
+                    height: 23,
+                    width: 23,
+                    decoration: BoxDecoration(
+                        color: Colors.white, shape: BoxShape.circle),
+                    child: Center(
+                        child: Image.asset(
+                      'assets/images/x.png',
+                      color: Palette.darkBlueCraiola,
+                      height: 15,
+                      width: 15,
+                    )),
+                  ),
                 ),
               ),
             )
diff --git a/lib/src/widgets/market_place_item.dart b/lib/src/widgets/market_place_item.dart
index 8049a6346..438391c97 100644
--- a/lib/src/widgets/market_place_item.dart
+++ b/lib/src/widgets/market_place_item.dart
@@ -17,6 +17,9 @@ class MarketPlaceItem extends StatelessWidget {
   Widget build(BuildContext context) {
     return InkWell(
       onTap: onTap,
+      hoverColor: Colors.transparent,
+      splashColor: Colors.transparent,
+      highlightColor: Colors.transparent,
       child: Stack(
         children: [
           Container(
diff --git a/lib/src/widgets/nav_bar.dart b/lib/src/widgets/nav_bar.dart
index f6d933c8b..aabe8d9c8 100644
--- a/lib/src/widgets/nav_bar.dart
+++ b/lib/src/widgets/nav_bar.dart
@@ -1,13 +1,7 @@
 import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
 
 class NavBar extends StatelessWidget implements ObstructingPreferredSizeWidget {
-  factory NavBar(
-      {Widget? leading,
-      Widget? middle,
-      Widget? trailing,
-      Color? backgroundColor}) {
-
+  factory NavBar({Widget? leading, Widget? middle, Widget? trailing, Color? backgroundColor}) {
     return NavBar._internal(
         leading: leading,
         middle: middle,
@@ -17,11 +11,7 @@ class NavBar extends StatelessWidget implements ObstructingPreferredSizeWidget {
   }
 
   factory NavBar.withShadow(
-      {Widget? leading,
-      Widget? middle,
-      Widget? trailing,
-      Color? backgroundColor}) {
-
+      {Widget? leading, Widget? middle, Widget? trailing, Color? backgroundColor}) {
     return NavBar._internal(
       leading: leading,
       middle: middle,
@@ -29,13 +19,15 @@ class NavBar extends StatelessWidget implements ObstructingPreferredSizeWidget {
       height: 80,
       backgroundColor: backgroundColor,
       decoration: BoxDecoration(
-          color: backgroundColor,
-          boxShadow: [
-            BoxShadow(
-                color: Color.fromRGBO(132, 141, 198, 0.11),
-                blurRadius: 8,
-                offset: Offset(0, 2))
-          ]),
+        color: backgroundColor,
+        boxShadow: [
+          BoxShadow(
+            color: Color.fromRGBO(132, 141, 198, 0.11),
+            blurRadius: 8,
+            offset: Offset(0, 2),
+          ),
+        ],
+      ),
     );
   }
 
@@ -59,14 +51,17 @@ class NavBar extends StatelessWidget implements ObstructingPreferredSizeWidget {
 
   @override
   Widget build(BuildContext context) {
+    if (leading == null && middle == null && trailing == null) {
+      return const SizedBox();
+    }
+
     final pad = height - _originalHeight;
     final paddingTop = pad / 2;
     final _paddingBottom = (pad / 2);
 
     return Container(
       decoration: decoration ?? BoxDecoration(color: backgroundColor),
-      padding:
-          EdgeInsetsDirectional.only(bottom: _paddingBottom, top: paddingTop),
+      padding: EdgeInsetsDirectional.only(bottom: _paddingBottom, top: paddingTop),
       child: CupertinoNavigationBar(
         leading: leading,
         automaticallyImplyLeading: false,
diff --git a/lib/src/widgets/picker.dart b/lib/src/widgets/picker.dart
index f26ff3ee2..34ff10316 100644
--- a/lib/src/widgets/picker.dart
+++ b/lib/src/widgets/picker.dart
@@ -1,8 +1,10 @@
 // ignore_for_file: deprecated_member_use
 
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/src/widgets/alert_background.dart';
 import 'package:cake_wallet/src/widgets/alert_close_button.dart';
+import 'package:cw_core/currency.dart';
 
 class Picker<Item> extends StatefulWidget {
   Picker({
@@ -36,7 +38,8 @@ class Picker<Item> extends StatefulWidget {
   final bool Function(Item, String)? matchingCriteria;
 
   @override
-  _PickerState<Item> createState() => _PickerState<Item>(items, images, onItemSelected);
+  _PickerState<Item> createState() =>
+      _PickerState<Item>(items, images, onItemSelected);
 }
 
 class _PickerState<Item> extends State<Picker<Item>> {
@@ -45,134 +48,235 @@ class _PickerState<Item> extends State<Picker<Item>> {
   final Function(Item) onItemSelected;
   List<Item> items;
   List<Image> images;
+  List<Item> filteredItems = [];
+  List<Image> filteredImages = [];
 
   final TextEditingController searchController = TextEditingController();
 
   ScrollController controller = ScrollController();
 
+  void clearFilteredItemsList() {
+    filteredItems = List.from(
+      items,
+      growable: true,
+    );
+    filteredImages = List.from(
+      images,
+      growable: true,
+    );
+
+    if (widget.selectedAtIndex != -1) {
+      if (widget.selectedAtIndex < filteredItems.length) {
+        filteredItems.removeAt(widget.selectedAtIndex);
+      }
+
+      if (widget.selectedAtIndex < filteredImages.length) {
+        filteredImages.removeAt(widget.selectedAtIndex);
+      }
+    }
+  }
+
   @override
   void initState() {
     super.initState();
 
+    clearFilteredItemsList();
+
     searchController.addListener(() {
-      items = [];
-      images = [];
-      for (int i=0;i<widget.items.length;i++) {
-        if (widget.matchingCriteria?.call(widget.items[i], searchController.text) ?? true) {
-          items.add(widget.items[i]);
-          images.add(widget.images[i]);
-        }
-      }
-      setState(() {});
+      clearFilteredItemsList();
+
+      setState(() {
+        filteredItems = List.from(items.where((element) {
+          if (widget.selectedAtIndex != items.indexOf(element) &&
+              (widget.matchingCriteria?.call(element, searchController.text) ??
+                  true)) {
+            if (images.isNotEmpty) {
+              filteredImages.add(images[items.indexOf(element)]);
+            }
+            return true;
+          }
+
+          if (filteredImages.isNotEmpty) {
+            filteredImages.remove(images[items.indexOf(element)]);
+          }
+          return false;
+        }), growable: true);
+
+        return;
+      });
     });
   }
 
   @override
   Widget build(BuildContext context) {
+    final double padding = 24;
+
+    final mq = MediaQuery.of(context);
+    final bottom = mq.viewInsets.bottom;
+    final height = mq.size.height - bottom;
+    final screenCenter = height / 2;
+
+    double closeButtonBottom = 60;
+    double containerHeight = height * 0.65;
+    if (bottom > 0) {
+      // increase a bit or it gets too squished in the top
+      containerHeight = height * 0.75;
+
+      final containerCenter = containerHeight / 2;
+      final containerBottom = screenCenter - containerCenter;
+
+      final hasTitle = widget.title == null || widget.title!.isEmpty;
+
+      // position the close button right below the search container
+      closeButtonBottom = closeButtonBottom -
+          containerBottom +
+          (hasTitle ? padding : padding / 1.5);
+    }
+
     return AlertBackground(
-      child: Stack(
-        alignment: Alignment.center,
-        children: <Widget>[
-          Column(
-            mainAxisSize: MainAxisSize.min,
-            children: <Widget>[
-              if (widget.title?.isNotEmpty ?? false)
-                Container(
-                  padding: EdgeInsets.symmetric(horizontal: 24),
-                  child: Text(
-                    widget.title!,
-                    textAlign: TextAlign.center,
-                    style: TextStyle(
-                      fontSize: 18,
-                      fontFamily: 'Lato',
-                      fontWeight: FontWeight.bold,
-                      decoration: TextDecoration.none,
-                      color: Colors.white,
-                    ),
-                  ),
-                ),
-              Padding(
-                padding: EdgeInsets.only(left: 24, right: 24, top: 24),
-                child: ClipRRect(
-                  borderRadius: BorderRadius.all(Radius.circular(30)),
-                  child: Container(
-                    color: Theme.of(context).accentTextTheme.headline6!.color!,
-                    child: ConstrainedBox(
-                      constraints: BoxConstraints(
-                        maxHeight: MediaQuery.of(context).size.height * 0.65,
-                      ),
-                      child: Column(
-                        mainAxisSize: MainAxisSize.min,
-                        children: [
-                          if (widget.hintText != null)
-                            Padding(
-                              padding: const EdgeInsets.all(16),
-                              child: TextFormField(
-                                controller: searchController,
-                                style: TextStyle(color: Theme.of(context).primaryTextTheme.headline6!.color!),
-                                decoration: InputDecoration(
-                                  hintText: widget.hintText,
-                                  prefixIcon: Image.asset("assets/images/search_icon.png"),
-                                  filled: true,
-                                  fillColor: Theme.of(context).accentTextTheme.headline3!.color!,
-                                  alignLabelWithHint: false,
-                                  contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
-                                  enabledBorder: OutlineInputBorder(
-                                      borderRadius: BorderRadius.circular(14),
-                                      borderSide: const BorderSide(
-                                        color: Colors.transparent,
-                                      )),
-                                  focusedBorder: OutlineInputBorder(
-                                      borderRadius: BorderRadius.circular(14),
-                                      borderSide: const BorderSide(
-                                        color: Colors.transparent,
-                                      )),
-                                ),
-                              ),
-                            ),
-                          Divider(
-                            color: Theme.of(context).accentTextTheme.headline6!.backgroundColor!,
-                            height: 1,
+      child: Column(
+        children: [
+          Expanded(
+            flex: 1,
+            child: Stack(
+              alignment: Alignment.center,
+              children: <Widget>[
+                Column(
+                  mainAxisSize: MainAxisSize.min,
+                  mainAxisAlignment: MainAxisAlignment.center,
+                  children: <Widget>[
+                    if (widget.title?.isNotEmpty ?? false)
+                      Container(
+                        padding: EdgeInsets.symmetric(horizontal: padding),
+                        child: Text(
+                          widget.title!,
+                          textAlign: TextAlign.center,
+                          style: TextStyle(
+                            fontSize: 18,
+                            fontFamily: 'Lato',
+                            fontWeight: FontWeight.bold,
+                            decoration: TextDecoration.none,
+                            color: Colors.white,
                           ),
-                          if (widget.selectedAtIndex != -1) buildSelectedItem(),
-                          Flexible(
-                            child: Stack(
-                              alignment: Alignment.center,
-                              children: <Widget>[
-                                items.length > 3 ? Scrollbar(
-                                  controller: controller,
-                                  child: itemsList(),
-                                ) : itemsList(),
-                                (widget.description?.isNotEmpty ?? false)
-                                    ? Positioned(
-                                        bottom: 24,
-                                        left: 24,
-                                        right: 24,
-                                        child: Text(
-                                          widget.description!,
-                                          textAlign: TextAlign.center,
-                                          style: TextStyle(
-                                            fontSize: 12,
-                                            fontWeight: FontWeight.w500,
-                                            fontFamily: 'Lato',
-                                            decoration: TextDecoration.none,
-                                            color: Theme.of(context).primaryTextTheme.headline6!.color!,
-                                          ),
-                                        ),
-                                      )
-                                    : Offstage(),
+                        ),
+                      ),
+                    Padding(
+                      padding: EdgeInsets.symmetric(horizontal: padding),
+                      child: ClipRRect(
+                        borderRadius: BorderRadius.all(Radius.circular(30)),
+                        child: Container(
+                          color: Theme.of(context)
+                              .accentTextTheme
+                              .headline6!
+                              .color!,
+                          child: ConstrainedBox(
+                            constraints: BoxConstraints(
+                              maxHeight: containerHeight,
+                              maxWidth: ResponsiveLayoutUtil.kPopupWidth,
+                            ),
+                            child: Column(
+                              mainAxisSize: MainAxisSize.min,
+                              children: [
+                                if (widget.hintText != null)
+                                  Padding(
+                                    padding: const EdgeInsets.all(16),
+                                    child: TextFormField(
+                                      controller: searchController,
+                                      style: TextStyle(
+                                          color: Theme.of(context)
+                                              .primaryTextTheme
+                                              .headline6!
+                                              .color!),
+                                      decoration: InputDecoration(
+                                        hintText: widget.hintText,
+                                        prefixIcon: Image.asset(
+                                            "assets/images/search_icon.png"),
+                                        filled: true,
+                                        fillColor: Theme.of(context)
+                                            .accentTextTheme
+                                            .headline3!
+                                            .color!,
+                                        alignLabelWithHint: false,
+                                        contentPadding:
+                                            const EdgeInsets.symmetric(
+                                                vertical: 4, horizontal: 16),
+                                        enabledBorder: OutlineInputBorder(
+                                            borderRadius:
+                                                BorderRadius.circular(14),
+                                            borderSide: const BorderSide(
+                                              color: Colors.transparent,
+                                            )),
+                                        focusedBorder: OutlineInputBorder(
+                                            borderRadius:
+                                                BorderRadius.circular(14),
+                                            borderSide: const BorderSide(
+                                              color: Colors.transparent,
+                                            )),
+                                      ),
+                                    ),
+                                  ),
+                                Divider(
+                                  color: Theme.of(context)
+                                      .accentTextTheme
+                                      .headline6!
+                                      .backgroundColor!,
+                                  height: 1,
+                                ),
+                                if (widget.selectedAtIndex != -1)
+                                  buildSelectedItem(widget.selectedAtIndex),
+                                Flexible(
+                                  child: Stack(
+                                    alignment: Alignment.center,
+                                    children: <Widget>[
+                                      filteredItems.length > 3
+                                          ? Scrollbar(
+                                              controller: controller,
+                                              child: itemsList(),
+                                            )
+                                          : itemsList(),
+                                      (widget.description?.isNotEmpty ?? false)
+                                          ? Positioned(
+                                              bottom: padding,
+                                              left: padding,
+                                              right: padding,
+                                              child: Text(
+                                                widget.description!,
+                                                textAlign: TextAlign.center,
+                                                style: TextStyle(
+                                                  fontSize: 12,
+                                                  fontWeight: FontWeight.w500,
+                                                  fontFamily: 'Lato',
+                                                  decoration:
+                                                      TextDecoration.none,
+                                                  color: Theme.of(context)
+                                                      .primaryTextTheme
+                                                      .headline6!
+                                                      .color!,
+                                                ),
+                                              ),
+                                            )
+                                          : Offstage(),
+                                    ],
+                                  ),
+                                ),
                               ],
                             ),
                           ),
-                        ],
+                        ),
                       ),
-                    ),
-                  ),
+                    )
+                  ],
                 ),
-              )
-            ],
+                SizedBox(height: ResponsiveLayoutUtil.kPopupSpaceHeight),
+                AlertCloseButton(bottom: closeButtonBottom),
+              ],
+            ),
           ),
-          AlertCloseButton(),
+          // gives the extra spacing using MediaQuery.viewInsets.bottom
+          // to simulate a keyboard area
+          SizedBox(
+            height: bottom,
+          )
         ],
       ),
     );
@@ -186,7 +290,7 @@ class _PickerState<Item> extends State<Picker<Item>> {
               padding: EdgeInsets.zero,
               controller: controller,
               shrinkWrap: true,
-              itemCount: items.isEmpty ? 0 : items.length,
+              itemCount: filteredItems.isEmpty ? 0 : filteredItems.length,
               gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                 crossAxisCount: 2,
                 crossAxisSpacing: 2,
@@ -200,34 +304,42 @@ class _PickerState<Item> extends State<Picker<Item>> {
               shrinkWrap: true,
               separatorBuilder: (context, index) => widget.isSeparated
                   ? Divider(
-                      color: Theme.of(context).accentTextTheme.headline6!.backgroundColor!,
+                      color: Theme.of(context)
+                          .accentTextTheme
+                          .headline6!
+                          .backgroundColor!,
                       height: 1,
                     )
                   : const SizedBox(),
-              itemCount: items.isEmpty ? 0 : items.length,
+              itemCount: filteredItems.isEmpty ? 0 : filteredItems.length,
               itemBuilder: (context, index) => buildItem(index),
             ),
     );
   }
 
   Widget buildItem(int index) {
-    /// don't show selected item in the list view
-    if (widget.items[widget.selectedAtIndex] == items[index] && !widget.isGridView) {
-      return const SizedBox();
-    }
+    final item = filteredItems[index];
+    final tag = item is Currency ? item.tag : null;
 
-    final item = items[index];
-    final image = images.isNotEmpty ? images[index] : null;
+    final icon = item is Currency && item.iconPath != null
+        ? Image.asset(
+            item.iconPath!,
+            height: 20.0,
+            width: 20.0,
+          )
+        : null;
+
+    final image = images.isNotEmpty ? filteredImages[index] : icon;
 
     return GestureDetector(
       onTap: () {
         Navigator.of(context).pop();
-        onItemSelected(item);
+        onItemSelected(item!);
       },
       child: Container(
         height: 55,
         color: Theme.of(context).accentTextTheme.headline6!.color!,
-        padding: EdgeInsets.only(left: 24, right: 24),
+        padding: EdgeInsets.symmetric(horizontal: 24),
         child: Row(
           mainAxisSize: MainAxisSize.max,
           mainAxisAlignment: widget.mainAxisAlignment,
@@ -237,15 +349,53 @@ class _PickerState<Item> extends State<Picker<Item>> {
             Expanded(
               child: Padding(
                 padding: EdgeInsets.only(left: image != null ? 12 : 0),
-                child: Text(
-                  widget.displayItem?.call(item) ?? item.toString(),
-                  style: TextStyle(
-                    fontSize: 14,
-                    fontFamily: 'Lato',
-                    fontWeight: FontWeight.w600,
-                    color: Theme.of(context).primaryTextTheme.headline6!.color!,
-                    decoration: TextDecoration.none,
-                  ),
+                child: Row(
+                  children: [
+                    Flexible(
+                      child: Text(
+                        widget.displayItem?.call(item) ?? item.toString(),
+                        softWrap: true,
+                        style: TextStyle(
+                          fontSize: 14,
+                          fontFamily: 'Lato',
+                          fontWeight: FontWeight.w600,
+                          color: Theme.of(context)
+                              .primaryTextTheme
+                              .headline6!
+                              .color!,
+                          decoration: TextDecoration.none,
+                        ),
+                      ),
+                    ),
+                    if (tag != null)
+                      Align(
+                        alignment: Alignment.topCenter,
+                        child: Container(
+                          width: 35.0,
+                          height: 18.0,
+                          child: Center(
+                            child: Text(
+                              tag,
+                              style: TextStyle(
+                                  fontSize: 7.0,
+                                  fontFamily: 'Lato',
+                                  color: Theme.of(context)
+                                      .textTheme
+                                      .bodyText2!
+                                      .color!),
+                            ),
+                          ),
+                          decoration: BoxDecoration(
+                            borderRadius: BorderRadius.circular(6.0),
+                            //border: Border.all(color: ),
+                            color: Theme.of(context)
+                                .textTheme
+                                .bodyText2!
+                                .decorationColor!,
+                          ),
+                        ),
+                      ),
+                  ],
                 ),
               ),
             ),
@@ -255,37 +405,91 @@ class _PickerState<Item> extends State<Picker<Item>> {
     );
   }
 
-  Widget buildSelectedItem() {
-    final item = widget.items[widget.selectedAtIndex];
-    final image = images.isNotEmpty ? widget.images[widget.selectedAtIndex] : null;
+  Widget buildSelectedItem(int index) {
+    final item = items[index];
+    final tag = item is Currency ? item.tag : null;
 
-    return Container(
-      height: 55,
-      color: Theme.of(context).accentTextTheme.headline6!.color!,
-      padding: EdgeInsets.only(left: 24, right: 24),
-      child: Row(
-        mainAxisSize: MainAxisSize.max,
-        mainAxisAlignment: widget.mainAxisAlignment,
-        crossAxisAlignment: CrossAxisAlignment.center,
-        children: <Widget>[
-          image ?? Offstage(),
-          Expanded(
-            child: Padding(
-              padding: EdgeInsets.only(left: image != null ? 12 : 0),
-              child: Text(
-                widget.displayItem?.call(item) ?? item.toString(),
-                style: TextStyle(
-                  fontSize: 16,
-                  fontFamily: 'Lato',
-                  fontWeight: FontWeight.w700,
-                  color: Theme.of(context).primaryTextTheme.headline6!.color!,
-                  decoration: TextDecoration.none,
+    final icon = item is Currency && item.iconPath != null
+        ? Image.asset(
+            item.iconPath!,
+            height: 20.0,
+            width: 20.0,
+          )
+        : null;
+
+    final image = images.isNotEmpty ? images[index] : icon;
+
+    return GestureDetector(
+      onTap: () {
+        Navigator.of(context).pop();
+      },
+      child: Container(
+        height: 55,
+        color: Theme.of(context).accentTextTheme.headline6!.color!,
+        padding: EdgeInsets.symmetric(horizontal: 24),
+        child: Row(
+          mainAxisSize: MainAxisSize.max,
+          mainAxisAlignment: widget.mainAxisAlignment,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: <Widget>[
+            image ?? Offstage(),
+            Expanded(
+              child: Padding(
+                padding: EdgeInsets.only(left: image != null ? 12 : 0),
+                child: Row(
+                  children: [
+                    Flexible(
+                      child: Text(
+                        widget.displayItem?.call(item) ?? item.toString(),
+                        softWrap: true,
+                        style: TextStyle(
+                          fontSize: 16,
+                          fontFamily: 'Lato',
+                          fontWeight: FontWeight.w700,
+                          color: Theme.of(context)
+                              .primaryTextTheme
+                              .headline6!
+                              .color!,
+                          decoration: TextDecoration.none,
+                        ),
+                      ),
+                    ),
+                    if (tag != null)
+                      Align(
+                        alignment: Alignment.topCenter,
+                        child: Container(
+                          width: 35.0,
+                          height: 18.0,
+                          child: Center(
+                            child: Text(
+                              tag,
+                              style: TextStyle(
+                                  fontSize: 7.0,
+                                  fontFamily: 'Lato',
+                                  color: Theme.of(context)
+                                      .textTheme
+                                      .bodyText2!
+                                      .color!),
+                            ),
+                          ),
+                          decoration: BoxDecoration(
+                            borderRadius: BorderRadius.circular(6.0),
+                            //border: Border.all(color: ),
+                            color: Theme.of(context)
+                                .textTheme
+                                .bodyText2!
+                                .decorationColor!,
+                          ),
+                        ),
+                      ),
+                  ],
                 ),
               ),
             ),
-          ),
-          Icon(Icons.check_circle, color: Theme.of(context).accentTextTheme.bodyText1!.color!),
-        ],
+            Icon(Icons.check_circle,
+                color: Theme.of(context).accentTextTheme.bodyText1!.color!),
+          ],
+        ),
       ),
     );
   }
diff --git a/lib/src/widgets/primary_button.dart b/lib/src/widgets/primary_button.dart
index a563319c5..c27169894 100644
--- a/lib/src/widgets/primary_button.dart
+++ b/lib/src/widgets/primary_button.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/utils/responsive_layout_util.dart';
 import 'package:dotted_border/dotted_border.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -24,28 +25,31 @@ class PrimaryButton extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    final content = SizedBox(
-        width: double.infinity,
-        height: 52.0,
-        child: TextButton(
-          onPressed: isDisabled
-              ? (onDisabledPressed != null ? onDisabledPressed : null) : onPressed,
-          style: ButtonStyle(backgroundColor: MaterialStateProperty.all(isDisabled ? color.withOpacity(0.5) : color),
-              shape: MaterialStateProperty.all<RoundedRectangleBorder>(
-                RoundedRectangleBorder(
-                  borderRadius: BorderRadius.circular(26.0),
+    final content = ConstrainedBox(
+      constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+      child: SizedBox(
+          width: double.infinity,
+          height: 52.0,
+          child: TextButton(
+            onPressed: isDisabled
+                ? (onDisabledPressed != null ? onDisabledPressed : null) : onPressed,
+            style: ButtonStyle(backgroundColor: MaterialStateProperty.all(isDisabled ? color.withOpacity(0.5) : color),
+                shape: MaterialStateProperty.all<RoundedRectangleBorder>(
+                  RoundedRectangleBorder(
+                    borderRadius: BorderRadius.circular(26.0),
+                  ),
                 ),
-              ),
-            overlayColor: MaterialStateProperty.all(Colors.transparent)),
-          child: Text(text,
-              textAlign: TextAlign.center,
-              style: TextStyle(
-                  fontSize: 15.0,
-                  fontWeight: FontWeight.w600,
-                  color: isDisabled
-                      ? textColor.withOpacity(0.5)
-                      : textColor)),
-        ));
+              overlayColor: MaterialStateProperty.all(Colors.transparent)),
+            child: Text(text,
+                textAlign: TextAlign.center,
+                style: TextStyle(
+                    fontSize: 15.0,
+                    fontWeight: FontWeight.w600,
+                    color: isDisabled
+                        ? textColor.withOpacity(0.5)
+                        : textColor)),
+          )),
+    );
 
     return isDottedBorder
         ? DottedBorder(
@@ -77,29 +81,32 @@ class LoadingPrimaryButton extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return SizedBox(
-        width: double.infinity,
-        height: 52.0,
-        child: TextButton(
-          onPressed: (isLoading || isDisabled) ? null : onPressed,
-          style: ButtonStyle(backgroundColor: MaterialStateProperty.all(isDisabled ? color.withOpacity(0.5) : color),
-            shape: MaterialStateProperty.all<RoundedRectangleBorder>(
-              RoundedRectangleBorder(
-                borderRadius: BorderRadius.circular(26.0),
-              ),
-            )),
-
-          child: isLoading
-              ? CupertinoActivityIndicator(animating: true)
-              : Text(text,
-              style: TextStyle(
-                  fontSize: 15.0,
-                  fontWeight: FontWeight.w600,
-                  color: isDisabled
-                      ? textColor.withOpacity(0.5)
-                      : textColor
+    return ConstrainedBox(
+      constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+      child: SizedBox(
+          width: double.infinity,
+          height: 52.0,
+          child: TextButton(
+            onPressed: (isLoading || isDisabled) ? null : onPressed,
+            style: ButtonStyle(backgroundColor: MaterialStateProperty.all(isDisabled ? color.withOpacity(0.5) : color),
+              shape: MaterialStateProperty.all<RoundedRectangleBorder>(
+                RoundedRectangleBorder(
+                  borderRadius: BorderRadius.circular(26.0),
+                ),
               )),
-        ));
+
+            child: isLoading
+                ? CupertinoActivityIndicator(animating: true)
+                : Text(text,
+                style: TextStyle(
+                    fontSize: 15.0,
+                    fontWeight: FontWeight.w600,
+                    color: isDisabled
+                        ? textColor.withOpacity(0.5)
+                        : textColor
+                )),
+          )),
+    );
   }
 }
 
@@ -130,45 +137,48 @@ class PrimaryIconButton extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return SizedBox(
-        width: double.infinity,
-        height: 52.0,
-        child: TextButton(
-          onPressed: onPressed,
-          style: ButtonStyle(backgroundColor: MaterialStateProperty.all(color),
-              shape: MaterialStateProperty.all<RoundedRectangleBorder>(
-                RoundedRectangleBorder(
-                  borderRadius: BorderRadius.circular(radius),
-                ),
-              )),
-          child: Stack(
-            children: <Widget>[
-              Row(
-                mainAxisAlignment: mainAxisAlignment,
-                children: <Widget>[
-                  Container(
-                    width: 26.0,
-                    height: 52.0,
-                    decoration: BoxDecoration(
-                        shape: BoxShape.circle, color: iconBackgroundColor),
-                    child: Center(
-                        child: Icon(iconData, color: iconColor, size: 22.0)
-                    ),
+    return ConstrainedBox(
+      constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+      child: SizedBox(
+          width: double.infinity,
+          height: 52.0,
+          child: TextButton(
+            onPressed: onPressed,
+            style: ButtonStyle(backgroundColor: MaterialStateProperty.all(color),
+                shape: MaterialStateProperty.all<RoundedRectangleBorder>(
+                  RoundedRectangleBorder(
+                    borderRadius: BorderRadius.circular(radius),
                   ),
-                ],
-              ),
-              Container(
-                height: 52.0,
-                child: Center(
-                  child: Text(text,
-                      style: TextStyle(
-                          fontSize: 16.0,
-                          color: textColor)),
+                )),
+            child: Stack(
+              children: <Widget>[
+                Row(
+                  mainAxisAlignment: mainAxisAlignment,
+                  children: <Widget>[
+                    Container(
+                      width: 26.0,
+                      height: 52.0,
+                      decoration: BoxDecoration(
+                          shape: BoxShape.circle, color: iconBackgroundColor),
+                      child: Center(
+                          child: Icon(iconData, color: iconColor, size: 22.0)
+                      ),
+                    ),
+                  ],
                 ),
-              )
-            ],
-          ),
-        ));
+                Container(
+                  height: 52.0,
+                  child: Center(
+                    child: Text(text,
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: textColor)),
+                  ),
+                )
+              ],
+            ),
+          )),
+    );
   }
 }
 
@@ -190,34 +200,37 @@ class PrimaryImageButton extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return SizedBox(
-        width: double.infinity,
-        height: 52.0,
-        child: TextButton(
-          onPressed: onPressed,
-          style: ButtonStyle(backgroundColor: MaterialStateProperty.all(color),
-              shape: MaterialStateProperty.all<RoundedRectangleBorder>(
-                RoundedRectangleBorder(
-                  borderRadius: BorderRadius.circular(26.0),
-                ),
-              )),
-          child:Center(
-            child: Row(
-              mainAxisSize: MainAxisSize.min,
-              children: <Widget>[
-                image,
-                SizedBox(width: 15),
-                Text(
-                  text,
-                  style: TextStyle(
-                    fontSize: 15,
-                    fontWeight: FontWeight.w600,
-                    color: textColor
+    return ConstrainedBox(
+      constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtil.kDesktopMaxWidthConstraint),
+      child: SizedBox(
+          width: double.infinity,
+          height: 52.0,
+          child: TextButton(
+            onPressed: onPressed,
+            style: ButtonStyle(backgroundColor: MaterialStateProperty.all(color),
+                shape: MaterialStateProperty.all<RoundedRectangleBorder>(
+                  RoundedRectangleBorder(
+                    borderRadius: BorderRadius.circular(26.0),
                   ),
-                )
-              ],
-            ),
-          )
-        ));
+                )),
+            child:Center(
+              child: Row(
+                mainAxisSize: MainAxisSize.min,
+                children: <Widget>[
+                  image,
+                  SizedBox(width: 15),
+                  Text(
+                    text,
+                    style: TextStyle(
+                      fontSize: 15,
+                      fontWeight: FontWeight.w600,
+                      color: textColor
+                    ),
+                  )
+                ],
+              ),
+            )
+          )),
+    );
   }
 }
diff --git a/lib/src/widgets/seed_language_selector.dart b/lib/src/widgets/seed_language_selector.dart
index f874d62a4..4db3684a8 100644
--- a/lib/src/widgets/seed_language_selector.dart
+++ b/lib/src/widgets/seed_language_selector.dart
@@ -5,7 +5,8 @@ import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart';
 import 'package:cake_wallet/src/screens/seed_language/widgets/seed_language_picker.dart';
 
 class SeedLanguageSelector extends StatefulWidget {
-  SeedLanguageSelector({Key? key, required this.initialSelected}) : super(key: key);
+  SeedLanguageSelector({Key? key, required this.initialSelected})
+      : super(key: key);
 
   final String initialSelected;
 
@@ -30,21 +31,20 @@ class SeedLanguageSelectorState extends State<SeedLanguageSelector> {
     S.current.seed_language_italian,
   ];
   String selected;
-  final _pickerKey = GlobalKey<SeedLanguagePickerState>();
 
   @override
   Widget build(BuildContext context) {
     return SelectButton(
-        image: null,
-        text: seedLocales[seedLanguages.indexOf(selected)],
-        onTap: () async {
-          final selected = await showPopUp<String>(
-              context: context,
-              builder: (BuildContext context) =>
-                  SeedLanguagePicker(key: _pickerKey, selected: this.selected));
-          if (selected != null) {
-            setState(() => this.selected = selected);
-          }
-        });
+      image: null,
+      text: seedLocales[seedLanguages.indexOf(selected)],
+      onTap: () async {
+        await showPopUp<String>(
+            context: context,
+            builder: (_) => SeedLanguagePicker(
+                selected: this.selected,
+                onItemSelected: (String selected) =>
+                    setState(() => this.selected = selected)));
+      },
+    );
   }
 }
diff --git a/lib/src/widgets/setting_action_button.dart b/lib/src/widgets/setting_action_button.dart
new file mode 100644
index 000000000..ef2d4e1bd
--- /dev/null
+++ b/lib/src/widgets/setting_action_button.dart
@@ -0,0 +1,81 @@
+import 'package:cake_wallet/palette.dart';
+import 'package:flutter/material.dart';
+
+class SettingActionButton extends StatelessWidget {
+  final bool isLastTile;
+  final bool isSelected;
+  final bool isArrowVisible;
+  final bool selectionActive;
+  final VoidCallback onTap;
+  final String image;
+  final String title;
+  final double fromBottomEdge;
+  final double fromTopEdge;
+  final double tileHeight;
+  const SettingActionButton({
+    super.key,
+    this.isLastTile = false,
+    this.isSelected = false,
+    this.selectionActive = true,
+    this.isArrowVisible = false,
+    required this.onTap,
+    required this.image,
+    required this.title,
+    this.tileHeight = 60,
+    this.fromTopEdge = 50,
+    this.fromBottomEdge = 25,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    Color? color = isSelected
+        ? Theme.of(context).textTheme.headline3!.color
+        : selectionActive
+            ? Palette.darkBlue
+            : Theme.of(context).textTheme.headline3!.color;
+    return InkWell(
+      onTap: onTap,
+      hoverColor: Colors.transparent,
+      child: Container(
+        height:  tileHeight,
+        padding: isLastTile
+            ? EdgeInsets.only(
+                left: 24,
+                right: 24,
+                top: fromBottomEdge,
+              )
+            : EdgeInsets.only(left: 24, right: 24),
+        alignment: isLastTile ? Alignment.topLeft : null,
+        child: Row(
+          mainAxisAlignment: MainAxisAlignment.start,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: <Widget>[
+            Image.asset(
+              image,
+              height: 16,
+              width: 16,
+              color: Palette.darkBlue,
+            ),
+            SizedBox(width: 16),
+            Expanded(
+              child: Text(
+                title,
+                style: TextStyle(
+                  color: color,
+                  fontSize: 16,
+                  fontWeight: FontWeight.bold,
+                ),
+              ),
+            ),
+            if (isArrowVisible)
+              Icon(
+                Icons.arrow_forward_ios,
+                color: color,
+                size: 16,
+              )
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/src/widgets/setting_actions.dart b/lib/src/widgets/setting_actions.dart
new file mode 100644
index 000000000..4dd16670a
--- /dev/null
+++ b/lib/src/widgets/setting_actions.dart
@@ -0,0 +1,109 @@
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
+import 'package:flutter/material.dart';
+
+class SettingActions {
+  final String name;
+  final String image;
+  final void Function(BuildContext) onTap;
+
+  SettingActions._({
+    required this.name,
+    required this.image,
+    required this.onTap,
+  });
+
+  static List<SettingActions> all = [
+    connectionSettingAction,
+    walletSettingAction,
+    addressBookSettingAction,
+    securityBackupSettingAction,
+    privacySettingAction,
+    displaySettingAction,
+    otherSettingAction,
+    supportSettingAction,
+  ];
+
+  static List<SettingActions> desktopSettings = [
+    connectionSettingAction,
+    walletSettingAction,
+    addressBookSettingAction,
+    securityBackupSettingAction,
+    privacySettingAction,
+    displaySettingAction,
+    otherSettingAction,
+    supportSettingAction,
+  ];
+
+  static SettingActions connectionSettingAction = SettingActions._(
+    name: S.current.connection_sync,
+    image: 'assets/images/nodes_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.connectionSync);
+    },
+  );
+
+  static SettingActions walletSettingAction = SettingActions._(
+    name: S.current.wallets,
+    image: 'assets/images/wallet_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.walletList);
+    },
+  );
+
+  static SettingActions addressBookSettingAction = SettingActions._(
+    name: S.current.address_book_menu,
+    image: 'assets/images/open_book_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.addressBook);
+    },
+  );
+
+  static SettingActions securityBackupSettingAction = SettingActions._(
+    name: S.current.security_and_backup,
+    image: 'assets/images/key_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.securityBackupPage);
+    },
+  );
+
+  static SettingActions privacySettingAction = SettingActions._(
+    name: S.current.privacy,
+    image: 'assets/images/privacy_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.privacyPage);
+    },
+  );
+
+  static SettingActions displaySettingAction = SettingActions._(
+    name: S.current.display_settings,
+    image: 'assets/images/eye_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.displaySettingsPage);
+    },
+  );
+
+  static SettingActions otherSettingAction = SettingActions._(
+    name: S.current.other_settings,
+    image: 'assets/images/settings_menu.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.otherSettingsPage);
+    },
+  );
+
+  static SettingActions supportSettingAction = SettingActions._(
+    name: S.current.settings_support,
+    image: 'assets/images/question_mark.png',
+    onTap: (BuildContext context) {
+      Navigator.pop(context);
+      Navigator.of(context).pushNamed(Routes.support);
+    },
+  );
+}
diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart
index 0b5bd9b74..cc620e6c4 100644
--- a/lib/store/settings_store.dart
+++ b/lib/store/settings_store.dart
@@ -20,6 +20,8 @@ import 'package:cw_core/node.dart';
 import 'package:cake_wallet/monero/monero.dart';
 import 'package:cake_wallet/entities/action_list_display_mode.dart';
 import 'package:cake_wallet/entities/fiat_api_mode.dart';
+import 'package:cw_core/set_app_secure_native.dart';
+import 'dart:io' show Platform;
 
 part 'settings_store.g.dart';
 
@@ -28,9 +30,11 @@ class SettingsStore = SettingsStoreBase with _$SettingsStore;
 abstract class SettingsStoreBase with Store {
   SettingsStoreBase(
       {required SharedPreferences sharedPreferences,
+      required bool initialShouldShowMarketPlaceInDashboard,
       required FiatCurrency initialFiatCurrency,
       required BalanceDisplayMode initialBalanceDisplayMode,
       required bool initialSaveRecipientAddress,
+      required bool initialAppSecure,
       required FiatApiMode initialFiatMode,
       required bool initialAllowBiometricalAuthentication,
       required ExchangeApiMode initialExchangeStatus,
@@ -54,8 +58,10 @@ abstract class SettingsStoreBase with Store {
     fiatCurrency = initialFiatCurrency,
     balanceDisplayMode = initialBalanceDisplayMode,
     shouldSaveRecipientAddress = initialSaveRecipientAddress,
+        isAppSecure = initialAppSecure,
     fiatApiMode = initialFiatMode,
     allowBiometricalAuthentication = initialAllowBiometricalAuthentication,
+        shouldShowMarketPlaceInDashboard = initialShouldShowMarketPlaceInDashboard,
     exchangeStatus = initialExchangeStatus,
     currentTheme = initialTheme,
     pinCodeLength = initialPinLength,
@@ -126,6 +132,17 @@ abstract class SettingsStoreBase with Store {
             PreferencesKey.shouldSaveRecipientAddressKey,
             shouldSaveRecipientAddress));
 
+    reaction((_) => isAppSecure, (bool isAppSecure) {
+      sharedPreferences.setBool(PreferencesKey.isAppSecureKey, isAppSecure);
+      if (Platform.isAndroid) {
+        setIsAppSecureNative(isAppSecure);
+      }
+    });
+
+    if (Platform.isAndroid) {
+      setIsAppSecureNative(isAppSecure);
+    }
+
     reaction(
             (_) => fiatApiMode,
             (FiatApiMode mode) => sharedPreferences.setInt(
@@ -142,6 +159,11 @@ abstract class SettingsStoreBase with Store {
             PreferencesKey.allowBiometricalAuthenticationKey,
             biometricalAuthentication));
 
+    reaction(
+        (_) => shouldShowMarketPlaceInDashboard,
+        (bool value) =>
+            sharedPreferences.setBool(PreferencesKey.shouldShowMarketPlaceInDashboard, value));
+
     reaction(
         (_) => pinCodeLength,
         (int pinLength) => sharedPreferences.setInt(
@@ -186,6 +208,9 @@ abstract class SettingsStoreBase with Store {
   @observable
   bool shouldShowYatPopup;
 
+  @observable
+  bool shouldShowMarketPlaceInDashboard;
+
   @observable
   ObservableList<ActionListDisplayMode> actionlistDisplayMode;
 
@@ -198,6 +223,9 @@ abstract class SettingsStoreBase with Store {
   @observable
   bool shouldSaveRecipientAddress;
 
+  @observable
+  bool isAppSecure;
+
   @observable
   bool allowBiometricalAuthentication;
 
@@ -250,8 +278,8 @@ abstract class SettingsStoreBase with Store {
       {required Box<Node> nodeSource,
       required bool isBitcoinBuyEnabled,
       FiatCurrency initialFiatCurrency = FiatCurrency.usd,
-      BalanceDisplayMode initialBalanceDisplayMode =
-          BalanceDisplayMode.availableBalance}) async {
+      BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode.availableBalance,
+      ThemeBase? initialTheme}) async {
 
     final sharedPreferences = await getIt.getAsync<SharedPreferences>();
     final currentFiatCurrency = FiatCurrency.deserialize(raw:
@@ -294,12 +322,16 @@ abstract class SettingsStoreBase with Store {
     // FIX-ME: Check for which default value we should have here
     final shouldSaveRecipientAddress =
         sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? false;
+    final isAppSecure =
+        sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? false;
     final currentFiatApiMode = FiatApiMode.deserialize(
         raw: sharedPreferences
             .getInt(PreferencesKey.currentFiatApiModeKey) ?? FiatApiMode.enabled.raw);
     final allowBiometricalAuthentication = sharedPreferences
             .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ??
         false;
+    final shouldShowMarketPlaceInDashboard =
+        sharedPreferences.getBool(PreferencesKey.shouldShowMarketPlaceInDashboard) ?? true;
     final exchangeStatus = ExchangeApiMode.deserialize(
         raw: sharedPreferences
             .getInt(PreferencesKey.exchangeStatusKey) ?? ExchangeApiMode.enabled.raw);
@@ -307,7 +339,7 @@ abstract class SettingsStoreBase with Store {
         (sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy) ?? false)
             ? ThemeType.dark.index
             : ThemeType.bright.index;
-    final savedTheme = ThemeList.deserialize(
+    final savedTheme = initialTheme ?? ThemeList.deserialize(
         raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ??
             legacyTheme);
     final actionListDisplayMode = ObservableList<ActionListDisplayMode>();
@@ -319,7 +351,7 @@ abstract class SettingsStoreBase with Store {
     final pinCodeTimeOutDuration = timeOutDuration != null
         ? PinCodeRequiredDuration.deserialize(raw: timeOutDuration)
         : defaultPinCodeTimeOutDuration;
-    
+
     // If no value
     if (pinLength == null || pinLength == 0) {
       pinLength = defaultPinLength;
@@ -370,12 +402,14 @@ abstract class SettingsStoreBase with Store {
 
     return SettingsStore(
         sharedPreferences: sharedPreferences,
+        initialShouldShowMarketPlaceInDashboard: shouldShowMarketPlaceInDashboard,
         nodes: nodes,
         appVersion: packageInfo.version,
         isBitcoinBuyEnabled: isBitcoinBuyEnabled,
         initialFiatCurrency: currentFiatCurrency,
         initialBalanceDisplayMode: currentBalanceDisplayMode,
         initialSaveRecipientAddress: shouldSaveRecipientAddress,
+        initialAppSecure: isAppSecure,
         initialFiatMode: currentFiatApiMode,
         initialAllowBiometricalAuthentication: allowBiometricalAuthentication,
         initialExchangeStatus: exchangeStatus,
@@ -427,9 +461,14 @@ abstract class SettingsStoreBase with Store {
             .getInt(PreferencesKey.currentBalanceDisplayModeKey)!);
     shouldSaveRecipientAddress =
         sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? shouldSaveRecipientAddress;
+    isAppSecure =
+        sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? isAppSecure;
     allowBiometricalAuthentication = sharedPreferences
         .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ??
         allowBiometricalAuthentication;
+    shouldShowMarketPlaceInDashboard =
+        sharedPreferences.getBool(PreferencesKey.shouldShowMarketPlaceInDashboard) ??
+            shouldShowMarketPlaceInDashboard;
     exchangeStatus = ExchangeApiMode.deserialize(
         raw: sharedPreferences
             .getInt(PreferencesKey.exchangeStatusKey) ?? ExchangeApiMode.enabled.raw);
diff --git a/lib/utils/device_info.dart b/lib/utils/device_info.dart
new file mode 100644
index 000000000..144ea3fa4
--- /dev/null
+++ b/lib/utils/device_info.dart
@@ -0,0 +1,11 @@
+import 'dart:io';
+
+class DeviceInfo {
+  DeviceInfo._();
+
+  static DeviceInfo get instance => DeviceInfo._();
+
+  bool get isMobile => Platform.isAndroid || Platform.isIOS;
+  
+  bool get isDesktop => Platform.isMacOS || Platform.isWindows || Platform.isLinux;
+}
\ No newline at end of file
diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart
index 002534ea1..d3689e7e0 100644
--- a/lib/utils/exception_handler.dart
+++ b/lib/utils/exception_handler.dart
@@ -69,6 +69,7 @@ class ExceptionHandler {
   static void onError(FlutterErrorDetails errorDetails) async {
     if (kDebugMode) {
       FlutterError.presentError(errorDetails);
+      debugPrint(errorDetails.toString());
       return;
     }
 
diff --git a/lib/utils/request_review_handler.dart b/lib/utils/request_review_handler.dart
new file mode 100644
index 000000000..487a360bf
--- /dev/null
+++ b/lib/utils/request_review_handler.dart
@@ -0,0 +1,29 @@
+import 'package:cake_wallet/entities/preferences_key.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import 'package:in_app_review/in_app_review.dart';
+
+class RequestReviewHandler {
+  static const _coolDownDurationInDays = 30;
+
+  static void requestReview() async {
+    final sharedPrefs = await SharedPreferences.getInstance();
+
+    final lastReviewRequestDate =
+        DateTime.tryParse(sharedPrefs.getString(PreferencesKey.lastAppReviewDate) ?? '') ??
+            DateTime.now().subtract(Duration(days: _coolDownDurationInDays + 1));
+
+    final durationSinceLastRequest = DateTime.now().difference(lastReviewRequestDate).inDays;
+
+    if (durationSinceLastRequest < _coolDownDurationInDays) {
+      return;
+    }
+
+    sharedPrefs.setString(PreferencesKey.lastAppReviewDate, DateTime.now().toString());
+
+    final InAppReview inAppReview = InAppReview.instance;
+
+    if (await inAppReview.isAvailable()) {
+      inAppReview.requestReview();
+    }
+  }
+}
diff --git a/lib/utils/responsive_layout_util.dart b/lib/utils/responsive_layout_util.dart
new file mode 100644
index 000000000..8ae76ca21
--- /dev/null
+++ b/lib/utils/responsive_layout_util.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+
+class ResponsiveLayoutUtil {
+  static const double _kMobileThreshold = 900;
+  static const double kDesktopMaxWidthConstraint = 400;
+  static const double kPopupWidth = 400;
+  static const double kPopupSpaceHeight = 100;
+
+
+  const ResponsiveLayoutUtil._();
+
+  static final instance = ResponsiveLayoutUtil._();
+
+  bool isMobile(BuildContext context) {
+    final MediaQueryData mediaQueryData = MediaQuery.of(context);
+    return mediaQueryData.size.width < _kMobileThreshold;
+  }
+
+  /// Returns dynamic size.
+  ///
+  /// If screen size is mobile, it returns 66% ([scale]) of the [originalValue].
+  double getDynamicSize(
+    BuildContext context,
+    double originalValue, {
+    double? mobileSize,
+    double? scale,
+  }) {
+    scale ??= 2 / 3;
+    mobileSize ??= originalValue * scale;
+    final value = isMobile(context) ? mobileSize : originalValue;
+
+    return value.roundToDouble();
+  }
+}
diff --git a/lib/utils/show_pop_up.dart b/lib/utils/show_pop_up.dart
index 190b2a6d7..76114cc80 100644
--- a/lib/utils/show_pop_up.dart
+++ b/lib/utils/show_pop_up.dart
@@ -1,20 +1,23 @@
 import 'package:flutter/material.dart';
 
-Future<T?> showPopUp<T>({
-  required BuildContext context,
-  required WidgetBuilder builder,
-  bool barrierDismissible = true,
-  Color? barrierColor,
-  bool useSafeArea = false,
-  bool useRootNavigator = true,
-  RouteSettings? routeSettings
-}) {
-  return showDialog<T>(
-      context: context,
-      builder: builder,
-      barrierDismissible: barrierDismissible,
-      barrierColor: barrierColor,
-      useSafeArea: useSafeArea,
-      useRootNavigator: useRootNavigator,
-      routeSettings: routeSettings);
+Future<T?> showPopUp<T>(
+    {required BuildContext context,
+    required WidgetBuilder builder,
+    bool barrierDismissible = true,
+    Color? barrierColor,
+    bool useSafeArea = false,
+    bool useRootNavigator = true,
+    RouteSettings? routeSettings}) async {
+  if (context.mounted) {
+    return showDialog<T>(
+        context: context,
+        builder: builder,
+        barrierDismissible: barrierDismissible,
+        barrierColor: barrierColor,
+        useSafeArea: useSafeArea,
+        useRootNavigator: useRootNavigator,
+        routeSettings: routeSettings);
+  }
+
+  return null;
 }
diff --git a/lib/utils/version_comparator.dart b/lib/utils/version_comparator.dart
new file mode 100644
index 000000000..e0864568a
--- /dev/null
+++ b/lib/utils/version_comparator.dart
@@ -0,0 +1,13 @@
+class VersionComparator {
+  static bool isVersion1Greater({required String v1, required String v2}) {
+    int v1Number = getExtendedVersionNumber(v1);
+    int v2Number = getExtendedVersionNumber(v2);
+    return v1Number > v2Number;
+  }
+
+  static int getExtendedVersionNumber(String version) {
+    List<String> stringVersionCells = version.split('.');
+    List<int> intVersionCells = stringVersionCells.map((i) => int.parse(i)).toList();
+    return intVersionCells[0] * 100000 + intVersionCells[1] * 1000 + intVersionCells[2];
+  }
+}
diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart
index 7dff82924..c0ae5e764 100644
--- a/lib/view_model/dashboard/balance_view_model.dart
+++ b/lib/view_model/dashboard/balance_view_model.dart
@@ -19,14 +19,18 @@ class BalanceRecord {
   const BalanceRecord({
     required this.availableBalance,
     required this.additionalBalance,
+    required this.frozenBalance,
     required this.fiatAvailableBalance,
     required this.fiatAdditionalBalance,
+    required this.fiatFrozenBalance,
     required this.asset,
     required this.formattedAssetTitle});
   final String fiatAdditionalBalance;
   final String fiatAvailableBalance;
+  final String fiatFrozenBalance;
   final String additionalBalance;
   final String availableBalance;
+  final String frozenBalance;
   final CryptoCurrency asset;
   final String formattedAssetTitle;
 }
@@ -137,6 +141,32 @@ abstract class BalanceViewModelBase with Store {
     return walletBalance.formattedAvailableBalance;
   }
 
+  @computed
+  String get frozenBalance {
+    final walletBalance = _walletBalance;
+
+    if (displayMode == BalanceDisplayMode.hiddenBalance) {
+      return '---';
+    }
+
+    return getFormattedFrozenBalance(walletBalance);
+  }
+
+  @computed
+  String get frozenFiatBalance {
+    final walletBalance = _walletBalance;
+    final fiatCurrency = settingsStore.fiatCurrency;
+
+    if (displayMode == BalanceDisplayMode.hiddenBalance) {
+      return '---';
+    }
+
+    return  _getFiatBalance(
+        price: price,
+        cryptoAmount: getFormattedFrozenBalance(walletBalance)) + ' ' + fiatCurrency.toString();
+
+  }
+
   @computed
   String get additionalBalance {
     final walletBalance = _walletBalance;
@@ -160,7 +190,7 @@ abstract class BalanceViewModelBase with Store {
     return  _getFiatBalance(
             price: price,
             cryptoAmount: walletBalance.formattedAvailableBalance) + ' ' + fiatCurrency.toString();
-       
+
   }
 
   @computed
@@ -175,7 +205,7 @@ abstract class BalanceViewModelBase with Store {
     return   _getFiatBalance(
             price: price,
             cryptoAmount: walletBalance.formattedAdditionalBalance) + ' ' + fiatCurrency.toString();
-       
+
   }
 
   @computed
@@ -185,8 +215,10 @@ abstract class BalanceViewModelBase with Store {
         return MapEntry(key, BalanceRecord(
           availableBalance: '---',
           additionalBalance: '---',
+          frozenBalance: '---',
           fiatAdditionalBalance: isFiatDisabled ? '' : '---',
           fiatAvailableBalance: isFiatDisabled ? '' : '---',
+          fiatFrozenBalance: isFiatDisabled ? '' : '---',
           asset: key,
           formattedAssetTitle: _formatterAsset(key)));
       }
@@ -209,13 +241,25 @@ abstract class BalanceViewModelBase with Store {
             price: price,
             cryptoAmount: value.formattedAvailableBalance));
 
-      return MapEntry(key, BalanceRecord(
-        availableBalance: value.formattedAvailableBalance,
-        additionalBalance: value.formattedAdditionalBalance,
-        fiatAdditionalBalance: additionalFiatBalance,
-        fiatAvailableBalance: availableFiatBalance,
-        asset: key,
-        formattedAssetTitle: _formatterAsset(key)));
+
+      final frozenFiatBalance = isFiatDisabled ? '' : (fiatCurrency.toString()
+          + ' '
+          + _getFiatBalance(
+              price: price,
+              cryptoAmount: getFormattedFrozenBalance(value)));
+
+
+      return MapEntry(
+          key,
+          BalanceRecord(
+              availableBalance: value.formattedAvailableBalance,
+              additionalBalance: value.formattedAdditionalBalance,
+              frozenBalance: getFormattedFrozenBalance(value),
+              fiatAdditionalBalance: additionalFiatBalance,
+              fiatAvailableBalance: availableFiatBalance,
+              fiatFrozenBalance: frozenFiatBalance,
+              asset: key,
+              formattedAssetTitle: _formatterAsset(key)));
       });
   }
 
@@ -292,7 +336,7 @@ abstract class BalanceViewModelBase with Store {
   }
 
   String _getFiatBalance({required double price, String? cryptoAmount}) {
-    if (cryptoAmount == null) {
+    if (cryptoAmount == null || cryptoAmount.isEmpty) {
       return '0.00';
     }
 
@@ -308,10 +352,12 @@ abstract class BalanceViewModelBase with Store {
           return assetStringified.replaceFirst('X', 'x');
         }
 
-        return asset.toString(); 
+        return asset.toString();
       default:
         return asset.toString();
     }
   }
+
+  String getFormattedFrozenBalance(Balance walletBalance) => walletBalance.formattedFrozenBalance;
 }
 
diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart
index 5384ee743..c28603a51 100644
--- a/lib/view_model/dashboard/dashboard_view_model.dart
+++ b/lib/view_model/dashboard/dashboard_view_model.dart
@@ -1,13 +1,9 @@
 import 'package:cake_wallet/entities/exchange_api_mode.dart';
-import 'package:cake_wallet/entities/fiat_api_mode.dart';
 import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
 import 'package:cake_wallet/view_model/dashboard/anonpay_transaction_list_item.dart';
 import 'package:cake_wallet/wallet_type_utils.dart';
 import 'package:cw_core/transaction_history.dart';
 import 'package:cw_core/balance.dart';
-import 'package:cake_wallet/buy/order.dart';
-import 'package:cake_wallet/entities/transaction_history.dart';
-import 'package:cake_wallet/exchange/trade_state.dart';
 import 'package:cake_wallet/entities/balance_display_mode.dart';
 import 'package:cw_core/transaction_info.dart';
 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
@@ -21,10 +17,6 @@ import 'package:cake_wallet/view_model/dashboard/order_list_item.dart';
 import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
 import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
 import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
-import 'package:cake_wallet/view_model/dashboard/action_list_display_mode.dart';
-import 'package:crypto/crypto.dart';
-import 'package:flutter/services.dart';
-import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cw_core/wallet_base.dart';
 import 'package:cw_core/sync_status.dart';
@@ -51,8 +43,7 @@ abstract class DashboardViewModelBase with Store {
       required this.settingsStore,
       required this.yatStore,
       required this.ordersStore,
-      required this.anonpayTransactionsStore,
-      })
+      required this.anonpayTransactionsStore})
   : isOutdatedElectrumWallet = false,
     hasSellAction = false,
     isEnabledSellAction = false,
@@ -154,7 +145,7 @@ abstract class DashboardViewModelBase with Store {
     }
 
     reaction((_) => appStore.wallet, _onWalletChange);
-
+    
     connectMapToListWithTransform(
         appStore.wallet!.transactionHistory.transactions,
         transactions,
@@ -221,6 +212,11 @@ abstract class DashboardViewModelBase with Store {
   @computed
   BalanceDisplayMode get balanceDisplayMode =>
       appStore.settingsStore.balanceDisplayMode;
+    
+  @computed
+  bool get shouldShowMarketPlaceInDashboard {
+    return appStore.settingsStore.shouldShowMarketPlaceInDashboard;
+  }
 
   @computed
   List<TradeListItem> get trades => tradesStore.trades
diff --git a/lib/view_model/dashboard/desktop_sidebar_view_model.dart b/lib/view_model/dashboard/desktop_sidebar_view_model.dart
new file mode 100644
index 000000000..d0320c05f
--- /dev/null
+++ b/lib/view_model/dashboard/desktop_sidebar_view_model.dart
@@ -0,0 +1,34 @@
+import 'package:mobx/mobx.dart';
+
+part 'desktop_sidebar_view_model.g.dart';
+
+enum SidebarItem {
+  dashboard,
+  support,
+  settings,
+  transactions;
+}
+
+class DesktopSidebarViewModel = DesktopSidebarViewModelBase with _$DesktopSidebarViewModel;
+
+abstract class DesktopSidebarViewModelBase with Store {
+  DesktopSidebarViewModelBase();
+
+  @observable
+  SidebarItem currentPage = SidebarItem.dashboard;
+
+  @action
+  void onPageChange(SidebarItem item) {
+    if (currentPage == item) {
+      resetSidebar();
+
+      return;
+    }
+    currentPage = item;
+  }
+
+  @action
+  void resetSidebar() {
+    currentPage = SidebarItem.dashboard;
+  }
+}
diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart
index 94c874979..194dc9d45 100644
--- a/lib/view_model/exchange/exchange_trade_view_model.dart
+++ b/lib/view_model/exchange/exchange_trade_view_model.dart
@@ -140,7 +140,7 @@ abstract class ExchangeTradeViewModelBase with Store {
     }
 
     items.addAll([
-      ExchangeTradeItem(title: S.current.amount, data: '${trade.amount}', isCopied: false),
+      ExchangeTradeItem(title: S.current.amount, data: '${trade.amount}', isCopied: true),
       ExchangeTradeItem(
           title: S.current.send_to_this_address('${trade.from}', tagFrom) + ':',
           data: trade.inputAddress ?? '',
diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart
index f5e54f24c..9c10a74e9 100644
--- a/lib/view_model/exchange/exchange_view_model.dart
+++ b/lib/view_model/exchange/exchange_view_model.dart
@@ -198,6 +198,9 @@ abstract class ExchangeViewModelBase with Store {
   @observable
   bool isFixedRateMode;
 
+  @observable
+  Limits limits;
+
   @computed
   SyncStatus get status => wallet.syncStatus;
 
@@ -241,8 +244,6 @@ abstract class ExchangeViewModelBase with Store {
 
   List<CryptoCurrency> depositCurrencies;
 
-  Limits limits;
-
   NumberFormat _cryptoNumberFormat;
 
   final SettingsStore _settingsStore;
@@ -320,6 +321,22 @@ abstract class ExchangeViewModelBase with Store {
         .replaceAll(RegExp('\\,'), '');
   }
 
+  bool checkIfInputMeetsMinOrMaxCondition(String input) {
+    final _enteredAmount = double.tryParse(input.replaceAll(',', '.')) ?? 0;
+    double minLimit = limits.min ?? 0;
+    double? maxLimit = limits.max;
+
+    if (_enteredAmount < minLimit) {
+      return false;
+    }
+
+    if (maxLimit != null && _enteredAmount > maxLimit) {
+      return false;
+    }
+
+    return true;
+  }
+
   Future<void> _calculateBestRate() async {
     final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1;
 
diff --git a/lib/view_model/node_list/node_create_or_edit_view_model.dart b/lib/view_model/node_list/node_create_or_edit_view_model.dart
index 5b94aaf6d..5d84a27df 100644
--- a/lib/view_model/node_list/node_create_or_edit_view_model.dart
+++ b/lib/view_model/node_list/node_create_or_edit_view_model.dart
@@ -4,13 +4,11 @@ import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cw_core/node.dart';
 import 'package:cw_core/wallet_type.dart';
-
-import 'node_list_view_model.dart';
+import 'package:collection/collection.dart';
 
 part 'node_create_or_edit_view_model.g.dart';
 
-class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase
-    with _$NodeCreateOrEditViewModel;
+class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase with _$NodeCreateOrEditViewModel;
 
 abstract class NodeCreateOrEditViewModelBase with Store {
   NodeCreateOrEditViewModelBase(this._nodeSource, this._walletType, this._settingsStore)
@@ -48,11 +46,10 @@ abstract class NodeCreateOrEditViewModelBase with Store {
   bool trusted;
 
   @computed
-  bool get isReady =>
-      address.isNotEmpty && port.isNotEmpty;
+  bool get isReady => address.isNotEmpty && port.isNotEmpty;
 
-  bool get hasAuthCredentials => _walletType == WalletType.monero ||
-    _walletType == WalletType.haven;
+  bool get hasAuthCredentials =>
+      _walletType == WalletType.monero || _walletType == WalletType.haven;
 
   String get uri {
     var uri = address;
@@ -79,22 +76,22 @@ abstract class NodeCreateOrEditViewModelBase with Store {
   }
 
   @action
-  void setPort (String val) => port = val;
+  void setPort(String val) => port = val;
 
   @action
-  void setAddress (String val) => address = val;
+  void setAddress(String val) => address = val;
 
   @action
-  void setLogin (String val) => login = val;
+  void setLogin(String val) => login = val;
 
   @action
-  void setPassword (String val) => password = val;
+  void setPassword(String val) => password = val;
 
   @action
-  void setSSL (bool val) => useSSL = val;
+  void setSSL(bool val) => useSSL = val;
 
   @action
-  void setTrusted (bool val) => trusted = val;
+  void setTrusted(bool val) => trusted = val;
 
   @action
   Future<void> save({Node? editingNode, bool saveAsCurrent = false}) async {
@@ -109,11 +106,14 @@ abstract class NodeCreateOrEditViewModelBase with Store {
       state = IsExecutingState();
       if (editingNode != null) {
         await _nodeSource.put(editingNode.key, node);
+      } else if (_existingNode(node) != null) {
+        setAsCurrent(_existingNode(node)!);
       } else {
         await _nodeSource.add(node);
+        setAsCurrent(_nodeSource.values.last);
       }
       if (saveAsCurrent) {
-        _settingsStore.nodes[_walletType] = node;
+        setAsCurrent(node);
       }
 
       state = ExecutedSuccessfullyState();
@@ -124,14 +124,32 @@ abstract class NodeCreateOrEditViewModelBase with Store {
 
   @action
   Future<void> connect() async {
+    final node = Node(
+        uri: uri,
+        type: _walletType,
+        login: login,
+        password: password,
+        useSSL: useSSL,
+        trusted: trusted);
     try {
       connectionState = IsExecutingState();
-      final node =
-        Node(uri: uri, type: _walletType, login: login, password: password);
       final isAlive = await node.requestNode();
       connectionState = ExecutedSuccessfullyState(payload: isAlive);
     } catch (e) {
       connectionState = FailureState(e.toString());
     }
   }
+
+  Node? _existingNode(Node node) {
+    final nodes = _nodeSource.values.toList();
+    nodes.forEach((item) {
+      item.login ??= '';
+      item.password ??= '';
+      item.useSSL ??= false;
+    });
+    return nodes.firstWhereOrNull((item) => item == node);
+  }
+
+  @action
+  void setAsCurrent(Node node) => _settingsStore.nodes[_walletType] = node;
 }
diff --git a/lib/view_model/node_list/node_list_view_model.dart b/lib/view_model/node_list/node_list_view_model.dart
index deb1f29cf..3663d48ac 100644
--- a/lib/view_model/node_list/node_list_view_model.dart
+++ b/lib/view_model/node_list/node_list_view_model.dart
@@ -1,4 +1,6 @@
 import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/store/app_store.dart';
+import 'package:cake_wallet/utils/mobx.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cw_core/wallet_base.dart';
@@ -7,25 +9,28 @@ import 'package:cw_core/node.dart';
 import 'package:cake_wallet/entities/node_list.dart';
 import 'package:cake_wallet/entities/default_settings_migration.dart';
 import 'package:cw_core/wallet_type.dart';
-import 'package:cake_wallet/utils/mobx.dart';
 
 part 'node_list_view_model.g.dart';
 
 class NodeListViewModel = NodeListViewModelBase with _$NodeListViewModel;
 
 abstract class NodeListViewModelBase with Store {
-  NodeListViewModelBase(this._nodeSource, this.wallet, this.settingsStore)
-      : nodes = ObservableList<Node>() {
-    _nodeSource.bindToList(nodes,
-        filter: (Node val) => val?.type == wallet.type, initialFire: true);
+  NodeListViewModelBase(this._nodeSource, this._appStore)
+      : nodes = ObservableList<Node>(),
+        settingsStore = _appStore.settingsStore {
+    _bindNodes();
+
+    reaction((_) => _appStore.wallet, (WalletBase? _wallet) {
+      _bindNodes();
+    });
   }
 
   @computed
   Node get currentNode {
-    final node = settingsStore.nodes[wallet.type];
+    final node = settingsStore.nodes[_appStore.wallet!.type];
 
     if (node == null) {
-      throw Exception('No node for wallet type: ${wallet.type}');
+      throw Exception('No node for wallet type: ${_appStore.wallet!.type}');
     }
 
     return node;
@@ -33,19 +38,19 @@ abstract class NodeListViewModelBase with Store {
 
   String getAlertContent(String uri) =>
       S.current.change_current_node(uri) +
-          '${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}';
+      '${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}';
 
   final ObservableList<Node> nodes;
   final SettingsStore settingsStore;
-  final WalletBase wallet;
   final Box<Node> _nodeSource;
+  final AppStore _appStore;
 
   Future<void> reset() async {
     await resetToDefault(_nodeSource);
 
     Node node;
 
-    switch (wallet.type) {
+    switch (_appStore.wallet!.type) {
       case WalletType.bitcoin:
         node = getBitcoinDefaultElectrumServer(nodes: _nodeSource)!;
         break;
@@ -59,7 +64,7 @@ abstract class NodeListViewModelBase with Store {
         node = getHavenDefaultNode(nodes: _nodeSource)!;
         break;
       default:
-        throw Exception('Unexpected wallet type: ${wallet.type}');
+        throw Exception('Unexpected wallet type: ${_appStore.wallet!.type}');
     }
 
     await setAsCurrent(node);
@@ -68,6 +73,15 @@ abstract class NodeListViewModelBase with Store {
   @action
   Future<void> delete(Node node) async => node.delete();
 
-  Future<void> setAsCurrent(Node node) async =>
-      settingsStore.nodes[wallet.type] = node;
+  Future<void> setAsCurrent(Node node) async => settingsStore.nodes[_appStore.wallet!.type] = node;
+
+  @action
+  void _bindNodes() {
+    nodes.clear();
+    _nodeSource.bindToList(
+      nodes,
+      filter: (val) => val.type == _appStore.wallet!.type,
+      initialFire: true,
+    );
+  }
 }
diff --git a/lib/view_model/restore/restore_from_qr_vm.dart b/lib/view_model/restore/restore_from_qr_vm.dart
new file mode 100644
index 000000000..7efb92e69
--- /dev/null
+++ b/lib/view_model/restore/restore_from_qr_vm.dart
@@ -0,0 +1,106 @@
+import 'package:cake_wallet/bitcoin/bitcoin.dart';
+import 'package:cake_wallet/view_model/restore/restore_mode.dart';
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
+import 'package:hive/hive.dart';
+import 'package:mobx/mobx.dart';
+import 'package:cake_wallet/monero/monero.dart';
+import 'package:cake_wallet/store/app_store.dart';
+import 'package:cw_core/wallet_base.dart';
+import 'package:cake_wallet/core/generate_wallet_password.dart';
+import 'package:cake_wallet/core/wallet_creation_service.dart';
+import 'package:cw_core/wallet_credentials.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
+import 'package:cw_core/wallet_info.dart';
+
+part 'restore_from_qr_vm.g.dart';
+
+class WalletRestorationFromQRVM = WalletRestorationFromQRVMBase with _$WalletRestorationFromQRVM;
+
+abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store {
+  WalletRestorationFromQRVMBase(AppStore appStore, WalletCreationService walletCreationService,
+      Box<WalletInfo> walletInfoSource, WalletType type)
+      : height = 0,
+        viewKey = '',
+        spendKey = '',
+        wif = '',
+        address = '',
+        super(appStore, walletInfoSource, walletCreationService,
+            type: type, isRecovery: true);
+
+  @observable
+  int height;
+
+  @observable
+  String viewKey;
+
+  @observable
+  String spendKey;
+
+  @observable
+  String wif;
+
+  @observable
+  String address;
+
+  bool get hasRestorationHeight => type == WalletType.monero;
+
+  @override
+  WalletCredentials getCredentialsFromRestoredWallet(dynamic options, RestoredWallet restoreWallet) {
+    final password = generateWalletPassword();
+
+    switch (restoreWallet.restoreMode) {
+      case WalletRestoreMode.keys:
+        switch (restoreWallet.type) {
+          case WalletType.monero:
+            return monero!.createMoneroRestoreWalletFromKeysCredentials(
+                name: name,
+                password: password,
+                language: 'English',
+                address: restoreWallet.address ?? '',
+                viewKey: restoreWallet.viewKey ?? '',
+                spendKey: restoreWallet.spendKey ?? '',
+                height: restoreWallet.height ?? 0);
+          case WalletType.bitcoin:
+          case WalletType.litecoin:
+            return bitcoin!.createBitcoinRestoreWalletFromWIFCredentials(
+                name: name, password: password, wif: wif);
+          default:
+            throw Exception('Unexpected type: ${restoreWallet.type.toString()}');
+        }
+      case WalletRestoreMode.seed:
+        switch (restoreWallet.type) {
+          case WalletType.monero:
+            return monero!.createMoneroRestoreWalletFromSeedCredentials(
+                name: name,
+                height: restoreWallet.height ?? 0,
+                mnemonic: restoreWallet.mnemonicSeed ?? '',
+                password: password);
+          case WalletType.bitcoin:
+          case WalletType.litecoin:
+            return bitcoin!.createBitcoinRestoreWalletFromSeedCredentials(
+                name: name, mnemonic: restoreWallet.mnemonicSeed ?? '', password: password);
+          default:
+            throw Exception('Unexpected type: ${type.toString()}');
+        }
+      default:
+        throw Exception('Unexpected type: ${type.toString()}');
+    }
+  }
+
+  @override
+  Future<WalletBase> processFromRestoredWallet(WalletCredentials credentials, RestoredWallet restoreWallet) async {
+    try {
+      switch (restoreWallet.restoreMode) {
+        case WalletRestoreMode.keys:
+          return walletCreationService.restoreFromKeys(credentials);
+        case WalletRestoreMode.seed:
+          return walletCreationService.restoreFromSeed(credentials);
+        default:
+          throw Exception('Unexpected restore mode: ${restoreWallet.restoreMode.toString()}');
+      }
+    } catch (e) {
+      throw Exception('Unexpected restore mode: ${e.toString()}');
+    }
+  }
+}
diff --git a/lib/view_model/restore/restore_mode.dart b/lib/view_model/restore/restore_mode.dart
new file mode 100644
index 000000000..d8344841d
--- /dev/null
+++ b/lib/view_model/restore/restore_mode.dart
@@ -0,0 +1 @@
+enum WalletRestoreMode { seed, keys, txids }
\ No newline at end of file
diff --git a/lib/view_model/restore/restore_wallet.dart b/lib/view_model/restore/restore_wallet.dart
new file mode 100644
index 000000000..0f872d8cc
--- /dev/null
+++ b/lib/view_model/restore/restore_wallet.dart
@@ -0,0 +1,66 @@
+import 'package:cake_wallet/view_model/restore/restore_mode.dart';
+import 'package:cw_core/wallet_type.dart';
+
+class RestoredWallet {
+  RestoredWallet(
+      {required this.restoreMode,
+      required this.type,
+      required this.address,
+      this.txId,
+      this.spendKey,
+      this.viewKey,
+      this.mnemonicSeed,
+      this.txAmount,
+      this.txDescription,
+      this.recipientName,
+      this.height});
+
+  final WalletRestoreMode restoreMode;
+  final WalletType type;
+  final String? address;
+  final String? txId;
+  final String? spendKey;
+  final String? viewKey;
+  final String? mnemonicSeed;
+  final String? txAmount;
+  final String? txDescription;
+  final String? recipientName;
+  final int? height;
+
+  factory RestoredWallet.fromKey(Map<String, dynamic> json) {
+    final height = json['height'] as String?;
+    return RestoredWallet(
+      restoreMode: json['mode'] as WalletRestoreMode,
+      type: json['type'] as WalletType,
+      address: json['address'] as String?,
+      spendKey: json['spend_key'] as String?,
+      viewKey: json['view_key'] as String?,
+      height: height != null ? int.parse(height) : 0,
+    );
+  }
+
+  factory RestoredWallet.fromSeed(Map<String, dynamic> json) {
+    final height = json['height'] as String?;
+    final mnemonic_seed = json['mnemonic_seed'] as String?;
+    final seed = json['seed'] as String?;
+    return RestoredWallet(
+      restoreMode: json['mode'] as WalletRestoreMode,
+      type: json['type'] as WalletType,
+      address: json['address'] as String?,
+      mnemonicSeed: mnemonic_seed ?? seed,
+      height: height != null ? int.parse(height) : 0,
+    );
+  }
+
+  factory RestoredWallet.fromTxIds(Map<String, dynamic> json) {
+    return RestoredWallet(
+      restoreMode: json['mode'] as WalletRestoreMode,
+      type: json['type'] as WalletType,
+      address: json['address'] as String?,
+      txId: json['tx_payment_id'] as String,
+      txAmount: json['tx_amount'] as String,
+      txDescription: json['tx_description'] as String?,
+      recipientName: json['recipient_name'] as String?,
+    );
+  }
+}
diff --git a/lib/view_model/restore/wallet_restore_from_qr_code.dart b/lib/view_model/restore/wallet_restore_from_qr_code.dart
new file mode 100644
index 000000000..9ebf01429
--- /dev/null
+++ b/lib/view_model/restore/wallet_restore_from_qr_code.dart
@@ -0,0 +1,156 @@
+import 'package:cake_wallet/core/seed_validator.dart';
+import 'package:cake_wallet/entities/parse_address_from_domain.dart';
+import 'package:cake_wallet/entities/qr_scanner.dart';
+import 'package:cake_wallet/view_model/restore/restore_mode.dart';
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
+import 'package:cw_core/wallet_type.dart';
+import 'package:flutter/cupertino.dart';
+
+class WalletRestoreFromQRCode {
+  WalletRestoreFromQRCode();
+
+  static Future<RestoredWallet> scanQRCodeForRestoring(BuildContext context) async {
+    String code = await presentQRScanner();
+    Map<String, dynamic> credentials = {};
+
+    if (code.isEmpty) {
+      throw Exception('Unexpected scan QR code value: value is empty');
+    }
+    final formattedUri = getFormattedUri(code);
+    final uri = Uri.parse(formattedUri);
+    final queryParameters = uri.queryParameters;
+    credentials['type'] = getWalletTypeFromUrl(uri.scheme);
+
+    final address = getAddressFromUrl(
+      type: credentials['type'] as WalletType,
+      rawString: queryParameters.toString(),
+    );
+    if (address != null) {
+      credentials['address'] = address;
+    }
+
+    final seed =
+        getSeedPhraseFromUrl(queryParameters.toString(), credentials['type'] as WalletType);
+    if (seed != null) {
+      credentials['seed'] = seed;
+    }
+    credentials.addAll(queryParameters);
+    credentials['mode'] = getWalletRestoreMode(credentials);
+
+    switch (credentials['mode']) {
+      case WalletRestoreMode.txids:
+        return RestoredWallet.fromTxIds(credentials);
+      case WalletRestoreMode.seed:
+        return RestoredWallet.fromSeed(credentials);
+      case WalletRestoreMode.keys:
+        return RestoredWallet.fromKey(credentials);
+      default:
+        throw Exception('Unexpected restore mode: ${credentials['mode']}');
+    }
+  }
+
+  static String getFormattedUri(String code) {
+    final index = code.indexOf(':');
+    final scheme = code.substring(0, index).replaceAll('_', '-');
+    final query = code.substring(index + 1).replaceAll('?', '&');
+    final formattedUri = '$scheme:?$query';
+    return formattedUri;
+  }
+
+  static WalletType getWalletTypeFromUrl(String scheme) {
+    switch (scheme) {
+      case 'monero':
+      case 'monero-wallet':
+        return WalletType.monero;
+      case 'bitcoin':
+      case 'bitcoin-wallet':
+        return WalletType.bitcoin;
+      case 'litecoin':
+      case 'litecoin-wallet':
+        return WalletType.litecoin;
+      default:
+        throw Exception('Unexpected wallet type: ${scheme.toString()}');
+    }
+  }
+
+  static String? getAddressFromUrl({required WalletType type, required String rawString}) {
+    return AddressResolver.extractAddressByType(
+        raw: rawString, type: walletTypeToCryptoCurrency(type));
+  }
+
+  static String? getSeedPhraseFromUrl(String rawString, WalletType walletType) {
+    switch (walletType) {
+      case WalletType.monero:
+        RegExp regex25 = RegExp(r'\b(\S+\b\s+){24}\S+\b');
+        RegExp regex14 = RegExp(r'\b(\S+\b\s+){13}\S+\b');
+        RegExp regex13 = RegExp(r'\b(\S+\b\s+){12}\S+\b');
+
+        if (regex25.firstMatch(rawString) == null) {
+          if (regex14.firstMatch(rawString) == null) {
+            if (regex13.firstMatch(rawString) == null) {
+              return null;
+            } else {
+              return regex13.firstMatch(rawString)!.group(0)!;
+            }
+          } else {
+            return regex14.firstMatch(rawString)!.group(0)!;
+          }
+        } else {
+          return regex25.firstMatch(rawString)!.group(0)!;
+        }
+      case WalletType.bitcoin:
+      case WalletType.litecoin:
+        RegExp regex24 = RegExp(r'\b(\S+\b\s+){23}\S+\b');
+        RegExp regex18 = RegExp(r'\b(\S+\b\s+){17}\S+\b');
+        RegExp regex12 = RegExp(r'\b(\S+\b\s+){11}\S+\b');
+
+        if (regex24.firstMatch(rawString) == null) {
+          if (regex18.firstMatch(rawString) == null) {
+            if (regex12.firstMatch(rawString) == null) {
+              return null;
+            } else {
+              return regex12.firstMatch(rawString)!.group(0)!;
+            }
+          } else {
+            return regex18.firstMatch(rawString)!.group(0)!;
+          }
+        } else {
+          return regex24.firstMatch(rawString)!.group(0)!;
+        }
+      default:
+        return null;
+    }
+  }
+
+  static WalletRestoreMode getWalletRestoreMode(Map<String, dynamic> credentials) {
+    final type = credentials['type'] as WalletType;
+    if (credentials.containsKey('tx_payment_id')) {
+      final txIdValue = credentials['tx_payment_id'] as String? ?? '';
+      return txIdValue.isNotEmpty
+          ? WalletRestoreMode.txids
+          : throw Exception('Unexpected restore mode: tx_payment_id is invalid');
+    }
+
+    if (credentials.containsKey('seed')) {
+      final seedValue = credentials['seed'] as String;
+      final words = SeedValidator.getWordList(type: type, language: 'english');
+      seedValue.split(' ').forEach((element) {
+        if (!words.contains(element)) {
+          throw Exception('Unexpected restore mode: mnemonic_seed is invalid');
+        }
+      });
+      return WalletRestoreMode.seed;
+    }
+
+    if (credentials.containsKey('spend_key') || credentials.containsKey('view_key')) {
+      final spendKeyValue = credentials['spend_key'] as String? ?? '';
+      final viewKeyValue = credentials['view_key'] as String? ?? '';
+
+      return spendKeyValue.isNotEmpty || viewKeyValue.isNotEmpty
+          ? WalletRestoreMode.keys
+          : throw Exception('Unexpected restore mode: spend_key or view_key is invalid');
+    }
+
+    throw Exception('Unexpected restore mode: restore params are invalid');
+  }
+}
diff --git a/lib/view_model/settings/display_settings_view_model.dart b/lib/view_model/settings/display_settings_view_model.dart
index bac6d9994..69d82eff4 100644
--- a/lib/view_model/settings/display_settings_view_model.dart
+++ b/lib/view_model/settings/display_settings_view_model.dart
@@ -28,6 +28,9 @@ abstract class DisplaySettingsViewModelBase with Store {
   @computed
   bool get shouldDisplayBalance => balanceDisplayMode == BalanceDisplayMode.displayableBalance;
 
+  @computed
+  bool get shouldShowMarketPlaceInDashboard => _settingsStore.shouldShowMarketPlaceInDashboard;
+
   @computed
   ThemeBase get theme => _settingsStore.currentTheme;
 
@@ -58,4 +61,9 @@ abstract class DisplaySettingsViewModelBase with Store {
 
   @action
   void setFiatCurrency(FiatCurrency value) => _settingsStore.fiatCurrency = value;
+
+  @action
+  void setShouldShowMarketPlaceInDashbaord(bool value) {
+    _settingsStore.shouldShowMarketPlaceInDashboard = value;
+  }
 }
diff --git a/lib/view_model/settings/privacy_settings_view_model.dart b/lib/view_model/settings/privacy_settings_view_model.dart
index 110afb07a..91ddd2f34 100644
--- a/lib/view_model/settings/privacy_settings_view_model.dart
+++ b/lib/view_model/settings/privacy_settings_view_model.dart
@@ -21,6 +21,9 @@ abstract class PrivacySettingsViewModelBase with Store {
   @computed
   FiatApiMode get fiatApiMode => _settingsStore.fiatApiMode;
 
+  @computed
+  bool get isAppSecure => _settingsStore.isAppSecure;
+
   @action
   void setShouldSaveRecipientAddress(bool value) => _settingsStore.shouldSaveRecipientAddress = value;
 
@@ -30,4 +33,7 @@ abstract class PrivacySettingsViewModelBase with Store {
   @action
   void setFiatMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode;
 
+  @action
+  void setIsAppSecure(bool value) => _settingsStore.isAppSecure = value;
+
 }
diff --git a/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart
index ed8687c87..098296036 100644
--- a/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart
+++ b/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/src/screens/transaction_details/blockexplorer_list_item.dart';
 import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
 import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart';
 import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
@@ -5,7 +6,9 @@ import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
 import 'package:cake_wallet/generated/i18n.dart';
 import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
 import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart';
+import 'package:cw_core/wallet_type.dart';
 import 'package:mobx/mobx.dart';
+import 'package:url_launcher/url_launcher.dart';
 
 part 'unspent_coins_details_view_model.g.dart';
 
@@ -13,21 +16,14 @@ class UnspentCoinsDetailsViewModel = UnspentCoinsDetailsViewModelBase
     with _$UnspentCoinsDetailsViewModel;
 
 abstract class UnspentCoinsDetailsViewModelBase with Store {
-  UnspentCoinsDetailsViewModelBase({
-    required this.unspentCoinsItem,
-    required this.unspentCoinsListViewModel})
+  UnspentCoinsDetailsViewModelBase(
+      {required this.unspentCoinsItem, required this.unspentCoinsListViewModel})
       : items = <TransactionDetailsListItem>[],
         isFrozen = unspentCoinsItem.isFrozen,
         note = unspentCoinsItem.note {
     items = [
-      StandartListItem(
-        title: S.current.transaction_details_amount,
-        value: unspentCoinsItem.amount
-      ),
-      StandartListItem(
-        title: S.current.widgets_address,
-        value: unspentCoinsItem.address
-      ),
+      StandartListItem(title: S.current.transaction_details_amount, value: unspentCoinsItem.amount),
+      StandartListItem(title: S.current.widgets_address, value: unspentCoinsItem.address),
       TextFieldListItem(
           title: S.current.note_tap_to_change,
           value: note,
@@ -36,21 +32,53 @@ abstract class UnspentCoinsDetailsViewModelBase with Store {
             unspentCoinsListViewModel.saveUnspentCoinInfo(unspentCoinsItem);
           }),
       UnspentCoinsSwitchItem(
-        title: S.current.freeze,
-        value: '',
-        switchValue: () => isFrozen,
-        onSwitchValueChange: (value) async {
-          isFrozen = value;
-          unspentCoinsItem.isFrozen = value;
-          if (value) {
-            unspentCoinsItem.isSending = !value;
-          }
-          await unspentCoinsListViewModel.saveUnspentCoinInfo(unspentCoinsItem);
-        }
-      )
+          title: S.current.freeze,
+          value: '',
+          switchValue: () => isFrozen,
+          onSwitchValueChange: (value) async {
+            isFrozen = value;
+            unspentCoinsItem.isFrozen = value;
+            if (value) {
+              unspentCoinsItem.isSending = !value;
+            }
+            await unspentCoinsListViewModel.saveUnspentCoinInfo(unspentCoinsItem);
+          }),
+      BlockExplorerListItem(
+          title: S.current.view_in_block_explorer,
+          value: _explorerDescription(unspentCoinsListViewModel.wallet.type),
+          onTap: () {
+            try {
+              final url = Uri.parse(
+                  _explorerUrl(unspentCoinsListViewModel.wallet.type, unspentCoinsItem.hash));
+              return launchUrl(url);
+            } catch (e) {}
+
+          })
     ];
   }
 
+  String _explorerUrl(WalletType type, String txId) {
+    switch (type) {
+      case WalletType.bitcoin:
+        return 'https://ordinals.com/tx/${txId}';
+      case WalletType.litecoin:
+        return 'https://litecoin.earlyordies.com/tx/${txId}';
+      default:
+        return '';
+    }
+  }
+
+  String _explorerDescription(WalletType type) {
+    switch (type) {
+      case WalletType.bitcoin:
+        return S.current.view_transaction_on + 'Ordinals.com';
+      case WalletType.litecoin:
+        return S.current.view_transaction_on + 'Earlyordies.com';
+      default:
+        return '';
+    }
+  }
+
   @observable
   bool isFrozen;
 
@@ -60,4 +88,4 @@ abstract class UnspentCoinsDetailsViewModelBase with Store {
   final UnspentCoinsItem unspentCoinsItem;
   final UnspentCoinsListViewModel unspentCoinsListViewModel;
   List<TransactionDetailsListItem> items;
-}
\ No newline at end of file
+}
diff --git a/lib/view_model/unspent_coins/unspent_coins_item.dart b/lib/view_model/unspent_coins/unspent_coins_item.dart
index c6b9eb375..2f0d75571 100644
--- a/lib/view_model/unspent_coins/unspent_coins_item.dart
+++ b/lib/view_model/unspent_coins/unspent_coins_item.dart
@@ -11,7 +11,9 @@ abstract class UnspentCoinsItemBase with Store {
     required this.hash,
     required this.isFrozen,
     required this.note,
-    required this.isSending});
+    required this.isSending,
+    required this.amountRaw,
+    required this.vout});
 
   @observable
   String address;
@@ -30,4 +32,10 @@ abstract class UnspentCoinsItemBase with Store {
 
   @observable
   bool isSending;
+
+  @observable
+  int amountRaw;
+
+  @observable
+  int vout;
 }
\ No newline at end of file
diff --git a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart
index dbd43fdac..4df4b9a66 100644
--- a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart
+++ b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart
@@ -1,60 +1,81 @@
-//import 'package:cw_bitcoin/bitcoin_amount_format.dart';
-//import 'package:cw_bitcoin/electrum_wallet.dart';
 import 'package:cw_core/unspent_coins_info.dart';
 import 'package:cake_wallet/bitcoin/bitcoin.dart';
 import 'package:cw_core/wallet_base.dart';
 import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
-import 'package:flutter/foundation.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
+import 'package:collection/collection.dart';
 
 part 'unspent_coins_list_view_model.g.dart';
 
 class UnspentCoinsListViewModel = UnspentCoinsListViewModelBase with _$UnspentCoinsListViewModel;
 
 abstract class UnspentCoinsListViewModelBase with Store {
-  UnspentCoinsListViewModelBase({
-    required this.wallet,
-    required Box<UnspentCoinsInfo> unspentCoinsInfo})
-    : _unspentCoinsInfo = unspentCoinsInfo {
+  UnspentCoinsListViewModelBase(
+      {required this.wallet, required Box<UnspentCoinsInfo> unspentCoinsInfo})
+      : _unspentCoinsInfo = unspentCoinsInfo {
     bitcoin!.updateUnspents(wallet);
   }
 
   WalletBase wallet;
-  Box<UnspentCoinsInfo> _unspentCoinsInfo;
+  final Box<UnspentCoinsInfo> _unspentCoinsInfo;
 
   @computed
-  ObservableList<UnspentCoinsItem> get items => ObservableList.of(bitcoin!.getUnspents(wallet).map((elem) {
-      final amount = bitcoin!.formatterBitcoinAmountToString(amount: elem.value) +
-          ' ${wallet.currency.title}';
-  
-     final info = _unspentCoinsInfo.values
-          .firstWhere((element) => element.walletId == wallet.id && element.hash == elem.hash);
+  ObservableList<UnspentCoinsItem> get items =>
+      ObservableList.of(bitcoin!.getUnspents(wallet).map((elem) {
+        final amount = bitcoin!.formatterBitcoinAmountToString(amount: elem.value) +
+            ' ${wallet.currency.title}';
 
-      return UnspentCoinsItem(
-          address: elem.address,
-          amount: amount,
-          hash: elem.hash,
-          isFrozen: elem.isFrozen,
-          note: info.note,
-          isSending: elem.isSending
-      );
-    }));
+        final info = getUnspentCoinInfo(elem.hash, elem.address, elem.value, elem.vout);
+
+        return UnspentCoinsItem(
+            address: elem.address,
+            amount: amount,
+            hash: elem.hash,
+            isFrozen: info?.isFrozen ?? false,
+            note: info?.note ?? '',
+            isSending: info?.isSending ?? true,
+            amountRaw: elem.value,
+            vout: elem.vout);
+      }));
 
   Future<void> saveUnspentCoinInfo(UnspentCoinsItem item) async {
     try {
-      final info = _unspentCoinsInfo.values
-          .firstWhere((element) => element.walletId.contains(wallet.id) &&
-          element.hash.contains(item.hash));
+      final info = getUnspentCoinInfo(item.hash, item.address, item.amountRaw, item.vout);
+      if (info == null) {
+        final newInfo = UnspentCoinsInfo(
+            walletId: wallet.id,
+            hash: item.hash,
+            address: item.address,
+            value: item.amountRaw,
+            vout: item.vout,
+            isFrozen: item.isFrozen,
+            isSending: item.isSending,
+            noteRaw: item.note);
 
+        await _unspentCoinsInfo.add(newInfo);
+        bitcoin!.updateUnspents(wallet);
+        wallet.updateBalance();
+        return;
+      }
       info.isFrozen = item.isFrozen;
       info.isSending = item.isSending;
       info.note = item.note;
 
       await info.save();
       bitcoin!.updateUnspents(wallet);
+      wallet.updateBalance();
     } catch (e) {
       print(e.toString());
     }
   }
-}
\ No newline at end of file
+
+  UnspentCoinsInfo? getUnspentCoinInfo(String hash, String address, int value, int vout) {
+    return _unspentCoinsInfo.values.firstWhereOrNull((element) =>
+        element.walletId == wallet.id &&
+        element.hash == hash &&
+        element.address == address &&
+        element.value == value &&
+        element.vout == vout);
+  }
+}
diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
index c38690b43..a43f620a8 100644
--- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
@@ -1,5 +1,9 @@
 import 'package:cake_wallet/ethereum/ethereum.dart';
+import 'package:cake_wallet/entities/fiat_currency.dart';
+import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
 import 'package:cake_wallet/store/yat/yat_store.dart';
+import 'package:cw_core/currency.dart';
+import 'package:intl/intl.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cw_core/wallet_base.dart';
 import 'package:cake_wallet/utils/list_item.dart';
@@ -17,22 +21,17 @@ import 'package:cake_wallet/haven/haven.dart';
 
 part 'wallet_address_list_view_model.g.dart';
 
-class WalletAddressListViewModel = WalletAddressListViewModelBase
-    with _$WalletAddressListViewModel;
+class WalletAddressListViewModel = WalletAddressListViewModelBase with _$WalletAddressListViewModel;
 
 abstract class PaymentURI {
-  PaymentURI({
-    required this.amount,
-    required this.address});
+  PaymentURI({required this.amount, required this.address});
 
   final String amount;
   final String address;
 }
 
 class MoneroURI extends PaymentURI {
-  MoneroURI({
-      required String amount,
-      required String address})
+  MoneroURI({required String amount, required String address})
       : super(amount: amount, address: address);
 
   @override
@@ -48,9 +47,7 @@ class MoneroURI extends PaymentURI {
 }
 
 class HavenURI extends PaymentURI {
-  HavenURI({
-      required String amount,
-      required String address})
+  HavenURI({required String amount, required String address})
       : super(amount: amount, address: address);
 
   @override
@@ -66,9 +63,7 @@ class HavenURI extends PaymentURI {
 }
 
 class BitcoinURI extends PaymentURI {
-  BitcoinURI({
-      required String amount,
-      required String address})
+  BitcoinURI({required String amount, required String address})
       : super(amount: amount, address: address);
 
   @override
@@ -84,9 +79,7 @@ class BitcoinURI extends PaymentURI {
 }
 
 class LitecoinURI extends PaymentURI {
-  LitecoinURI({
-    required String amount,
-    required String address})
+  LitecoinURI({required String amount, required String address})
       : super(amount: amount, address: address);
 
   @override
@@ -122,24 +115,33 @@ class EthereumURI extends PaymentURI {
 abstract class WalletAddressListViewModelBase with Store {
   WalletAddressListViewModelBase({
     required AppStore appStore,
-    required this.yatStore
-  }) : _appStore = appStore,
-      _baseItems = <ListItem>[],
-      _wallet = appStore.wallet!,
-      hasAccounts = appStore.wallet!.type == WalletType.monero || appStore.wallet!.type == WalletType.haven,
-      amount = '' {
-    _onWalletChangeReaction = reaction((_) => _appStore.wallet, (WalletBase<
-            Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo>?
-        wallet) {
-      if (wallet == null) {
-        return;
-      }
-      _wallet = wallet;
-      hasAccounts = _wallet.type == WalletType.monero;
-    });
+    required this.yatStore,
+    required this.fiatConversionStore,
+  })  : _appStore = appStore,
+        _baseItems = <ListItem>[],
+        _wallet = appStore.wallet!,
+        selectedCurrency = walletTypeToCryptoCurrency(appStore.wallet!.type),
+        _cryptoNumberFormat = NumberFormat(_cryptoNumberPattern),
+        hasAccounts =
+            appStore.wallet!.type == WalletType.monero || appStore.wallet!.type == WalletType.haven,
+        amount = '' {
     _init();
   }
 
+  static const String _cryptoNumberPattern = '0.00000000';
+
+  final NumberFormat _cryptoNumberFormat;
+
+  final FiatConversionStore fiatConversionStore;
+
+  List<Currency> get currencies => [walletTypeToCryptoCurrency(_wallet.type), ...FiatCurrency.all];
+
+  @observable
+  Currency selectedCurrency;
+
+  @computed
+  int get selectedCurrencyIndex => currencies.indexOf(selectedCurrency);
+
   @observable
   String amount;
 
@@ -176,8 +178,9 @@ abstract class WalletAddressListViewModelBase with Store {
   }
 
   @computed
-  ObservableList<ListItem> get items =>
-      ObservableList<ListItem>()..addAll(_baseItems)..addAll(addressList);
+  ObservableList<ListItem> get items => ObservableList<ListItem>()
+    ..addAll(_baseItems)
+    ..addAll(addressList);
 
   @computed
   ObservableList<ListItem> get addressList {
@@ -186,10 +189,7 @@ abstract class WalletAddressListViewModelBase with Store {
 
     if (wallet.type == WalletType.monero) {
       final primaryAddress = monero!.getSubaddressList(wallet).subaddresses.first;
-      final addressItems = monero
-        !.getSubaddressList(wallet)
-        .subaddresses
-          .map((subaddress) {
+      final addressItems = monero!.getSubaddressList(wallet).subaddresses.map((subaddress) {
         final isPrimary = subaddress == primaryAddress;
 
         return WalletAddressListItem(
@@ -203,10 +203,7 @@ abstract class WalletAddressListViewModelBase with Store {
 
     if (wallet.type == WalletType.haven) {
       final primaryAddress = haven!.getSubaddressList(wallet).subaddresses.first;
-      final addressItems = haven
-        !.getSubaddressList(wallet)
-        .subaddresses
-          .map((subaddress) {
+      final addressItems = haven!.getSubaddressList(wallet).subaddresses.map((subaddress) {
         final isPrimary = subaddress == primaryAddress;
 
         return WalletAddressListItem(
@@ -223,8 +220,7 @@ abstract class WalletAddressListViewModelBase with Store {
       final bitcoinAddresses = bitcoin!.getAddresses(wallet).map((addr) {
         final isPrimary = addr == primaryAddress;
 
-        return WalletAddressListItem(
-            isPrimary: isPrimary, name: null, address: addr);
+        return WalletAddressListItem(isPrimary: isPrimary, name: null, address: addr);
       });
       addressList.addAll(bitcoinAddresses);
     }
@@ -260,8 +256,7 @@ abstract class WalletAddressListViewModelBase with Store {
   bool get hasAddressList => _wallet.type == WalletType.monero || _wallet.type == WalletType.haven;
 
   @observable
-  WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo>
-      _wallet;
+  WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> _wallet;
 
   List<ListItem> _baseItems;
 
@@ -269,8 +264,6 @@ abstract class WalletAddressListViewModelBase with Store {
 
   final YatStore yatStore;
 
-  ReactionDisposer? _onWalletChangeReaction;
-
   @action
   void setAddress(WalletAddressListItem address) =>
       _wallet.walletAddresses.address = address.address;
@@ -284,4 +277,31 @@ abstract class WalletAddressListViewModelBase with Store {
 
     _baseItems.add(WalletAddressListHeader());
   }
+
+  @action
+  void selectCurrency(Currency currency) {
+    selectedCurrency = currency;
+  }
+
+  @action
+  void changeAmount(String amount) {
+    this.amount = amount;
+    if (selectedCurrency is FiatCurrency) {
+      _convertAmountToCrypto();
+    }
+  }
+
+  void _convertAmountToCrypto() {
+    final cryptoCurrency = walletTypeToCryptoCurrency(_wallet.type);
+    try {
+      final crypto =
+          double.parse(amount.replaceAll(',', '.')) / fiatConversionStore.prices[cryptoCurrency]!;
+      final cryptoAmountTmp = _cryptoNumberFormat.format(crypto);
+      if (amount != cryptoAmountTmp) {
+        amount = cryptoAmountTmp;
+      }
+    } catch (e) {
+      amount = '';
+    }
+  }
 }
diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart
index 2609aed7d..323d1f911 100644
--- a/lib/view_model/wallet_creation_vm.dart
+++ b/lib/view_model/wallet_creation_vm.dart
@@ -1,5 +1,5 @@
 import 'package:cake_wallet/core/wallet_creation_service.dart';
-import 'package:flutter/foundation.dart';
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cake_wallet/core/execution_state.dart';
@@ -39,7 +39,8 @@ abstract class WalletCreationVMBase with Store {
   bool typeExists(WalletType type)
     => walletCreationService.typeExists(type);
 
-  Future<void> create({dynamic options}) async {
+  Future<void> create({dynamic options, RestoredWallet? restoreWallet}) async {
+    final type = restoreWallet?.type ?? this.type;
     try {
       state = IsExecutingState();
       if (name.isEmpty) {
@@ -49,7 +50,9 @@ abstract class WalletCreationVMBase with Store {
       walletCreationService.checkIfExists(name);
       final dirPath = await pathForWalletDir(name: name, type: type);
       final path = await pathForWallet(name: name, type: type);
-      final credentials = getCredentials(options);
+      final credentials = restoreWallet != null
+          ? getCredentialsFromRestoredWallet(options, restoreWallet)
+          : getCredentials(options);
       final walletInfo = WalletInfo.external(
           id: WalletBase.idFor(name, type),
           name: name,
@@ -62,7 +65,9 @@ abstract class WalletCreationVMBase with Store {
           address: '',
           showIntroCakePayCard: (!walletCreationService.typeExists(type)) && type != WalletType.haven);
       credentials.walletInfo = walletInfo;
-      final wallet = await process(credentials);
+      final wallet = restoreWallet != null
+          ? await processFromRestoredWallet(credentials, restoreWallet)
+          : await process(credentials);
       walletInfo.address = wallet.walletAddresses.address;
       await _walletInfoSource.add(walletInfo);
       _appStore.changeCurrentWallet(wallet);
@@ -72,10 +77,15 @@ abstract class WalletCreationVMBase with Store {
       state = FailureState(e.toString());
     }
   }
-
   WalletCredentials getCredentials(dynamic options) =>
       throw UnimplementedError();
 
   Future<WalletBase> process(WalletCredentials credentials) =>
       throw UnimplementedError();
+
+  WalletCredentials getCredentialsFromRestoredWallet(dynamic options, RestoredWallet restoreWallet) =>
+      throw UnimplementedError();
+
+  Future<WalletBase> processFromRestoredWallet(WalletCredentials credentials, RestoredWallet restoreWallet) =>
+      throw UnimplementedError();
 }
diff --git a/lib/view_model/wallet_keys_view_model.dart b/lib/view_model/wallet_keys_view_model.dart
index af52b0a85..8439c8031 100644
--- a/lib/view_model/wallet_keys_view_model.dart
+++ b/lib/view_model/wallet_keys_view_model.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/store/app_store.dart';
 import 'package:cw_core/wallet_type.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cake_wallet/generated/i18n.dart';
@@ -12,84 +13,96 @@ part 'wallet_keys_view_model.g.dart';
 class WalletKeysViewModel = WalletKeysViewModelBase with _$WalletKeysViewModel;
 
 abstract class WalletKeysViewModelBase with Store {
-  WalletKeysViewModelBase(WalletBase wallet)
-      : title = wallet.type == WalletType.bitcoin ||
-                wallet.type == WalletType.litecoin ||
-                wallet.type == WalletType.ethereum
+  WalletKeysViewModelBase(this._appStore)
+      : title = _appStore.wallet!.type == WalletType.bitcoin ||
+                _appStore.wallet!.type == WalletType.litecoin ||
+                _appStore.wallet!.type == WalletType.ethereum
             ? S.current.wallet_seed
             : S.current.wallet_keys,
-        _wallet = wallet,
-        _restoreHeight = wallet.walletInfo.restoreHeight,
+        _restoreHeight = _appStore.wallet!.walletInfo.restoreHeight,
         items = ObservableList<StandartListItem>() {
-    if (wallet.type == WalletType.monero) {
-      final keys = monero!.getKeys(wallet);
-      items.addAll([
-        if (keys['publicSpendKey'] != null)
-          StandartListItem(title: S.current.spend_key_public, value: keys['publicSpendKey']!),
-        if (keys['privateSpendKey'] != null)
-          StandartListItem(title: S.current.spend_key_private, value: keys['privateSpendKey']!),
-        if (keys['publicViewKey'] != null)
-          StandartListItem(title: S.current.view_key_public, value: keys['publicViewKey']!),
-        if (keys['privateViewKey'] != null)
-          StandartListItem(title: S.current.view_key_private, value: keys['privateViewKey']!),
-        StandartListItem(title: S.current.wallet_seed, value: wallet.seed),
-      ]);
-    }
+    _populateItems();
 
-    if (wallet.type == WalletType.haven) {
-      final keys = haven!.getKeys(wallet);
-      items.addAll([
-        if (keys['publicSpendKey'] != null)
-          StandartListItem(title: S.current.spend_key_public, value: keys['publicSpendKey']!),
-        if (keys['privateSpendKey'] != null)
-          StandartListItem(title: S.current.spend_key_private, value: keys['privateSpendKey']!),
-        if (keys['publicViewKey'] != null)
-          StandartListItem(title: S.current.view_key_public, value: keys['publicViewKey']!),
-        if (keys['privateViewKey'] != null)
-          StandartListItem(title: S.current.view_key_private, value: keys['privateViewKey']!),
-        StandartListItem(title: S.current.wallet_seed, value: wallet.seed),
-      ]);
-    }
-
-    if (wallet.type == WalletType.bitcoin ||
-        wallet.type == WalletType.litecoin ||
-        wallet.type == WalletType.ethereum) {
-      items.addAll([
-        StandartListItem(title: S.current.wallet_seed, value: wallet.seed),
-      ]);
-    }
+    reaction((_) => _appStore.wallet, (WalletBase? _wallet) {
+      _populateItems();
+    });
   }
 
   final ObservableList<StandartListItem> items;
 
   final String title;
 
-  final WalletBase _wallet;
+  final AppStore _appStore;
 
   final int _restoreHeight;
 
+  void _populateItems() {
+    items.clear();
+
+    if (_appStore.wallet!.type == WalletType.monero) {
+      final keys = monero!.getKeys(_appStore.wallet!);
+
+      items.addAll([
+        if (keys['publicSpendKey'] != null)
+          StandartListItem(title: S.current.spend_key_public, value: keys['publicSpendKey']!),
+        if (keys['privateSpendKey'] != null)
+          StandartListItem(title: S.current.spend_key_private, value: keys['privateSpendKey']!),
+        if (keys['publicViewKey'] != null)
+          StandartListItem(title: S.current.view_key_public, value: keys['publicViewKey']!),
+        if (keys['privateViewKey'] != null)
+          StandartListItem(title: S.current.view_key_private, value: keys['privateViewKey']!),
+        StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed),
+      ]);
+    }
+
+    if (_appStore.wallet!.type == WalletType.haven) {
+      final keys = haven!.getKeys(_appStore.wallet!);
+
+      items.addAll([
+        if (keys['publicSpendKey'] != null)
+          StandartListItem(title: S.current.spend_key_public, value: keys['publicSpendKey']!),
+        if (keys['privateSpendKey'] != null)
+          StandartListItem(title: S.current.spend_key_private, value: keys['privateSpendKey']!),
+        if (keys['publicViewKey'] != null)
+          StandartListItem(title: S.current.view_key_public, value: keys['publicViewKey']!),
+        if (keys['privateViewKey'] != null)
+          StandartListItem(title: S.current.view_key_private, value: keys['privateViewKey']!),
+        StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed),
+      ]);
+    }
+
+    if (_appStore.wallet!.type == WalletType.bitcoin ||
+        _appStore.wallet!.type == WalletType.litecoin ||
+        _appStore.wallet!.type == WalletType.ethereum) {
+      items.addAll([
+        StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed),
+      ]);
+    }
+  }
+
   Future<int?> currentHeight() async {
-    if (_wallet.type == WalletType.haven) {
+    if (_appStore.wallet!.type == WalletType.haven) {
       return await haven!.getCurrentHeight();
     }
-    if (_wallet.type == WalletType.monero) {
+    if (_appStore.wallet!.type == WalletType.monero) {
       return monero_wallet.getCurrentHeight();
     }
     return null;
   }
 
-  String get _path {
-    switch (_wallet.type) {
+
+  String get _scheme {
+    switch (_appStore.wallet!.type) {
       case WalletType.monero:
-        return 'monero_wallet:';
+        return 'monero-wallet';
       case WalletType.bitcoin:
-        return 'bitcoin_wallet:';
+        return 'bitcoin-wallet';
       case WalletType.litecoin:
-        return 'litecoin_wallet:';
+        return 'litecoin-wallet';
       case WalletType.haven:
-        return 'haven_wallet:';
+        return 'haven-wallet';
       default:
-        throw Exception('Unexpected wallet type: ${_wallet.toString()}');
+        throw Exception('Unexpected wallet type: ${_appStore.wallet!.toString()}');
     }
   }
 
@@ -107,14 +120,14 @@ abstract class WalletKeysViewModelBase with Store {
   Future<Map<String, String>> get _queryParams async {
     final restoreHeightResult = await restoreHeight;
     return {
-      'seed': _wallet.seed,
+      'seed': _appStore.wallet!.seed,
       if (restoreHeightResult != null) ...{'height': restoreHeightResult}
     };
   }
 
   Future<Uri> get url async {
     return Uri(
-      path: _path,
+      scheme: _scheme,
       queryParameters: await _queryParams,
     );
   }
diff --git a/lib/view_model/wallet_list/wallet_list_item.dart b/lib/view_model/wallet_list/wallet_list_item.dart
index af30b9bea..a644c07b3 100644
--- a/lib/view_model/wallet_list/wallet_list_item.dart
+++ b/lib/view_model/wallet_list/wallet_list_item.dart
@@ -1,13 +1,13 @@
-import 'package:flutter/foundation.dart';
 import 'package:cw_core/wallet_type.dart';
 
 class WalletListItem {
-  const WalletListItem(
-      {required this.name,
-       required this.type,
-      required this.key,
-      this.isCurrent = false,
-      this.isEnabled = true});
+  const WalletListItem({
+    required this.name,
+    required this.type,
+    required this.key,
+    this.isCurrent = false,
+    this.isEnabled = true,
+  });
 
   final String name;
   final WalletType type;
diff --git a/lib/view_model/wallet_list/wallet_list_view_model.dart b/lib/view_model/wallet_list/wallet_list_view_model.dart
index 6d63675ba..be8d928aa 100644
--- a/lib/view_model/wallet_list/wallet_list_view_model.dart
+++ b/lib/view_model/wallet_list/wallet_list_view_model.dart
@@ -22,6 +22,7 @@ abstract class WalletListViewModelBase with Store {
     this._authService,
   ) : wallets = ObservableList<WalletListItem>() {
     _updateList();
+    reaction((_) => _appStore.wallet, (_) => _updateList());
   }
 
   @observable
diff --git a/lib/view_model/wallet_new_vm.dart b/lib/view_model/wallet_new_vm.dart
index 035349978..dcb9785e7 100644
--- a/lib/view_model/wallet_new_vm.dart
+++ b/lib/view_model/wallet_new_vm.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
 import 'package:cake_wallet/ethereum/ethereum.dart';
 import 'package:flutter/foundation.dart';
 import 'package:hive/hive.dart';
diff --git a/lib/view_model/wallet_restoration_from_keys_vm.dart b/lib/view_model/wallet_restoration_from_keys_vm.dart
index f7195c240..97cb8d519 100644
--- a/lib/view_model/wallet_restoration_from_keys_vm.dart
+++ b/lib/view_model/wallet_restoration_from_keys_vm.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
 import 'package:flutter/foundation.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
@@ -66,7 +67,7 @@ abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM
         return bitcoin!.createBitcoinRestoreWalletFromWIFCredentials(
             name: name, password: password, wif: wif);
       default:
-        throw Exception('Unexpected type: ${type.toString()}');;
+        throw Exception('Unexpected type: ${type.toString()}');
     }
   }
 
diff --git a/lib/view_model/wallet_restoration_from_seed_vm.dart b/lib/view_model/wallet_restoration_from_seed_vm.dart
index ef584db08..0caa7f37d 100644
--- a/lib/view_model/wallet_restoration_from_seed_vm.dart
+++ b/lib/view_model/wallet_restoration_from_seed_vm.dart
@@ -1,3 +1,4 @@
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
 import 'package:flutter/foundation.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
diff --git a/lib/view_model/wallet_restore_view_model.dart b/lib/view_model/wallet_restore_view_model.dart
index 0eba59e1b..6bf87f22c 100644
--- a/lib/view_model/wallet_restore_view_model.dart
+++ b/lib/view_model/wallet_restore_view_model.dart
@@ -1,4 +1,7 @@
 import 'package:cake_wallet/bitcoin/bitcoin.dart';
+import 'package:cake_wallet/core/mnemonic_length.dart';
+import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
+import 'package:flutter/foundation.dart';
 import 'package:cake_wallet/ethereum/ethereum.dart';
 import 'package:hive/hive.dart';
 import 'package:mobx/mobx.dart';
@@ -12,10 +15,10 @@ import 'package:cw_core/wallet_info.dart';
 import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
 import 'package:cake_wallet/monero/monero.dart';
 import 'package:cake_wallet/haven/haven.dart';
+import 'package:cake_wallet/view_model/restore/restore_mode.dart';
 
 part 'wallet_restore_view_model.g.dart';
 
-enum WalletRestoreMode { seed, keys }
 
 class WalletRestoreViewModel = WalletRestoreViewModelBase
     with _$WalletRestoreViewModel;
diff --git a/macos/.gitignore b/macos/.gitignore
new file mode 100644
index 000000000..746adbb6b
--- /dev/null
+++ b/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/macos/CakeWallet/secRandom.swift b/macos/CakeWallet/secRandom.swift
new file mode 100644
index 000000000..c9b2e3593
--- /dev/null
+++ b/macos/CakeWallet/secRandom.swift
@@ -0,0 +1,12 @@
+import Foundation
+
+func secRandom(count: Int) -> Data? {
+    var bytes = [Int8](repeating: 0, count: count)
+    let status = SecRandomCopyBytes(kSecRandomDefault, bytes.count, &bytes)
+
+    if status == errSecSuccess {
+        return Data(bytes: bytes, count: bytes.count)
+    }
+    
+    return nil
+}
diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 000000000..4b81f9b2d
--- /dev/null
+++ b/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 000000000..5caa9d157
--- /dev/null
+++ b/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 000000000..437237153
--- /dev/null
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,38 @@
+//
+//  Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import connectivity_macos
+import cw_monero
+import device_info_plus
+import devicelocale
+import flutter_secure_storage_macos
+import in_app_review
+import package_info
+import path_provider_foundation
+import platform_device_id
+import platform_device_id_macos
+import share_plus_macos
+import shared_preferences_foundation
+import url_launcher_macos
+import wakelock_macos
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+  ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
+  CwMoneroPlugin.register(with: registry.registrar(forPlugin: "CwMoneroPlugin"))
+  DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
+  DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin"))
+  FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin"))
+  InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin"))
+  FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
+  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+  PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
+  PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
+  SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
+  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
+  UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
+  WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin"))
+}
diff --git a/macos/Podfile b/macos/Podfile
new file mode 100644
index 000000000..0c76ccf54
--- /dev/null
+++ b/macos/Podfile
@@ -0,0 +1,40 @@
+platform :osx, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+  use_frameworks!
+  use_modular_headers!
+
+  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_macos_build_settings(target)
+  end
+end
diff --git a/macos/Podfile.lock b/macos/Podfile.lock
new file mode 100644
index 000000000..a56166e28
--- /dev/null
+++ b/macos/Podfile.lock
@@ -0,0 +1,124 @@
+PODS:
+  - connectivity_macos (0.0.1):
+    - FlutterMacOS
+    - Reachability
+  - cw_monero (0.0.1):
+    - cw_monero/Boost (= 0.0.1)
+    - cw_monero/Monero (= 0.0.1)
+    - cw_monero/OpenSSL (= 0.0.1)
+    - cw_monero/Sodium (= 0.0.1)
+    - cw_monero/Unbound (= 0.0.1)
+    - FlutterMacOS
+  - cw_monero/Boost (0.0.1):
+    - FlutterMacOS
+  - cw_monero/Monero (0.0.1):
+    - FlutterMacOS
+  - cw_monero/OpenSSL (0.0.1):
+    - FlutterMacOS
+  - cw_monero/Sodium (0.0.1):
+    - FlutterMacOS
+  - cw_monero/Unbound (0.0.1):
+    - FlutterMacOS
+  - device_info_plus (0.0.1):
+    - FlutterMacOS
+  - devicelocale (0.0.1):
+    - FlutterMacOS
+  - flutter_secure_storage_macos (3.3.1):
+    - FlutterMacOS
+  - FlutterMacOS (1.0.0)
+  - in_app_review (0.2.0):
+    - FlutterMacOS
+  - package_info (0.0.1):
+    - FlutterMacOS
+  - path_provider_foundation (0.0.1):
+    - Flutter
+    - FlutterMacOS
+  - platform_device_id (0.0.1):
+    - FlutterMacOS
+  - platform_device_id_macos (0.0.1):
+    - FlutterMacOS
+  - Reachability (3.2)
+  - share_plus_macos (0.0.1):
+    - FlutterMacOS
+  - shared_preferences_foundation (0.0.1):
+    - Flutter
+    - FlutterMacOS
+  - url_launcher_macos (0.0.1):
+    - FlutterMacOS
+  - wakelock_macos (0.0.1):
+    - FlutterMacOS
+
+DEPENDENCIES:
+  - connectivity_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_macos/macos`)
+  - cw_monero (from `Flutter/ephemeral/.symlinks/plugins/cw_monero/macos`)
+  - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
+  - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`)
+  - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
+  - FlutterMacOS (from `Flutter/ephemeral`)
+  - in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`)
+  - package_info (from `Flutter/ephemeral/.symlinks/plugins/package_info/macos`)
+  - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`)
+  - platform_device_id (from `Flutter/ephemeral/.symlinks/plugins/platform_device_id/macos`)
+  - platform_device_id_macos (from `Flutter/ephemeral/.symlinks/plugins/platform_device_id_macos/macos`)
+  - share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`)
+  - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos`)
+  - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
+  - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`)
+
+SPEC REPOS:
+  trunk:
+    - Reachability
+
+EXTERNAL SOURCES:
+  connectivity_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/connectivity_macos/macos
+  cw_monero:
+    :path: Flutter/ephemeral/.symlinks/plugins/cw_monero/macos
+  device_info_plus:
+    :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
+  devicelocale:
+    :path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos
+  flutter_secure_storage_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos
+  FlutterMacOS:
+    :path: Flutter/ephemeral
+  in_app_review:
+    :path: Flutter/ephemeral/.symlinks/plugins/in_app_review/macos
+  package_info:
+    :path: Flutter/ephemeral/.symlinks/plugins/package_info/macos
+  path_provider_foundation:
+    :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos
+  platform_device_id:
+    :path: Flutter/ephemeral/.symlinks/plugins/platform_device_id/macos
+  platform_device_id_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/platform_device_id_macos/macos
+  share_plus_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos
+  shared_preferences_foundation:
+    :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos
+  url_launcher_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
+  wakelock_macos:
+    :path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos
+
+SPEC CHECKSUMS:
+  connectivity_macos: 5dae6ee11d320fac7c05f0d08bd08fc32b5514d9
+  cw_monero: f8b7f104508efba2591548e76b5c058d05cba3f0
+  device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
+  devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
+  flutter_secure_storage_macos: 6ceee8fbc7f484553ad17f79361b556259df89aa
+  FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
+  in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0
+  package_info: 6eba2fd8d3371dda2d85c8db6fe97488f24b74b2
+  path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
+  platform_device_id: 3e414428f45df149bbbfb623e2c0ca27c545b763
+  platform_device_id_macos: f763bb55f088be804d61b96eb4710b8ab6598e94
+  Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
+  share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
+  shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
+  url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
+  wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9
+
+PODFILE CHECKSUM: 505596d150d38022472859d890f709281982e016
+
+COCOAPODS: 1.11.3
diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..06558bf57
--- /dev/null
+++ b/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,663 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 54;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+			buildPhases = (
+				33CC111E2044C6BF0003C045 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "Flutter Assemble";
+			productName = FLX;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+		33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+		33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+		33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+		4171CB1F5A4EA2E4DC33F52F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B38D1DBC56DBD386923BC063 /* Pods_Runner.framework */; };
+		9F565D5929954F53009A75FB /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F565D5729954F53009A75FB /* secRandom.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+			remoteInfo = FLX;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		33CC110E2044A8840003C045 /* Bundle Framework */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+			);
+			name = "Bundle Framework";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		094BF982245FD1012D60A103 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
+		0C090639294D3AAC00954DC9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
+		2A820A13B0719E9E0CD6686F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
+		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
+		33CC10ED2044A3C60003C045 /* Cake Wallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Cake Wallet.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
+		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
+		33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
+		33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
+		33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
+		33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
+		33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
+		33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
+		33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
+		33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
+		9646C67C7114830A5ACFF5DF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
+		9F565D5729954F53009A75FB /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = secRandom.swift; path = CakeWallet/secRandom.swift; sourceTree = "<group>"; };
+		9F565D5829954F53009A75FB /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = decrypt.swift; path = CakeWallet/decrypt.swift; sourceTree = "<group>"; };
+		B38D1DBC56DBD386923BC063 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		33CC10EA2044A3C60003C045 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4171CB1F5A4EA2E4DC33F52F /* Pods_Runner.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		33BA886A226E78AF003329D5 /* Configs */ = {
+			isa = PBXGroup;
+			children = (
+				33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+			);
+			path = Configs;
+			sourceTree = "<group>";
+		};
+		33CC10E42044A3C60003C045 = {
+			isa = PBXGroup;
+			children = (
+				9F565D5829954F53009A75FB /* decrypt.swift */,
+				9F565D5729954F53009A75FB /* secRandom.swift */,
+				33FAB671232836740065AC1E /* Runner */,
+				33CEB47122A05771004F2AC0 /* Flutter */,
+				33CC10EE2044A3C60003C045 /* Products */,
+				D73912EC22F37F3D000D13A0 /* Frameworks */,
+				9B6E7CA3983216A9E173F00F /* Pods */,
+			);
+			sourceTree = "<group>";
+		};
+		33CC10EE2044A3C60003C045 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10ED2044A3C60003C045 /* Cake Wallet.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		33CC11242044D66E0003C045 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F22044A3C60003C045 /* Assets.xcassets */,
+				33CC10F42044A3C60003C045 /* MainMenu.xib */,
+				33CC10F72044A3C60003C045 /* Info.plist */,
+			);
+			name = Resources;
+			path = ..;
+			sourceTree = "<group>";
+		};
+		33CEB47122A05771004F2AC0 /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+				33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+				33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+				33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+			);
+			path = Flutter;
+			sourceTree = "<group>";
+		};
+		33FAB671232836740065AC1E /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+				33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+				33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+				33E51914231749380026EE4D /* Release.entitlements */,
+				33CC11242044D66E0003C045 /* Resources */,
+				33BA886A226E78AF003329D5 /* Configs */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+		9B6E7CA3983216A9E173F00F /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				9646C67C7114830A5ACFF5DF /* Pods-Runner.debug.xcconfig */,
+				2A820A13B0719E9E0CD6686F /* Pods-Runner.release.xcconfig */,
+				094BF982245FD1012D60A103 /* Pods-Runner.profile.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				0C090639294D3AAC00954DC9 /* libiconv.tbd */,
+				B38D1DBC56DBD386923BC063 /* Pods_Runner.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		33CC10EC2044A3C60003C045 /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				93B711AB4B96E7C8C5C5B844 /* [CP] Check Pods Manifest.lock */,
+				33CC10E92044A3C60003C045 /* Sources */,
+				33CC10EA2044A3C60003C045 /* Frameworks */,
+				33CC10EB2044A3C60003C045 /* Resources */,
+				33CC110E2044A8840003C045 /* Bundle Framework */,
+				3399D490228B24CF009A79C7 /* ShellScript */,
+				5592D00118C2EA3C5E0B5FDF /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				33CC11202044C79F0003C045 /* PBXTargetDependency */,
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 33CC10ED2044A3C60003C045 /* Cake Wallet.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		33CC10E52044A3C60003C045 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 0920;
+				LastUpgradeCheck = 1300;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					33CC10EC2044A3C60003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						LastSwiftMigration = 1100;
+						SystemCapabilities = {
+							com.apple.Sandbox = {
+								enabled = 1;
+							};
+						};
+					};
+					33CC111A2044C6BA0003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						ProvisioningStyle = Manual;
+					};
+				};
+			};
+			buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 33CC10E42044A3C60003C045;
+			productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				33CC10EC2044A3C60003C045 /* Runner */,
+				33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		33CC10EB2044A3C60003C045 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3399D490228B24CF009A79C7 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			alwaysOutOfDate = 1;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+		};
+		33CC111E2044C6BF0003C045 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				Flutter/ephemeral/FlutterInputs.xcfilelist,
+			);
+			inputPaths = (
+				Flutter/ephemeral/tripwire,
+			);
+			outputFileListPaths = (
+				Flutter/ephemeral/FlutterOutputs.xcfilelist,
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+		};
+		5592D00118C2EA3C5E0B5FDF /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		93B711AB4B96E7C8C5C5B844 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		33CC10E92044A3C60003C045 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9F565D5929954F53009A75FB /* secRandom.swift in Sources */,
+				33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+				33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+				335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+			targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				33CC10F52044A3C60003C045 /* Base */,
+			);
+			name = MainMenu.xib;
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		338D0CE9231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Profile;
+		};
+		338D0CEA231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = arm64;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				CURRENT_PROJECT_VERSION = 10;
+				DEVELOPMENT_TEAM = 32J6BB6VUS;
+				INFOPLIST_FILE = Runner/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet";
+				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				MACOSX_DEPLOYMENT_TARGET = 12;
+				MARKETING_VERSION = 1.0.1;
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Profile;
+		};
+		338D0CEB231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Profile;
+		};
+		33CC10F92044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		33CC10FA2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Release;
+		};
+		33CC10FC2044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = arm64;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				CURRENT_PROJECT_VERSION = 10;
+				DEVELOPMENT_TEAM = 32J6BB6VUS;
+				INFOPLIST_FILE = Runner/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet";
+				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				MACOSX_DEPLOYMENT_TARGET = 12;
+				MARKETING_VERSION = 1.0.1;
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		33CC10FD2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = arm64;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				CURRENT_PROJECT_VERSION = 10;
+				DEVELOPMENT_TEAM = 32J6BB6VUS;
+				INFOPLIST_FILE = Runner/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet";
+				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				MACOSX_DEPLOYMENT_TARGET = 12;
+				MARKETING_VERSION = 1.0.1;
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		33CC111C2044C6BA0003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		33CC111D2044C6BA0003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10F92044A3C60003C045 /* Debug */,
+				33CC10FA2044A3C60003C045 /* Release */,
+				338D0CE9231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10FC2044A3C60003C045 /* Debug */,
+				33CC10FD2044A3C60003C045 /* Release */,
+				338D0CEA231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC111C2044C6BA0003C045 /* Debug */,
+				33CC111D2044C6BA0003C045 /* Release */,
+				338D0CEB231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/macos/Runner.xcodeproj/project_base.pbxproj b/macos/Runner.xcodeproj/project_base.pbxproj
new file mode 100644
index 000000000..fb3e76252
--- /dev/null
+++ b/macos/Runner.xcodeproj/project_base.pbxproj
@@ -0,0 +1,636 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 51;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+			buildPhases = (
+				33CC111E2044C6BF0003C045 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "Flutter Assemble";
+			productName = FLX;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		328F945957E1041662291EC5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C84AA35EA80D710889C68D81 /* Pods_Runner.framework */; };
+		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+		33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+		33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+		33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+			remoteInfo = FLX;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		33CC110E2044A8840003C045 /* Bundle Framework */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+			);
+			name = "Bundle Framework";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		0C090639294D3AAC00954DC9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
+		135D3AD0276D31F62BBEDDBF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
+		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
+		33CC10ED2044A3C60003C045 /* cake_wallet_new.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cake_wallet_new.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
+		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
+		33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
+		33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
+		33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
+		33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
+		33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
+		33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
+		33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
+		33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
+		359F2F22842E234537DED5E3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
+		C84AA35EA80D710889C68D81 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		FF499CFF131B036E3C5638D0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		33CC10EA2044A3C60003C045 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				328F945957E1041662291EC5 /* Pods_Runner.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		33BA886A226E78AF003329D5 /* Configs */ = {
+			isa = PBXGroup;
+			children = (
+				33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+			);
+			path = Configs;
+			sourceTree = "<group>";
+		};
+		33CC10E42044A3C60003C045 = {
+			isa = PBXGroup;
+			children = (
+				33FAB671232836740065AC1E /* Runner */,
+				33CEB47122A05771004F2AC0 /* Flutter */,
+				33CC10EE2044A3C60003C045 /* Products */,
+				D73912EC22F37F3D000D13A0 /* Frameworks */,
+				9B6E7CA3983216A9E173F00F /* Pods */,
+			);
+			sourceTree = "<group>";
+		};
+		33CC10EE2044A3C60003C045 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10ED2044A3C60003C045 /* cake_wallet_new.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		33CC11242044D66E0003C045 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F22044A3C60003C045 /* Assets.xcassets */,
+				33CC10F42044A3C60003C045 /* MainMenu.xib */,
+				33CC10F72044A3C60003C045 /* Info.plist */,
+			);
+			name = Resources;
+			path = ..;
+			sourceTree = "<group>";
+		};
+		33CEB47122A05771004F2AC0 /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+				33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+				33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+				33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+			);
+			path = Flutter;
+			sourceTree = "<group>";
+		};
+		33FAB671232836740065AC1E /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+				33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+				33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+				33E51914231749380026EE4D /* Release.entitlements */,
+				33CC11242044D66E0003C045 /* Resources */,
+				33BA886A226E78AF003329D5 /* Configs */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+		9B6E7CA3983216A9E173F00F /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				359F2F22842E234537DED5E3 /* Pods-Runner.debug.xcconfig */,
+				135D3AD0276D31F62BBEDDBF /* Pods-Runner.release.xcconfig */,
+				FF499CFF131B036E3C5638D0 /* Pods-Runner.profile.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				0C090639294D3AAC00954DC9 /* libiconv.tbd */,
+				C84AA35EA80D710889C68D81 /* Pods_Runner.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		33CC10EC2044A3C60003C045 /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				8AB41FC42599228A92F51A44 /* [CP] Check Pods Manifest.lock */,
+				33CC10E92044A3C60003C045 /* Sources */,
+				33CC10EA2044A3C60003C045 /* Frameworks */,
+				33CC10EB2044A3C60003C045 /* Resources */,
+				33CC110E2044A8840003C045 /* Bundle Framework */,
+				3399D490228B24CF009A79C7 /* ShellScript */,
+				F015812745AAC61FF550BB30 /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				33CC11202044C79F0003C045 /* PBXTargetDependency */,
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 33CC10ED2044A3C60003C045 /* cake_wallet_new.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		33CC10E52044A3C60003C045 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 0920;
+				LastUpgradeCheck = 1300;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					33CC10EC2044A3C60003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						LastSwiftMigration = 1100;
+						ProvisioningStyle = Automatic;
+						SystemCapabilities = {
+							com.apple.Sandbox = {
+								enabled = 1;
+							};
+						};
+					};
+					33CC111A2044C6BA0003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						ProvisioningStyle = Manual;
+					};
+				};
+			};
+			buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 33CC10E42044A3C60003C045;
+			productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				33CC10EC2044A3C60003C045 /* Runner */,
+				33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		33CC10EB2044A3C60003C045 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3399D490228B24CF009A79C7 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+		};
+		33CC111E2044C6BF0003C045 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				Flutter/ephemeral/FlutterInputs.xcfilelist,
+			);
+			inputPaths = (
+				Flutter/ephemeral/tripwire,
+			);
+			outputFileListPaths = (
+				Flutter/ephemeral/FlutterOutputs.xcfilelist,
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+		};
+		8AB41FC42599228A92F51A44 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		F015812745AAC61FF550BB30 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		33CC10E92044A3C60003C045 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+				33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+				335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+			targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				33CC10F52044A3C60003C045 /* Base */,
+			);
+			name = MainMenu.xib;
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		338D0CE9231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Profile;
+		};
+		338D0CEA231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = ;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Profile;
+		};
+		338D0CEB231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Profile;
+		};
+		33CC10F92044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		33CC10FA2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Release;
+		};
+		33CC10FC2044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = ;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		33CC10FD2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ARCHS = ;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		33CC111C2044C6BA0003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		33CC111D2044C6BA0003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10F92044A3C60003C045 /* Debug */,
+				33CC10FA2044A3C60003C045 /* Release */,
+				338D0CE9231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10FC2044A3C60003C045 /* Debug */,
+				33CC10FD2044A3C60003C045 /* Release */,
+				338D0CEA231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC111C2044C6BA0003C045 /* Debug */,
+				33CC111D2044C6BA0003C045 /* Release */,
+				338D0CEB231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 000000000..8536e9a81
--- /dev/null
+++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1300"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+               BuildableName = "Cake Wallet.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "Cake Wallet.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "Cake Wallet.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "Cake Wallet.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..21a3cc14c
--- /dev/null
+++ b/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 000000000..f9b0d7c5e
--- /dev/null
+++ b/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreviewsEnabled</key>
+	<false/>
+</dict>
+</plist>
diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift
new file mode 100644
index 000000000..0c8973175
--- /dev/null
+++ b/macos/Runner/AppDelegate.swift
@@ -0,0 +1,33 @@
+import Cocoa
+import FlutterMacOS
+import IOKit.pwr_mgt
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+    override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+        return true
+    }
+
+    override func applicationDidFinishLaunching(_ notification: Notification) {
+        let controller : FlutterViewController = mainFlutterWindow?.contentViewController as! FlutterViewController
+
+        let utilsChannel = FlutterMethodChannel(
+            name: "com.cake_wallet/native_utils",
+            binaryMessenger: controller.engine.binaryMessenger)
+        utilsChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
+            switch call.method {
+            case "sec_random":
+                guard let args = call.arguments as? Dictionary<String, Any>,
+                      let count = args["count"] as? Int else {
+                    result(nil)
+                    return
+                }
+
+                result(secRandom(count: count))
+
+            default:
+                result(FlutterMethodNotImplemented)
+            }
+        })
+    }
+}
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..96d3fee1a
--- /dev/null
+++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    },
+    "images": [
+        {
+            "size": "16x16",
+            "idiom": "mac",
+            "filename": "app_icon_16.png",
+            "scale": "1x"
+        },
+        {
+            "size": "16x16",
+            "idiom": "mac",
+            "filename": "app_icon_32.png",
+            "scale": "2x"
+        },
+        {
+            "size": "32x32",
+            "idiom": "mac",
+            "filename": "app_icon_32.png",
+            "scale": "1x"
+        },
+        {
+            "size": "32x32",
+            "idiom": "mac",
+            "filename": "app_icon_64.png",
+            "scale": "2x"
+        },
+        {
+            "size": "128x128",
+            "idiom": "mac",
+            "filename": "app_icon_128.png",
+            "scale": "1x"
+        },
+        {
+            "size": "128x128",
+            "idiom": "mac",
+            "filename": "app_icon_256.png",
+            "scale": "2x"
+        },
+        {
+            "size": "256x256",
+            "idiom": "mac",
+            "filename": "app_icon_256.png",
+            "scale": "1x"
+        },
+        {
+            "size": "256x256",
+            "idiom": "mac",
+            "filename": "app_icon_512.png",
+            "scale": "2x"
+        },
+        {
+            "size": "512x512",
+            "idiom": "mac",
+            "filename": "app_icon_512.png",
+            "scale": "1x"
+        },
+        {
+            "size": "512x512",
+            "idiom": "mac",
+            "filename": "app_icon_1024.png",
+            "scale": "2x"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 000000000..73101354a
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 000000000..9ceee3c5e
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 000000000..ef46cd805
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 000000000..6547a1b1b
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 000000000..e436872e8
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 000000000..157b00493
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 000000000..a46ed4535
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000..a6981c270
--- /dev/null
+++ b/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+            <connections>
+                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Cake_Wallet" customModuleProvider="target">
+            <connections>
+                <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
+                <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
+        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
+            <items>
+                <menuItem title="APP_NAME" id="1Xt-HY-uBw">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
+                        <items>
+                            <menuItem title="About APP_NAME" id="5kV-Vb-QxS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
+                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
+                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
+                            <menuItem title="Services" id="NMo-om-nkz">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
+                            <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
+                                <connections>
+                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Show All" id="Kd2-mp-pUS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
+                            <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
+                                <connections>
+                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Edit" id="5QF-Oa-p0T">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
+                        <items>
+                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
+                                <connections>
+                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
+                                <connections>
+                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
+                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
+                                <connections>
+                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
+                                <connections>
+                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
+                                <connections>
+                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Delete" id="pa3-QI-u2k">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
+                                <connections>
+                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
+                            <menuItem title="Find" id="4EN-yA-p0u">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
+                                    <items>
+                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
+                                            <connections>
+                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
+                                    <items>
+                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
+                                            <connections>
+                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
+                                            <connections>
+                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
+                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Substitutions" id="9ic-FL-obx">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
+                                    <items>
+                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
+                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Links" id="cwL-P1-jid">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
+                                    <items>
+                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Speech" id="xrE-MZ-jX0">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
+                                    <items>
+                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="View" id="H8h-7b-M4v">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="View" id="HyV-fh-RgO">
+                        <items>
+                            <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
+                                <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
+                                <connections>
+                                    <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Window" id="aUF-d1-5bR">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
+                        <items>
+                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
+                                <connections>
+                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Zoom" id="R4o-n2-Eq4">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
+                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Help" id="EPT-qC-fAb">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/>
+                </menuItem>
+            </items>
+            <point key="canvasLocation" x="142" y="-258"/>
+        </menu>
+        <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Cake_Wallet" customModuleProvider="target">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <rect key="contentRect" x="335" y="390" width="1163" height="755"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
+                <rect key="frame" x="0.0" y="0.0" width="1163" height="755"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </view>
+            <point key="canvasLocation" x="138.5" y="222.5"/>
+        </window>
+    </objects>
+</document>
diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 000000000..84f96bff7
--- /dev/null
+++ b/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = Cake Wallet
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2022 com.fotolockr. All rights reserved.
diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 000000000..36b0fd946
--- /dev/null
+++ b/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 000000000..dff4f4956
--- /dev/null
+++ b/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 000000000..42bcbf478
--- /dev/null
+++ b/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/macos/Runner/DebugProfileBase.entitlements b/macos/Runner/DebugProfileBase.entitlements
new file mode 100644
index 000000000..c1b4345fe
--- /dev/null
+++ b/macos/Runner/DebugProfileBase.entitlements
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+	<key>com.apple.security.cs.allow-jit</key>
+	<true/>
+	<key>com.apple.security.network.server</key>
+	<true/>
+	<key>keychain-access-groups</key>
+	<array>
+		<string>$(AppIdentifierPrefix)${BUNDLE_ID}</string>
+	</array>
+	<key>com.apple.security.network.client</key>
+    <true/>
+</dict>
+</plist>
diff --git a/macos/Runner/InfoBase.plist b/macos/Runner/InfoBase.plist
new file mode 100644
index 000000000..98d0ea9ee
--- /dev/null
+++ b/macos/Runner/InfoBase.plist
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>$(FLUTTER_BUILD_NAME)</string>
+	<key>CFBundleVersion</key>
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>$(PRODUCT_COPYRIGHT)</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+	<key>LSApplicationCategoryType</key>
+	<string>public.app-category.finance</string>
+</dict>
+</plist>
diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 000000000..2722837ec
--- /dev/null
+++ b/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+  override func awakeFromNib() {
+    let flutterViewController = FlutterViewController.init()
+    let windowFrame = self.frame
+    self.contentViewController = flutterViewController
+    self.setFrame(windowFrame, display: true)
+
+    RegisterGeneratedPlugins(registry: flutterViewController)
+
+    super.awakeFromNib()
+  }
+}
diff --git a/macos/Runner/ReleaseBase.entitlements b/macos/Runner/ReleaseBase.entitlements
new file mode 100644
index 000000000..aef6ac342
--- /dev/null
+++ b/macos/Runner/ReleaseBase.entitlements
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+	<key>keychain-access-groups</key>
+	<array>
+		<string>$(AppIdentifierPrefix)${BUNDLE_ID}</string>
+	</array>
+	<key>com.apple.security.network.client</key>
+    <true/>
+</dict>
+</plist>
diff --git a/pubspec_base.yaml b/pubspec_base.yaml
index 2a1366738..5664f0580 100644
--- a/pubspec_base.yaml
+++ b/pubspec_base.yaml
@@ -32,9 +32,12 @@ dependencies:
   hive: ^2.2.3
   hive_flutter: ^1.1.0
   local_auth: ^2.1.0
+  local_auth_android: 1.0.21
   package_info: ^2.0.0
   #package_info_plus: ^1.4.2
-  devicelocale: ^0.4.3
+  devicelocale:
+    git:
+      url: https://github.com/cake-tech/flutter-devicelocale
   auto_size_text: ^3.0.0
   dotted_border: ^2.0.0+2
   smooth_page_indicator: ^1.0.0+2
@@ -61,22 +64,28 @@ dependencies:
   permission_handler: ^10.0.0
   device_display_brightness: ^0.0.6
   platform_device_id: ^1.0.1
+  wakelock: ^0.6.2
   flutter_mailer: ^2.0.2
-  device_info_plus: ^8.1.0
+  device_info_plus: 8.1.0
+  in_app_review: ^2.0.6
   cake_backup:
     git:
       url: https://github.com/cake-tech/cake_backup.git
       ref: main
       version: 1.0.0
+  flutter_plugin_android_lifecycle: 2.0.9
+  path_provider_android: 2.0.24
+  shared_preferences_android: 2.0.17
+  url_launcher_android: 6.0.24
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  build_runner: ^2.1.11
+  build_runner: ^2.3.3
   mobx_codegen: ^2.1.1
   build_resolvers: ^2.0.9
   hive_generator: ^1.1.3
-  flutter_launcher_icons: ^0.9.3
+  flutter_launcher_icons: ^0.11.0
   # check flutter_launcher_icons for usage
   pedantic: ^1.8.0
   # replace https://github.com/dart-lang/lints#migrating-from-packagepedantic
@@ -85,6 +94,9 @@ flutter_icons:
   image_path: "assets/images/app_logo.png"
   android: true
   ios: true
+  macos:
+    generate: true
+    image_path: "assets/images/app_logo.png"
 
 flutter:
   uses-material-design: true
diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb
index e06846872..0caa02094 100644
--- a/res/values/strings_ar.arb
+++ b/res/values/strings_ar.arb
@@ -150,7 +150,7 @@
    "receive_amount":"المقدار",
    "subaddresses":"العناوين الفرعية",
    "addresses":"عناوين",
-   "scan_qr_code":"امسح ال QR للحصول على العنوان",
+   "scan_qr_code_to_get_address":"امسح ال QR للحصول على العنوان",
    "qr_fullscreen":"انقر لفتح ال QR بملء الشاشة",
    "rename":"إعادة تسمية",
    "choose_account":"اختر حساب",
@@ -479,8 +479,8 @@
    "xrp_extra_info":"من فضلك لا تنس تحديد علامة الوجهة أثناء إرسال معاملة XRP للتبادل",
 
    "exchange_incorrect_current_wallet_for_xmr":"إذا كنت ترغب في استبدال XMR من رصيد Cake Wallet Monero ، فيرجى التبديل إلى محفظة Monero أولاً.",
-   "confirmed":"مؤكد",
-   "unconfirmed":"غير مؤكد",
+   "confirmed":"رصيد مؤكد",
+   "unconfirmed":"رصيد غير مؤكد",
    "displayable":"قابل للعرض",
 
    "submit_request":"تقديم طلب",
@@ -683,8 +683,14 @@
    "arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان",
    "do_not_send": "لا ترسل",
    "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق.",
+   "scan_qr_code": "امسح رمز QR ضوئيًا",
+   "cold_or_recover_wallet": "أضف محفظة باردة أو استعد محفظة ورقية",
+   "please_wait": "انتظر من فضلك",
+   "sweeping_wallet": "كنس المحفظة",
+   "sweeping_wallet_alert": "لن يستغرق هذا وقتًا طويلاً. لا تترك هذه الشاشة وإلا فقد يتم فقد أموال سويبت",
    "decimal_places_error": "عدد كبير جدًا من المنازل العشرية",
    "edit_node": "تحرير العقدة",
+   "frozen_balance": "الرصيد المجمد",
    "invoice_details": "تفاصيل الفاتورة",
    "donation_link_details": "تفاصيل رابط التبرع",
    "anonpay_description": "توليد ${type}. يمكن للمستلم ${method} بأي عملة مشفرة مدعومة ، وستتلقى أموالاً في هذه",
@@ -695,5 +701,10 @@
    "optional_name": "اسم المستلم الاختياري",
    "clearnet_link": "رابط Clearnet",
    "onion_link": "رابط البصل",
-   "sell_monero_com_alert_content": "بيع Monero غير مدعوم حتى الآن"
+   "settings": "إعدادات",
+   "sell_monero_com_alert_content": "بيع Monero غير مدعوم حتى الآن",
+   "error_text_input_below_minimum_limit":" المبلغ أقل من الحد الأدنى",
+   "error_text_input_above_maximum_limit":"المبلغ أكبر من الحد الأقصى",
+   "show_market_place": "إظهار السوق",
+   "prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة"
 }
diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb
index c879f4d42..66a211ed9 100644
--- a/res/values/strings_bg.arb
+++ b/res/values/strings_bg.arb
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Не забравяйте да дадете Destination Tag-а, когато изпращате XRP транзакцията за обмена",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Ако искате да обмените XMR от своя Cake Wallet Monero баланс, първо изберете своя Monero портфейл.",
-  "confirmed" : "Потвърдено",
-  "unconfirmed" : "Непотвърдено",
+  "confirmed" : "Потвърден баланс",
+  "unconfirmed" : "Непотвърден баланс",
   "displayable" : "Възможност за показване",
 
   "submit_request" : "изпращане на заявка",
@@ -687,6 +687,7 @@
   "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението.",
   "decimal_places_error": "Твърде много знаци след десетичната запетая",
   "edit_node": "Редактиране на възел",
+  "frozen_balance": "Замразен баланс",
   "invoice_details": "IДанни за фактура",
   "donation_link_details": "Подробности за връзката за дарение",
   "anonpay_description": "Генерирайте ${type}. Получателят може да ${method} с всяка поддържана криптовалута и вие ще получите средства в този портфейл.",
@@ -697,5 +698,9 @@
   "optional_name": "Незадължително име на получател",
   "clearnet_link": "Clearnet връзка",
   "onion_link": "Лукова връзка",
-  "sell_monero_com_alert_content": "Продажбата на Monero все още не се поддържа"
+  "sell_monero_com_alert_content": "Продажбата на Monero все още не се поддържа",
+  "error_text_input_below_minimum_limit" : "Сумата е по-малко от минималната",
+  "error_text_input_above_maximum_limit" : "Сумата надвишава максималната",
+  "show_market_place":"Покажи пазар",
+  "prevent_screenshots": "Предотвратете екранни снимки и запис на екрана"
 }
diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb
index e8ce7f25c..381e7c18e 100644
--- a/res/values/strings_cs.arb
+++ b/res/values/strings_cs.arb
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Prosím nezapomeňte zadat Destination Tag, když posíláte XRP transakce ke směně",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Pokud chcete směnit XMR z Monero částky v Cake Wallet, prosím přepněte se nejprve do své Monero peněženky.",
-  "confirmed" : "Potvrzeno",
-  "unconfirmed" : "Nepotvrzeno",
+  "confirmed" : "Potvrzený zůstatek",
+  "unconfirmed" : "Nepotvrzený zůstatek",
   "displayable" : "Zobrazitelné",
 
   "submit_request" : "odeslat požadavek",
@@ -687,6 +687,7 @@
   "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu.",
   "decimal_places_error": "Příliš mnoho desetinných míst",
   "edit_node": "Upravit uzel",
+  "frozen_balance": "Zmrazená bilance",
   "invoice_details": "detaily faktury",
   "donation_link_details": "Podrobnosti odkazu na darování",
   "anonpay_description": "Vygenerujte ${type}. Příjemce může ${method} s jakoukoli podporovanou kryptoměnou a vy obdržíte prostředky v této peněžence.",
@@ -697,5 +698,9 @@
   "optional_name": "Volitelné jméno příjemce",
   "clearnet_link": "Odkaz na Clearnet",
   "onion_link": "Cibulový odkaz",
-  "sell_monero_com_alert_content": "Prodej Monero zatím není podporován"
+  "sell_monero_com_alert_content": "Prodej Monero zatím není podporován",
+  "error_text_input_below_minimum_limit" : "Částka je menší než minimální hodnota",
+  "error_text_input_above_maximum_limit" : "Částka je větší než maximální hodnota",
+  "show_market_place": "Zobrazit trh",
+  "prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky"
 }
diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb
index 6a8f3c89e..930ed4bac 100644
--- a/res/values/strings_de.arb
+++ b/res/values/strings_de.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Betrag",
   "subaddresses" : "Unteradressen",
   "addresses" : "Adressen",
-  "scan_qr_code" : "Scannen Sie den QR-Code, um die Adresse zu erhalten",
+  "scan_qr_code_to_get_address" : "Scannen Sie den QR-Code, um die Adresse zu erhalten",
   "qr_fullscreen" : "Tippen Sie hier, um den QR-Code im Vollbildmodus zu öffnen",
   "rename" : "Umbenennen",
   "choose_account" : "Konto auswählen",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Bitte vergessen Sie nicht, das Ziel-Tag anzugeben, während Sie die XRP-Transaktion für den Austausch senden",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Wenn Sie XMR von Ihrem Cake Wallet Monero-Guthaben umtauschen möchten, wechseln Sie bitte zuerst zu Ihrer Monero-Wallet.",
-  "confirmed" : "Bestätigt",
-  "unconfirmed" : "Unbestätigt",
+  "confirmed" : "Bestätigter Saldo",
+  "unconfirmed" : "Unbestätigter Saldo",
   "displayable" : "Anzeigebar",
 
   "submit_request" : "Eine Anfrage stellen",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen",
   "do_not_send": "Nicht senden",
   "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern.",
+  "scan_qr_code": "QR-Code scannen",
+  "cold_or_recover_wallet": "Fügen Sie eine Cold Wallet hinzu oder stellen Sie eine Paper Wallet wieder her",
+  "please_wait": "Warten Sie mal",
+  "sweeping_wallet": "Kehre Geldbörse",
+  "sweeping_wallet_alert": "Das sollte nicht lange dauern. VERLASSEN SIE DIESEN BILDSCHIRM NICHT, ANDERNFALLS KÖNNEN DIE SWEPT-GELDER VERLOREN GEHEN",
   "decimal_places_error": "Zu viele Nachkommastellen",
   "edit_node": "Knoten bearbeiten",
+  "frozen_balance": "Gefrorenes Gleichgewicht",
   "invoice_details": "Rechnungs-Details",
   "donation_link_details": "Details zum Spendenlink",
   "anonpay_description": "Generieren Sie ${type}. Der Empfänger kann ${method} mit jeder unterstützten Kryptowährung verwenden, und Sie erhalten Geld in dieser Brieftasche.",
@@ -697,5 +703,10 @@
   "optional_name": "Optionaler Empfängername",
   "clearnet_link": "Clearnet-Link",
   "onion_link": "Zwiebel-Link",
-  "sell_monero_com_alert_content": "Der Verkauf von Monero wird noch nicht unterstützt"
+  "settings": "Einstellungen",
+  "sell_monero_com_alert_content": "Der Verkauf von Monero wird noch nicht unterstützt",
+  "error_text_input_below_minimum_limit" : "Menge ist unter dem Minimum",
+  "error_text_input_above_maximum_limit" : "Menge ist über dem Maximum",
+  "show_market_place": "Marktplatz anzeigen",
+  "prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen"
 }
diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb
index b1bf94690..22cc9b950 100644
--- a/res/values/strings_en.arb
+++ b/res/values/strings_en.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Amount",
   "subaddresses" : "Subaddresses",
   "addresses" : "Addresses",
-  "scan_qr_code" : "Scan the QR code to get the address",
+  "scan_qr_code_to_get_address" : "Scan the QR code to get the address",
   "qr_fullscreen" : "Tap to open full screen QR code",
   "rename" : "Rename",
   "choose_account" : "Choose account",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Please don’t forget to specify the Destination Tag while sending the XRP transaction for the exchange",
 
   "exchange_incorrect_current_wallet_for_xmr" : "If you want to exchange XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.",
-  "confirmed" : "Confirmed",
-  "unconfirmed" : "Unconfirmed",
+  "confirmed" : "Confirmed Balance",
+  "unconfirmed" : "Unconfirmed Balance",
   "displayable" : "Displayable",
 
   "submit_request" : "submit a request",
@@ -685,6 +685,11 @@
   "arrive_in_this_address" : "${currency} ${tag}will arrive in this address",
   "do_not_send": "Don't send",
   "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better.",
+  "scan_qr_code": "Scan QR code",
+  "cold_or_recover_wallet": "Add a cold wallet or recover a paper wallet",
+  "please_wait": "Please wait",
+  "sweeping_wallet": "Sweeping wallet",
+  "sweeping_wallet_alert": "This shouldn’t take long. DO NOT LEAVE THIS SCREEN OR THE SWEPT FUNDS MAY BE LOST.",
   "invoice_details": "Invoice details",
   "donation_link_details": "Donation link details",
   "anonpay_description": "Generate ${type}. The recipient can ${method} with any supported cryptocurrency, and you will receive funds in this wallet.",
@@ -697,5 +702,11 @@
   "onion_link": "Onion link",
   "decimal_places_error": "Too many decimal places",
   "edit_node": "Edit Node",
-  "sell_monero_com_alert_content": "Selling Monero is not supported yet"
+  "frozen_balance": "Frozen Balance",
+  "settings": "Settings",
+  "sell_monero_com_alert_content": "Selling Monero is not supported yet",
+  "error_text_input_below_minimum_limit" : "Amount is less than the minimum",
+  "error_text_input_above_maximum_limit" : "Amount is more than the maximum",
+  "show_market_place" :"Show Marketplace",
+  "prevent_screenshots": "Prevent screenshots and screen recording"
 }
diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb
index 8e9e4992c..9159d7a12 100644
--- a/res/values/strings_es.arb
+++ b/res/values/strings_es.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Cantidad",
   "subaddresses" : "Subdirecciones",
   "addresses" : "Direcciones",
-  "scan_qr_code" : "Escanee el código QR para obtener la dirección",
+  "scan_qr_code_to_get_address" : "Escanee el código QR para obtener la dirección",
   "qr_fullscreen" : "Toque para abrir el código QR en pantalla completa",
   "rename" : "Rebautizar",
   "choose_account" : "Elegir cuenta",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "No olvide especificar la etiqueta de destino al enviar la transacción XRP para el intercambio",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Si desea intercambiar XMR de su saldo de Cake Wallet Monero, primero cambie a su billetera Monero.",
-  "confirmed" : "Confirmada",
-  "unconfirmed" : "Inconfirmado",
+  "confirmed" : "Saldo confirmado",
+  "unconfirmed" : "Saldo no confirmado",
   "displayable" : "Visualizable",
 
   "submit_request" : "presentar una solicitud",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección",
   "do_not_send": "no enviar",
   "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación.",
+  "scan_qr_code": "Escanear código QR",
+  "cold_or_recover_wallet": "Agregue una billetera fría o recupere una billetera de papel",
+  "please_wait": "Espere por favor",
+  "sweeping_wallet": "Billetera de barrido",
+  "sweeping_wallet_alert": "Esto no debería llevar mucho tiempo. NO DEJES ESTA PANTALLA O SE PUEDEN PERDER LOS FONDOS BARRIDOS",
   "decimal_places_error": "Demasiados lugares decimales",
-  "edit_node": "Edit Node",
+  "edit_node": "Editar nodo",
+  "frozen_balance": "Balance congelado",
   "invoice_details": "Detalles de la factura",
   "donation_link_details": "Detalles del enlace de donación",
   "anonpay_description": "Genera ${type}. El destinatario puede ${method} con cualquier criptomoneda admitida, y recibirá fondos en esta billetera.",
@@ -697,5 +703,10 @@
   "optional_name": "Nombre del destinatario opcional",
   "clearnet_link": "enlace Clearnet",
   "onion_link": "Enlace de cebolla",
-  "sell_monero_com_alert_content": "Aún no se admite la venta de Monero"
+  "settings": "Configuraciones",
+  "sell_monero_com_alert_content": "Aún no se admite la venta de Monero",
+  "error_text_input_below_minimum_limit" : "La cantidad es menos que mínima",
+  "error_text_input_above_maximum_limit" : "La cantidad es más que el máximo",
+  "show_market_place": "Mostrar mercado",
+  "prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla"
 }
diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb
index f62096c76..983fc5f46 100644
--- a/res/values/strings_fr.arb
+++ b/res/values/strings_fr.arb
@@ -9,6 +9,8 @@
   "monero_com": "Monero.com par Cake Wallet",
   "monero_com_wallet_text": "Super portefeuille (wallet) pour Monero",
 
+  "haven_app": "Haven par Cake Wallet",
+  "haven_app_wallet_text": "Super portefeuille (wallet) pour Haven",
 
   "accounts" : "Comptes",
   "edit" : "Modifier",
@@ -148,7 +150,7 @@
   "receive_amount" : "Montant",
   "subaddresses" : "Sous-adresses",
   "addresses" : "Adresses",
-  "scan_qr_code" : "Scannez le QR code pour obtenir l'adresse",
+  "scan_qr_code_to_get_address" : "Scannez le QR code pour obtenir l'adresse",
   "qr_fullscreen" : "Appuyez pour ouvrir le QR code en mode plein écran",
   "rename" : "Renommer",
   "choose_account" : "Choisir le compte",
@@ -477,13 +479,13 @@
   "xrp_extra_info" : "Merci de ne pas oublier de spécifier le tag de destination lors de l'envoi de la transaction XRP de l'échange",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Si vous souhaitez échanger des XMR du solde Monero de votre Cake Wallet, merci de sélectionner votre portefeuille (wallet) Monero au préalable.",
-  "confirmed" : "Confirmé",
-  "unconfirmed" : "Non confirmé",
+  "confirmed" : "Solde confirmé",
+  "unconfirmed" : "Solde non confirmé",
   "displayable" : "Visible",
 
   "submit_request" : "soumettre une requête",
 
-  "buy_alert_content" : "Actuellement, nous ne prenons en charge que l'achat de Bitcoin, Litecoin et Monero. Veuillez créer ou basculer vers votre portefeuille Bitcoin, Litecoin ou Monero.",
+  "buy_alert_content" : "Actuellement, nous ne prenons en charge que l'achat de Bitcoin, Litecoin et Monero. Veuillez créer ou basculer vers votre portefeuille (wallet) Bitcoin, Litecoin ou Monero.",
   "sell_alert_content": "Pour le moment nous ne supportons que la vente de Bitcoin. Pour vendre du Bitcoin, merci de créer ou de sélectionner votre portefeuille (wallet) Bitcoin.",
 
   "outdated_electrum_wallet_description" : "Les nouveaux portefeuilles (wallets) Bitcoin créés dans Cake ont dorénavant une phrase secrète (seed) de 24 mots. Il est impératif que vous créiez un nouveau portefeuille Bitcoin, que vous y transfériez tous vos fonds puis que vous cessiez d'utiliser le portefeuille avec une phrase secrète de 12 mots. Merci de faire cela immédiatement pour assurer la sécurité de vos avoirs.",
@@ -548,7 +550,6 @@
   "sign_up": "S'inscrire",
   "forgot_password": "Mot de passe oublié",
   "reset_password": "Réinitialiser le mot de passe",
-  "manage_cards": "Cartes cadeaux",
   "setup_your_debit_card": "Configurer votre carte de débit",
   "no_id_required": "Aucune pièce d'identité requise. Rechargez et dépensez n'importe où",
   "how_to_use_card": "Comment utiliser cette carte",
@@ -561,7 +562,7 @@
   "cakepay_prepaid_card": "Carte de débit prépayée Cake Pay",
   "no_id_needed": "Aucune pièce d'identité nécessaire !",
   "frequently_asked_questions": "Foire aux questions",
-  "debit_card_terms": "Le stockage et l'utilisation de votre numéro de carte de paiement (et des informations d'identification correspondant à votre numéro de carte de paiement) dans ce portefeuille numérique peuvent être soumis aux conditions générales de l'accord du titulaire de carte parfois en vigueur avec l'émetteur de la carte de paiement.",
+  "debit_card_terms": "Le stockage et l'utilisation de votre numéro de carte de paiement (et des informations d'identification correspondant à votre numéro de carte de paiement) dans ce portefeuille (wallet) numérique peuvent être soumis aux conditions générales de l'accord du titulaire de carte parfois en vigueur avec l'émetteur de la carte de paiement.",
   "please_reference_document": "Veuillez vous référer aux documents ci-dessous pour plus d'informations.",
   "cardholder_agreement": "Contrat de titulaire de carte",
   "e_sign_consent": "Consentement de signature électronique",
@@ -597,7 +598,7 @@
   "tip": "Pourboire :",
   "custom": "personnalisé",
   "by_cake_pay": "par Cake Pay",
-  "expire": "Expire",
+  "expires": "Expire",
   "mm": "MM",
   "yy": "AA",
   "online": "En ligne",
@@ -633,6 +634,7 @@
   "gift_card_is_generated": "La carte-cadeau est générée",
   "open_gift_card": "Ouvrir la carte-cadeau",
   "contact_support": "Contacter l'assistance",
+  "gift_cards": "Cartes-Cadeaux",
   "gift_cards_unavailable": "Les cartes-cadeaux ne sont disponibles à l'achat que via Monero, Bitcoin et Litecoin pour le moment",
   "introducing_cake_pay":  "Présentation de Cake Pay !",
   "cake_pay_learn_more": "Achetez et utilisez instantanément des cartes-cadeaux dans l'application !\nBalayer de gauche à droite pour en savoir plus.",
@@ -650,7 +652,7 @@
   "low_fee": "Frais modiques",
   "low_fee_alert": "Vous utilisez actuellement une priorité de frais de réseau peu élevés. Cela pourrait entraîner de longues attentes, des taux différents ou des transactions annulées. Nous vous recommandons de fixer des frais plus élevés pour une meilleure expérience.",
   "ignor": "Ignorer",
-  "use_suggested": "Utilisation suggérée",
+  "use_suggested": "Suivre la suggestion",
   "do_not_share_warning_text" : "Ne les partagez avec personne, y compris avec l'assistance.\n\nVos fonds seraient inmanquablement volés !",
   "help": "aide",
   "all_transactions": "Toutes transactions",
@@ -678,22 +680,33 @@
   "orbot_running_alert": "Veuillez vous assurer qu'Orbot est en cours d'exécution avant de vous connecter à ce nœud.",
   "contact_list_contacts": "Contacts",
   "contact_list_wallets": "Mes portefeuilles (wallets)",
-  "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience! Vous serez averti par e-mail lorsque le paiement sera confirmé.",
-  "send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse",
+  "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience ! Vous serez averti par e-mail lorsque le paiement sera confirmé.",
+  "send_to_this_address" : "Envoyer ${currency} ${tag}à cette adresse",
   "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse",
-  "do_not_send": "N'envoyez pas",
-  "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application.",
+  "do_not_send": "Ne pas envoyer",
+  "error_dialog_content": "Oups, nous avons rencontré une erreur.\n\nMerci d'envoyer le rapport d'erreur à notre équipe d'assistance afin de nous permettre d'améliorer l'application.",
+  "scan_qr_code": "Scannez le code QR",
+  "cold_or_recover_wallet": "Ajoutez un cold wallet ou récupérez un paper wallet",
+  "please_wait": "S'il vous plaît, attendez",
+  "sweeping_wallet": "Portefeuille de balayage",
+  "sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS BALAYÉS POURRAIENT ÊTRE PERDUS",
   "decimal_places_error": "Trop de décimales",
   "edit_node": "Modifier le nœud",
+  "frozen_balance": "Équilibre gelé",
   "invoice_details": "Détails de la facture",
   "donation_link_details": "Détails du lien de don",
-  "anonpay_description": "Générez ${type}. Le destinataire peut ${method} avec n'importe quelle crypto-monnaie prise en charge, et vous recevrez des fonds dans ce portefeuille.",
+  "anonpay_description": "Générez ${type}. Le destinataire peut ${method} avec n'importe quelle crypto-monnaie prise en charge, et vous recevrez des fonds dans ce portefeuille (wallet).",
   "create_invoice": "Créer une facture",
   "create_donation_link": "Créer un lien de don",
   "optional_email_hint": "E-mail de notification du bénéficiaire facultatif",
   "optional_description": "Descriptif facultatif",
   "optional_name": "Nom du destinataire facultatif",
   "clearnet_link": "Lien Clearnet",
-  "onion_link": "Lien d'oignon",
-  "sell_monero_com_alert_content": "La vente de Monero n'est pas encore prise en charge"
+  "settings": "Paramètres",
+  "onion_link": "Lien .onion",
+  "sell_monero_com_alert_content": "La vente de Monero n'est pas encore prise en charge",
+  "error_text_input_below_minimum_limit" : "Le montant est inférieur au minimum",
+  "error_text_input_above_maximum_limit" : "Le montant est supérieur au maximum",
+  "show_market_place" :"Afficher la place de marché",
+  "prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran"
 }
diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb
index ea9a673a8..8b505cff2 100644
--- a/res/values/strings_hi.arb
+++ b/res/values/strings_hi.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "रकम",
   "subaddresses" : "उप पते",
   "addresses" : "पतों",
-  "scan_qr_code" : "पता प्राप्त करने के लिए QR कोड स्कैन करें",
+  "scan_qr_code_to_get_address" : "पता प्राप्त करने के लिए QR कोड स्कैन करें",
   "qr_fullscreen" : "फ़ुल स्क्रीन क्यूआर कोड खोलने के लिए टैप करें",
   "rename" : "नाम बदलें",
   "choose_account" : "खाता चुनें",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "एक्सचेंज के लिए एक्सआरपी लेनदेन भेजते समय कृपया गंतव्य टैग निर्दिष्ट करना न भूलें",
 
   "exchange_incorrect_current_wallet_for_xmr" : "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से एक्सएमआर का आदान-प्रदान करना चाहते हैं, तो कृपया अपने मोनेरो वॉलेट में जाएं।",
-  "confirmed" : "की पुष्टि की",
-  "unconfirmed" : "अपुष्ट",
+  "confirmed" : "पुष्टि की गई शेष राशिी",
+  "unconfirmed" : "अपुष्ट शेष राशि",
   "displayable" : "प्रदर्शन योग्य",
 
   "submit_request" : "एक अनुरोध सबमिट करें",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे",
   "do_not_send": "मत भेजो",
   "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।",
+  "scan_qr_code": "स्कैन क्यू आर कोड",
+  "cold_or_recover_wallet": "कोल्ड वॉलेट जोड़ें या पेपर वॉलेट पुनर्प्राप्त करें",
+  "please_wait": "कृपया प्रतीक्षा करें",
+  "sweeping_wallet": "स्वीपिंग वॉलेट",
+  "sweeping_wallet_alert": "इसमें अधिक समय नहीं लगना चाहिए। इस स्क्रीन को न छोड़ें या स्वैप्ट फंड खो सकते हैं",
   "decimal_places_error": "बहुत अधिक दशमलव स्थान",
   "edit_node": "नोड संपादित करें",
+  "frozen_balance": "जमे हुए संतुलन",
   "invoice_details": "चालान विवरण",
   "donation_link_details": "दान लिंक विवरण",
   "anonpay_description": "${type} उत्पन्न करें। प्राप्तकर्ता किसी भी समर्थित क्रिप्टोकरेंसी के साथ ${method} कर सकता है, और आपको इस वॉलेट में धन प्राप्त होगा।",
@@ -697,5 +703,10 @@
   "optional_name": "वैकल्पिक प्राप्तकर्ता नाम",
   "clearnet_link": "क्लियरनेट लिंक",
   "onion_link": "प्याज का लिंक",
-  "sell_monero_com_alert_content": "मोनेरो बेचना अभी तक समर्थित नहीं है"
+  "settings": "समायोजन",
+  "sell_monero_com_alert_content": "मोनेरो बेचना अभी तक समर्थित नहीं है",
+  "error_text_input_below_minimum_limit" : "राशि न्यूनतम से कम है",
+  "error_text_input_above_maximum_limit" : "राशि अधिकतम से अधिक है",
+  "show_market_place":"बाज़ार दिखाएँ",
+  "prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें"
 }
diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb
index 8a0b4b5ed..f9b5fd0f2 100644
--- a/res/values/strings_hr.arb
+++ b/res/values/strings_hr.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Iznos",
   "subaddresses" : "Podadrese",
   "addresses" : "Adrese",
-  "scan_qr_code" : "Skeniraj QR kod za dobivanje adrese",
+  "scan_qr_code_to_get_address" : "Skeniraj QR kod za dobivanje adrese",
   "qr_fullscreen" : "Dodirnite za otvaranje QR koda preko cijelog zaslona",
   "rename" : "Preimenuj",
   "choose_account" : "Odaberi račun",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Molimo ne zaboravite navesti odredišnu oznaku prilikom slanja XRP transakcije na razmjenu",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Ako želite razmijeniti XMR s vlastitog Monero računa na Cake Wallet novčaniku, molimo prvo se prebacite na svoj Monero novčanik.",
-  "confirmed" : "Potvrđeno",
-  "unconfirmed" : "Nepotvrđeno",
+  "confirmed" : "Potvrđeno stanje",
+  "unconfirmed" : "Nepotvrđeno stanje",
   "displayable" : "Dostupno za prikaz",
 
   "submit_request" : "podnesi zahtjev",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu",
   "do_not_send": "Ne šalji",
   "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.",
+  "scan_qr_code": "Skenirajte QR kod",
+  "cold_or_recover_wallet": "Dodajte hladni novčanik ili povratite papirnati novčanik",
+  "please_wait": "Molimo pričekajte",
+  "sweeping_wallet": "Čisti novčanik",
+  "sweeping_wallet_alert": "Ovo ne bi trebalo dugo trajati. NE NAPUŠTAJTE OVAJ ZASLON INAČE SE POBREŠENA SREDSTVA MOGU IZGUBITI",
   "decimal_places_error": "Previše decimalnih mjesta",
   "edit_node": "Uredi čvor",
+  "frozen_balance": "Zamrznuti saldo",
   "invoice_details": "Podaci o fakturi",
   "donation_link_details": "Detalji veza za donacije",
   "anonpay_description": "Generiraj ${type}. Primatelj može ${method} s bilo kojom podržanom kriptovalutom, a vi ćete primiti sredstva u ovaj novčanik.",
@@ -697,5 +703,10 @@
   "optional_name": "Izborno ime primatelja",
   "clearnet_link": "Clearnet veza",
   "onion_link": "Poveznica luka",
-  "sell_monero_com_alert_content": "Prodaja Monera još nije podržana"
+  "settings": "Postavke",
+  "sell_monero_com_alert_content": "Prodaja Monera još nije podržana",
+  "error_text_input_below_minimum_limit" : "Iznos je manji od minimalnog",
+  "error_text_input_above_maximum_limit" : "Iznos je veći od maskimalnog",
+  "show_market_place" : "Prikaži tržište",
+  "prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona"
 }
diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb
index 792b828ed..b4dd13356 100644
--- a/res/values/strings_id.arb
+++ b/res/values/strings_id.arb
@@ -466,8 +466,8 @@
   "xrp_extra_info" : "Jangan lupa untuk menentukan Tag Tujuan saat mengirim transaksi XRP untuk pertukaran",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Jika Anda ingin menukar XMR dari saldo Monero Cake Wallet Anda, silakan beralih ke dompet Monero Anda terlebih dahulu.",
-  "confirmed" : "Dikonfirmasi",
-  "unconfirmed" : "Tidak dikonfirmasi",
+  "confirmed" : "Saldo Terkonfirmasi",
+  "unconfirmed" : "Saldo Belum Dikonfirmasi",
   "displayable" : "Dapat ditampilkan",
 
   "submit_request" : "kirim permintaan",
@@ -669,6 +669,7 @@
   "contact_list_wallets": "Dompet Saya",
   "decimal_places_error": "Terlalu banyak tempat desimal",
   "edit_node": "Sunting Node",
+  "frozen_balance": "Saldo Beku",
   "invoice_details": "Detail faktur",
   "donation_link_details": "Detail tautan donasi",
   "anonpay_description": "Hasilkan ${type}. Penerima dapat ${method} dengan cryptocurrency apa pun yang didukung, dan Anda akan menerima dana di dompet ini.",
@@ -679,5 +680,9 @@
   "optional_name": "Nama penerima opsional",
   "clearnet_link": "Tautan clearnet",
   "onion_link": "Tautan bawang",
-  "sell_monero_com_alert_content": "Menjual Monero belum didukung"
+  "sell_monero_com_alert_content": "Menjual Monero belum didukung",
+  "error_text_input_below_minimum_limit" : "Jumlah kurang dari minimal",
+  "error_text_input_above_maximum_limit" : "Jumlah lebih dari maksimal",
+  "show_market_place": "Tampilkan Pasar",
+  "prevent_screenshots": "Cegah tangkapan layar dan perekaman layar"
 }
diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb
index 968fb991d..95ce251bd 100644
--- a/res/values/strings_it.arb
+++ b/res/values/strings_it.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Ammontare",
   "subaddresses" : "Sottoindirizzi",
   "addresses" : "Indirizzi",
-  "scan_qr_code" : "Scansiona il codice QR per ottenere l'indirizzo",
+  "scan_qr_code_to_get_address" : "Scansiona il codice QR per ottenere l'indirizzo",
   "qr_fullscreen" : "Tocca per aprire il codice QR a schermo intero",
   "rename" : "Rinomina",
   "choose_account" : "Scegli account",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Gentilmente ricorda di indicare il Tag di Destinazione quando invii una transazione XRP per lo scambio",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Se vuoi scambiare XMR dal tuo saldo Cake Wallet Monero, gentilmente passa al tuo portafoglio Monero.",
-  "confirmed" : "Confermato",
-  "unconfirmed" : "Non confermato",
+  "confirmed" : "Saldo confermato",
+  "unconfirmed" : "Saldo non confermato",
   "displayable" : "Visualizzabile",
 
   "submit_request" : "invia una richiesta",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo",
   "do_not_send": "Non inviare",
   "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione.",
+  "scan_qr_code": "Scansiona il codice QR",
+  "cold_or_recover_wallet": "Aggiungi un cold wallet o recupera un paper wallet",
+  "please_wait": "Attendere prego",
+  "sweeping_wallet": "Portafoglio ampio",
+  "sweeping_wallet_alert": "Questo non dovrebbe richiedere molto tempo. NON LASCIARE QUESTA SCHERMATA O I FONDI SPAZZATI POTREBBERO ANDARE PERSI",
   "decimal_places_error": "Troppe cifre decimali",
   "edit_node": "Modifica nodo",
+  "frozen_balance": "Equilibrio congelato",
   "invoice_details": "Dettagli della fattura",
   "donation_link_details": "Dettagli del collegamento alla donazione",
   "anonpay_description": "Genera ${type}. Il destinatario può ${method} con qualsiasi criptovaluta supportata e riceverai fondi in questo portafoglio.",
@@ -697,5 +703,10 @@
   "optional_name": "Nome del destinatario facoltativo",
   "clearnet_link": "Collegamento Clearnet",
   "onion_link": "Collegamento a cipolla",
-  "sell_monero_com_alert_content": "La vendita di Monero non è ancora supportata"
+  "settings": "Impostazioni",
+  "sell_monero_com_alert_content": "La vendita di Monero non è ancora supportata",
+  "error_text_input_below_minimum_limit" : "L'ammontare è inferiore al minimo",
+  "error_text_input_above_maximum_limit" : "L'ammontare è superiore al massimo",
+  "show_market_place":"Mostra mercato",
+  "prevent_screenshots": "Impedisci screenshot e registrazione dello schermo"
 }
diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb
index 3c45e803d..c1b78cc64 100644
--- a/res/values/strings_ja.arb
+++ b/res/values/strings_ja.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "量",
   "subaddresses" : "サブアドレス",
   "addresses" : "住所",
-  "scan_qr_code" : "QRコードをスキャンして住所を取得します",
+  "scan_qr_code_to_get_address" : "QRコードをスキャンして住所を取得します",
   "qr_fullscreen" : "タップして全画面QRコードを開く",
   "rename" : "リネーム",
   "choose_account" : "アカウントを選択",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "取引所のXRPトランザクションを送信するときに、宛先タグを指定することを忘れないでください",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet Moneroの残高からXMRを交換する場合は、最初にMoneroウォレットに切り替えてください。",
-  "confirmed" : "確認済み",
-  "unconfirmed" : "未確認",
+  "confirmed" : "確認済み残高",
+  "unconfirmed" : "残高未確認",
   "displayable" : "表示可能",
 
   "submit_request" : "リクエストを送信する",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します",
   "do_not_send": "送信しない",
   "error_dialog_content": "エラーが発生しました。\n\nアプリケーションを改善するために、クラッシュ レポートをサポート チームに送信してください。",
+  "scan_qr_code": "QRコードをスキャン",
+  "cold_or_recover_wallet": "コールド ウォレットを追加するか、ペーパー ウォレットを復元する",
+  "please_wait": "お待ちください",
+  "sweeping_wallet": "スイープウォレット",
+  "sweeping_wallet_alert": "これには時間がかかりません。この画面から離れないでください。そうしないと、スイープ ファンドが失われる可能性があります",
   "decimal_places_error": "小数点以下の桁数が多すぎる",
   "edit_node": "ノードを編集",
+  "frozen_balance": "冷凍残高",
   "invoice_details": "請求の詳細",
   "donation_link_details": "寄付リンクの詳細",
   "anonpay_description": "${type} を生成します。受取人はサポートされている任意の暗号通貨で ${method} でき、あなたはこのウォレットで資金を受け取ります。",
@@ -697,5 +703,10 @@
   "optional_name": "オプションの受信者名",
   "clearnet_link": "クリアネット リンク",
   "onion_link": "オニオンリンク",
-  "sell_monero_com_alert_content": "モネロの販売はまだサポートされていません"
+  "settings": "設定",
+  "sell_monero_com_alert_content": "モネロの販売はまだサポートされていません",
+  "error_text_input_below_minimum_limit" : "金額は最小額より少ない",
+  "error_text_input_above_maximum_limit" : "金額は最大値を超えています",
+  "show_market_place":"マーケットプレイスを表示",
+  "prevent_screenshots": "スクリーンショットと画面録画を防止する"
 }
diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb
index 1535f54b2..f2e03ed55 100644
--- a/res/values/strings_ko.arb
+++ b/res/values/strings_ko.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "양",
   "subaddresses" : "하위 주소",
   "addresses" : "구애",
-  "scan_qr_code" : "QR 코드를 스캔하여 주소를 얻습니다.",
+  "scan_qr_code_to_get_address" : "QR 코드를 스캔하여 주소를 얻습니다.",
   "qr_fullscreen" : "전체 화면 QR 코드를 열려면 탭하세요.",
   "rename" : "이름 바꾸기",
   "choose_account" : "계정을 선택하십시오",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "교환을 위해 XRP 트랜잭션을 보내는 동안 대상 태그를 지정하는 것을 잊지 마십시오",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet Monero 잔액에서 XMR을 교환하려면 먼저 Monero 지갑으로 전환하십시오.",
-  "confirmed" : "확인",
-  "unconfirmed" : "미확인",
+  "confirmed" : "확인된 잔액",
+  "unconfirmed" : "확인되지 않은 잔액",
   "displayable" : "표시 가능",
 
   "submit_request" : "요청을 제출",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다",
   "do_not_send": "보내지 마세요",
   "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오.",
+  "scan_qr_code": "QR 코드 스캔",
+  "cold_or_recover_wallet": "콜드 지갑 추가 또는 종이 지갑 복구",
+  "please_wait": "기다리세요",
+  "sweeping_wallet": "스위핑 지갑",
+  "sweeping_wallet_alert": "오래 걸리지 않습니다. 이 화면을 떠나지 마십시오. 그렇지 않으면 스웹트 자금이 손실될 수 있습니다.",
   "decimal_places_error": "소수점 이하 자릿수가 너무 많습니다.",
   "edit_node": "노드 편집",
+  "frozen_balance": "얼어붙은 균형",
   "invoice_details": "인보이스 세부정보",
   "donation_link_details": "기부 링크 세부정보",
   "anonpay_description": "${type} 생성. 수신자는 지원되는 모든 암호화폐로 ${method}할 수 있으며 이 지갑에서 자금을 받게 됩니다.",
@@ -697,5 +703,10 @@
   "optional_name": "선택적 수신자 이름",
   "clearnet_link": "클리어넷 링크",
   "onion_link": "양파 링크",
-  "sell_monero_com_alert_content": "지원되지 않습니다."
+  "settings": "설정",
+  "sell_monero_com_alert_content": "지원되지 않습니다.",
+  "error_text_input_below_minimum_limit" : "금액이 최소보다 적습니다.",
+  "error_text_input_above_maximum_limit" : "금액이 최대 값보다 많습니다.",
+  "show_market_place":"마켓플레이스 표시",
+  "prevent_screenshots": "스크린샷 및 화면 녹화 방지"
 }
diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb
index 5020cc966..c314dfb65 100644
--- a/res/values/strings_my.arb
+++ b/res/values/strings_my.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "ပမာဏ",
   "subaddresses" : "လိပ်စာများ",
   "addresses" : "လိပ်စာများ",
-  "scan_qr_code" : "လိပ်စာရယူရန် QR ကုဒ်ကို စကင်န်ဖတ်ပါ။",
+  "scan_qr_code_to_get_address" : "လိပ်စာရယူရန် QR ကုဒ်ကို စကင်န်ဖတ်ပါ။",
   "qr_fullscreen" : "မျက်နှာပြင်အပြည့် QR ကုဒ်ကိုဖွင့်ရန် တို့ပါ။",
   "rename" : "အမည်ပြောင်းပါ။",
   "choose_account" : "အကောင့်ကို ရွေးပါ။",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "လဲလှယ်မှုအတွက် XRP ငွေလွှဲပို့နေစဉ် Destination Tag ကို သတ်မှတ်ရန် မမေ့ပါနှင့်",
 
   "exchange_incorrect_current_wallet_for_xmr" : "သင်၏ Cake Wallet Monero လက်ကျန်မှ XMR ကိုလဲလှယ်လိုပါက၊ သင်၏ Monero ပိုက်ဆံအိတ်သို့ ဦးစွာပြောင်းပါ။",
-  "confirmed" : "အတည်ပြုခဲ့သည်။",
-  "unconfirmed" : "အတည်မပြုနိုင်ပါ။",
+  "confirmed" : "အတည်ပြုထားသော လက်ကျန်ငွေ",
+  "unconfirmed" : "အတည်မပြုနိုင်သော လက်ကျန်ငွေ",
   "displayable" : "ပြသနိုင်သည်။",
 
   "submit_request" : "တောင်းဆိုချက်တစ်ခုတင်ပြပါ။",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။",
   "do_not_send": "မပို့ပါနှင့်",
   "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။",
+  "scan_qr_code": "QR ကုဒ်ကို စကင်န်ဖတ်ပါ။",
+  "cold_or_recover_wallet": "အေးသောပိုက်ဆံအိတ်ထည့်ပါ သို့မဟုတ် စက္ကူပိုက်ဆံအိတ်ကို ပြန်ယူပါ။",
+  "please_wait": "ကျေးဇူးပြုပြီးခဏစောင့်ပါ",
+  "sweeping_wallet": "ိုက်ဆံအိတ် တံမြက်လှည်း",
+  "sweeping_wallet_alert": "ဒါက ကြာကြာမခံသင့်ပါဘူး။ ဤစခရင်ကို ချန်မထားပါနှင့် သို့မဟုတ် ထုတ်ယူထားသော ရန်ပုံငွေများ ဆုံးရှုံးနိုင်သည်",
   "decimal_places_error": "ဒဿမနေရာများ များလွန်းသည်။",
   "edit_node": "Node ကို တည်းဖြတ်ပါ။",
+  "frozen_balance": "ေးခဲမှူ",
   "invoice_details": "ပြေစာအသေးစိတ်",
   "donation_link_details": "လှူဒါန်းရန်လင့်ခ်အသေးစိတ်",
   "anonpay_description": "${type} ကို ဖန်တီးပါ။ လက်ခံသူက ${method} ကို ပံ့ပိုးပေးထားသည့် cryptocurrency တစ်ခုခုဖြင့် လုပ်ဆောင်နိုင်ပြီး၊ သင်သည် ဤပိုက်ဆံအိတ်တွင် ရံပုံငွေများ ရရှိမည်ဖြစ်သည်။",
@@ -697,5 +703,10 @@
   "optional_name": "ရွေးချယ်နိုင်သော လက်ခံသူအမည်",
   "clearnet_link": "Clearnet လင့်ခ်",
   "onion_link": "ကြက်သွန်လင့်",
-  "sell_monero_com_alert_content": "Monero ရောင်းချခြင်းကို မပံ့ပိုးရသေးပါ။"
+  "settings": "ဆက်တင်များ",
+  "sell_monero_com_alert_content": "Monero ရောင်းချခြင်းကို မပံ့ပိုးရသေးပါ။",
+  "error_text_input_below_minimum_limit" : "ပမာဏသည် အနိမ့်ဆုံးထက်နည်းသည်။",
+  "error_text_input_above_maximum_limit" : "ပမာဏသည် အများဆုံးထက် ပိုများသည်။",
+  "show_market_place":"စျေးကွက်ကိုပြသပါ။",
+  "prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။"
 }
diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb
index 9b19f6e84..734630c96 100644
--- a/res/values/strings_nl.arb
+++ b/res/values/strings_nl.arb
@@ -151,7 +151,7 @@
   "subaddresses" : "Subadressen",
   "rename" : "Hernoemen",
   "addresses" : "Adressen",
-  "scan_qr_code" : "Scan de QR-code om het adres te krijgen",
+  "scan_qr_code_to_get_address" : "Scan de QR-code om het adres te krijgen",
   "qr_fullscreen" : "Tik om de QR-code op volledig scherm te openen",
   "choose_account" : "Kies account",
   "create_new_account" : "Creëer een nieuw account",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Vergeet niet om de Destination Tag op te geven tijdens het verzenden van de XRP-transactie voor de uitwisseling",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Als u XMR wilt omwisselen van uw Cake Wallet Monero-saldo, moet u eerst overschakelen naar uw Monero-portemonnee.",
-  "confirmed" : "Bevestigd",
-  "unconfirmed" : "Niet bevestigd",
+  "confirmed" : "Bevestigd saldo",
+  "unconfirmed" : "Onbevestigd saldo",
   "displayable" : "Weer te geven",
 
   "submit_request" : "een verzoek indienen",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres",
   "do_not_send": "Niet sturen",
   "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren.",
+  "scan_qr_code": "Scan QR-code",
+  "cold_or_recover_wallet": "Voeg een cold wallet toe of herstel een paper wallet",
+  "please_wait": "Even geduld aub",
+  "sweeping_wallet": "Vegende portemonnee",
+  "sweeping_wallet_alert": "Dit duurt niet lang. VERLAAT DIT SCHERM NIET, ANDERS KAN HET SWEPT-GELD VERLOREN WORDEN",
   "decimal_places_error": "Te veel decimalen",
   "edit_node": "Knooppunt bewerken",
+  "frozen_balance": "Bevroren saldo",
   "invoice_details": "Factuurgegevens",
   "donation_link_details": "Details van de donatielink",
   "anonpay_description": "Genereer ${type}. De ontvanger kan ${method} gebruiken met elke ondersteunde cryptocurrency en u ontvangt geld in deze portemonnee",
@@ -697,5 +703,10 @@
   "optional_name": "Optionele naam ontvanger",
   "clearnet_link": "Clearnet-link",
   "onion_link": "Ui koppeling",
-  "sell_monero_com_alert_content": "Het verkopen van Monero wordt nog niet ondersteund"
+  "settings": "Instellingen",
+  "sell_monero_com_alert_content": "Het verkopen van Monero wordt nog niet ondersteund",
+  "error_text_input_below_minimum_limit" : "Bedrag is minder dan minimaal",
+  "error_text_input_above_maximum_limit" : "Bedrag is meer dan maximaal",
+  "show_market_place":"Toon Marktplaats",
+  "prevent_screenshots": "Voorkom screenshots en schermopname"
 }
diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb
index cdc1c916a..23b7bbb61 100644
--- a/res/values/strings_pl.arb
+++ b/res/values/strings_pl.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Ilość",
   "subaddresses" : "Podadresy",
   "addresses" : "Adresy",
-  "scan_qr_code" : "Zeskanuj kod QR, aby uzyskać adres",
+  "scan_qr_code_to_get_address" : "Zeskanuj kod QR, aby uzyskać adres",
   "qr_fullscreen" : "Dotknij, aby otworzyć pełnoekranowy kod QR",
   "rename" : "Zmień nazwę",
   "choose_account" : "Wybierz konto",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Jeśli chcesz wymienić XMR z salda Cake Wallet Monero, najpierw przełącz się na portfel Monero.",
-  "confirmed" : "Potwierdzony",
-  "unconfirmed" : "Niepotwierdzony",
+  "confirmed" : "Potwierdzone saldo",
+  "unconfirmed" : "Niepotwierdzone saldo",
   "displayable" : "Wyświetlane",
 
   "submit_request" : "Złóż wniosek",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres",
   "do_not_send": "Nie wysyłaj",
   "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację.",
+  "scan_qr_code": "Skanowania QR code",
+  "cold_or_recover_wallet": "Dodaj zimny portfel lub odzyskaj portfel papierowy",
+  "please_wait": "Proszę czekać",
+  "sweeping_wallet": "Zamiatanie portfela",
+  "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
   "decimal_places_error": "Za dużo miejsc dziesiętnych",
   "edit_node": "Edytuj węzeł",
+  "frozen_balance": "Zamrożona równowaga",
   "invoice_details": "Dane do faktury",
   "donation_link_details": "Szczegóły linku darowizny",
   "anonpay_description": "Wygeneruj ${type}. Odbiorca może ${method} z dowolną obsługiwaną kryptowalutą, a Ty otrzymasz środki w tym portfelu.",
@@ -697,5 +703,10 @@
   "optional_name": "Opcjonalna nazwa odbiorcy",
   "clearnet_link": "łącze Clearnet",
   "onion_link": "Łącznik cebulowy",
-  "sell_monero_com_alert_content": "Sprzedaż Monero nie jest jeszcze obsługiwana"
+  "settings": "Ustawienia",
+  "sell_monero_com_alert_content": "Sprzedaż Monero nie jest jeszcze obsługiwana",
+  "error_text_input_below_minimum_limit" : "Kwota jest mniejsza niż minimalna",
+  "error_text_input_above_maximum_limit" : "Kwota jest większa niż maksymalna",
+  "show_market_place" : "Pokaż rynek",
+  "prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu"
 }
diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb
index 86a256dcc..0346b1ff4 100644
--- a/res/values/strings_pt.arb
+++ b/res/values/strings_pt.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Quantia",
   "subaddresses" : "Sub-endereços",
   "addresses" : "Endereços",
-  "scan_qr_code" : "Digitalize o código QR para obter o endereço",
+  "scan_qr_code_to_get_address" : "Digitalize o código QR para obter o endereço",
   "qr_fullscreen" : "Toque para abrir o código QR em tela cheia",
   "rename" : "Renomear",
   "choose_account" : "Escolha uma conta",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Não se esqueça de especificar a etiqueta de destino ao enviar a transação XRP para a troca",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Se você deseja trocar o XMR de seu saldo da Carteira Monero Cake, troque primeiro para sua carteira Monero.",
-  "confirmed" : "Confirmada",
-  "unconfirmed" : "Não confirmado",
+  "confirmed" : "Saldo Confirmado",
+  "unconfirmed" : "Saldo não confirmado",
   "displayable" : "Exibível",
 
   "submit_request" : "enviar um pedido",
@@ -684,8 +684,14 @@
   "arrive_in_this_address" : "${currency} ${tag}chegará neste endereço",
   "do_not_send": "não envie",
   "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo.",
+  "scan_qr_code": "Escanear código QR",
+  "cold_or_recover_wallet": "Adicione uma cold wallet ou recupere uma paper wallet",
+  "please_wait": "Por favor, aguarde",
+  "sweeping_wallet": "Carteira varrendo",
+  "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
   "decimal_places_error": "Muitas casas decimais",
   "edit_node": "Editar nó",
+  "frozen_balance": "Saldo Congelado",
   "invoice_details": "Detalhes da fatura",
   "donation_link_details": "Detalhes do link de doação",
   "anonpay_description": "Gere ${type}. O destinatário pode ${method} com qualquer criptomoeda suportada e você receberá fundos nesta carteira.",
@@ -696,5 +702,10 @@
   "optional_name": "Nome do destinatário opcional",
   "clearnet_link": "link clear net",
   "onion_link": "ligação de cebola",
-  "sell_monero_com_alert_content": "A venda de Monero ainda não é suportada"
+  "settings": "Configurações",
+  "sell_monero_com_alert_content": "A venda de Monero ainda não é suportada",
+  "error_text_input_below_minimum_limit" : "O valor é menor que o mínimo",
+  "error_text_input_above_maximum_limit" : "O valor é superior ao máximo",
+  "show_market_place":"Mostrar mercado",
+  "prevent_screenshots": "Evite capturas de tela e gravação de tela"
 }
diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb
index 7707e0003..33058a13e 100644
--- a/res/values/strings_ru.arb
+++ b/res/values/strings_ru.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Сумма",
   "subaddresses" : "Субадреса",
   "addresses" : "Адреса",
-  "scan_qr_code" : "Отсканируйте QR-код для получения адреса",
+  "scan_qr_code_to_get_address" : "Отсканируйте QR-код для получения адреса",
   "qr_fullscreen" : "Нажмите, чтобы открыть полноэкранный QR-код",
   "rename" : "Переименовать",
   "choose_account" : "Выберите аккаунт",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Не забудьте указать целевой тег при отправке транзакции XRP для обмена",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Если вы хотите обменять XMR со своего баланса Monero в Cake Wallet, сначала переключитесь на свой кошелек Monero.",
-  "confirmed" : "Подтверждено",
-  "unconfirmed" : "Неподтвержденный",
+  "confirmed" : "Подтвержденный баланс",
+  "unconfirmed" : "Неподтвержденный баланс",
   "displayable" : "Отображаемый",
 
   "submit_request" : "отправить запрос",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}придет на этот адрес",
   "do_not_send": "Не отправлять",
   "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше.",
+  "scan_qr_code": "Сканировать QR-код",
+  "cold_or_recover_wallet": "Добавьте холодный кошелек или восстановите бумажный кошелек",
+  "please_wait": "Пожалуйста, подождите",
+  "sweeping_wallet": "Подметание кошелька",
+  "sweeping_wallet_alert": "Это не должно занять много времени. НЕ ПОКИДАЙТЕ ЭТОТ ЭКРАН, ИНАЧЕ ВЫЧИСЛЕННЫЕ СРЕДСТВА МОГУТ БЫТЬ ПОТЕРЯНЫ",
   "decimal_places_error": "Слишком много десятичных знаков",
   "edit_node": "Редактировать узел",
+  "frozen_balance": "Замороженный баланс",
   "invoice_details": "Детали счета",
   "donation_link_details": "Информация о ссылке для пожертвований",
   "anonpay_description": "Создайте ${type}. Получатель может использовать ${method} с любой поддерживаемой криптовалютой, и вы получите средства на этот кошелек.",
@@ -697,5 +703,10 @@
   "optional_name": "Необязательное имя получателя",
   "clearnet_link": "Клирнет ссылка",
   "onion_link": "Луковая ссылка",
-  "sell_monero_com_alert_content": "Продажа Monero пока не поддерживается"
+  "settings": "Настройки",
+  "sell_monero_com_alert_content": "Продажа Monero пока не поддерживается",
+  "error_text_input_below_minimum_limit" : "Сумма меньше минимальной",
+  "error_text_input_above_maximum_limit" : "Сумма больше максимальной",
+  "show_market_place":"Показать торговую площадку",
+  "prevent_screenshots": "Предотвратить скриншоты и запись экрана"
 }
diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb
index 01a05204e..f1cc320ac 100644
--- a/res/values/strings_th.arb
+++ b/res/values/strings_th.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "จำนวน",
   "subaddresses" : "ที่อยู่ย่อย",
   "addresses" : "ที่อยู่",
-  "scan_qr_code" : "สแกน QR code เพื่อรับที่อยู่",
+  "scan_qr_code_to_get_address" : "สแกน QR code เพื่อรับที่อยู่",
   "qr_fullscreen" : "แตะเพื่อเปิดหน้าจอ QR code แบบเต็มจอ",
   "rename" : "เปลี่ยนชื่อ",
   "choose_account" : "เลือกบัญชี",
@@ -477,8 +477,8 @@
   "xrp_extra_info": "โปรดอย่าลืมระบุ Destination Tag ในขณะที่ส่งธุรกรรม XRP สำหรับการแลกเปลี่ยน",
 
   "exchange_incorrect_current_wallet_for_xmr" : "หากคุณต้องการแลกเปลี่ยน XMR จากยอดคงเหลือ Monero ใน Cake Wallet ของคุณ กรุณาเปลี่ยนเป็นกระเป๋า Monero ก่อน",
-  "confirmed" : "ได้รับการยืนยัน",
-  "unconfirmed" : "ยังไม่ได้รับการยืนยัน",
+  "confirmed" : "ยอดคงเหลือที่ยืนยันแล้ว",
+  "unconfirmed" : "ยอดคงเหลือที่ไม่ได้รับการยืนยัน",
   "displayable" : "สามารถแสดงได้",
 
   "submit_request" : "ส่งคำขอ",
@@ -683,8 +683,14 @@
   "arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้",
   "do_not_send": "อย่าส่ง",
   "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น",
+  "scan_qr_code": "สแกนรหัส QR",
+  "cold_or_recover_wallet": "เพิ่มกระเป๋าเงินเย็นหรือกู้คืนกระเป๋าเงินกระดาษ",
+  "please_wait": "โปรดรอ",
+  "sweeping_wallet": "กวาดกระเป๋าสตางค์",
+  "sweeping_wallet_alert": "การดำเนินการนี้ใช้เวลาไม่นาน อย่าออกจากหน้าจอนี้ มิฉะนั้นเงินที่กวาดไปอาจสูญหาย",
   "decimal_places_error": "ทศนิยมมากเกินไป",
   "edit_node": "แก้ไขโหนด",
+  "frozen_balance": "ยอดคงเหลือแช่แข็ง",
   "invoice_details": "รายละเอียดใบแจ้งหนี้",
   "donation_link_details": "รายละเอียดลิงค์บริจาค",
   "anonpay_description": "สร้าง ${type} ผู้รับสามารถ ${method} ด้วยสกุลเงินดิจิทัลที่รองรับ และคุณจะได้รับเงินในกระเป๋าสตางค์นี้",
@@ -695,5 +701,10 @@
   "optional_name": "ชื่อผู้รับเพิ่มเติม",
   "clearnet_link": "ลิงค์เคลียร์เน็ต",
   "onion_link": "ลิงค์หัวหอม",
-  "sell_monero_com_alert_content": "ยังไม่รองรับการขาย Monero"
+  "settings": "การตั้งค่า",
+  "sell_monero_com_alert_content": "ยังไม่รองรับการขาย Monero",
+  "error_text_input_below_minimum_limit" : "จำนวนเงินน้อยกว่าขั้นต่ำ",
+  "error_text_input_above_maximum_limit" : "จำนวนเงินสูงกว่าค่าสูงสุด",
+  "show_market_place":"แสดงตลาดกลาง",
+  "prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ"
 }
diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb
index 2df815175..675fbb5aa 100644
--- a/res/values/strings_tr.arb
+++ b/res/values/strings_tr.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Miktar",
   "subaddresses" : "Alt adresler",
   "addresses" : "Adresler",
-  "scan_qr_code" : "Adresi getirmek için QR kodunu tara",
+  "scan_qr_code_to_get_address" : "Adresi getirmek için QR kodunu tara",
   "qr_fullscreen" : "QR kodunu tam ekranda açmak için dokun",
   "rename" : "Yeniden adlandır",
   "choose_account" : "Hesabı seç",
@@ -479,8 +479,8 @@
   "xrp_extra_info" : "Lütfen takas için XRP işlemi gönderirken Hedef Etiketi (Destination Tag) belirtmeyi unutmayın",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet'daki Monero bakiyenizi kullanarak takas yapmak istiyorsan, lütfen önce Monero cüzdanına geç.",
-  "confirmed" : "Onaylı",
-  "unconfirmed" : "Onaylanmamış",
+  "confirmed" : "Onaylanmış Bakiye",
+  "unconfirmed" : "Onaylanmamış Bakiye",
   "displayable" : "Gösterilebilir",
 
   "submit_request" : "talep gönder",
@@ -685,8 +685,14 @@
   "arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak",
   "do_not_send": "Gönderme",
   "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin.",
+  "scan_qr_code": "QR kodunu tarayın",
+  "cold_or_recover_wallet": "Soğuk bir cüzdan ekleyin veya bir kağıt cüzdanı kurtarın",
+  "please_wait": "Lütfen bekleyin",
+  "sweeping_wallet": "Süpürme cüzdanı",
+  "sweeping_wallet_alert": "Bu uzun sürmemeli. BU EKRANDAN BIRAKMAYIN YOKSA SÜPÜRÜLEN FONLAR KAYBOLABİLİR",
   "decimal_places_error": "Çok fazla ondalık basamak",
   "edit_node": "Düğümü Düzenle",
+  "frozen_balance": "Dondurulmuş Bakiye",
   "invoice_details": "fatura detayları",
   "donation_link_details": "Bağış bağlantısı ayrıntıları",
   "anonpay_description": "${type} oluşturun. Alıcı, desteklenen herhangi bir kripto para birimi ile ${method} yapabilir ve bu cüzdanda para alırsınız.",
@@ -697,5 +703,10 @@
   "optional_name": "İsteğe bağlı alıcı adı",
   "clearnet_link": "Net bağlantı",
   "onion_link": "soğan bağlantısı",
-  "sell_monero_com_alert_content": "Monero satışı henüz desteklenmiyor"
+  "settings": "ayarlar",
+  "sell_monero_com_alert_content": "Monero satışı henüz desteklenmiyor",
+  "error_text_input_below_minimum_limit" : "Miktar minimumdan daha azdır",
+  "error_text_input_above_maximum_limit" : "Miktar maksimumdan daha fazla",
+  "show_market_place":"Pazar Yerini Göster",
+  "prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin"
 }
diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb
index ee7c4e507..affdda645 100644
--- a/res/values/strings_uk.arb
+++ b/res/values/strings_uk.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "Сума",
   "subaddresses" : "Субадреси",
   "addresses" : "Адреси",
-  "scan_qr_code" : "Скануйте QR-код для одержання адреси",
+  "scan_qr_code_to_get_address" : "Скануйте QR-код для одержання адреси",
   "qr_fullscreen" : "Торкніться, щоб відкрити QR-код на весь екран",
   "rename" : "Перейменувати",
   "choose_account" : "Оберіть акаунт",
@@ -478,8 +478,8 @@
   "xrp_extra_info" : "Будь ласка, не забудьте вказати тег призначення під час надсилання XRP-транзакції для обміну",
 
   "exchange_incorrect_current_wallet_for_xmr" : "Якщо ви хочете обміняти XMR із вашого балансу Cake Wallet Monero, спочатку перейдіть на свій гаманець Monero.",
-  "confirmed" : "Підтверджено",
-  "unconfirmed" : "Непідтверджений",
+  "confirmed" : "Підтверджений баланс",
+  "unconfirmed" : "Непідтверджений баланс",
   "displayable" : "Відображуваний",
 
   "submit_request" : "надіслати запит",
@@ -684,8 +684,14 @@
   "arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу",
   "do_not_send": "Не надсилайте",
   "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток.",
+  "scan_qr_code": "Відскануйте QR-код",
+  "cold_or_recover_wallet": "Додайте холодний гаманець або відновіть паперовий гаманець",
+  "please_wait": "Будь ласка, зачекайте",
+  "sweeping_wallet": "Підмітаня гаманця",
+  "sweeping_wallet_alert": "Це не повинно зайняти багато часу. НЕ ЗАЛИШАЙТЕ ЦЬОГО ЕКРАНУ, АБО КОШТИ МОЖУТЬ БУТИ ВТРАЧЕНІ",
   "decimal_places_error": "Забагато знаків після коми",
   "edit_node": "Редагувати вузол",
+  "frozen_balance": "Заморожений баланс",
   "invoice_details": "Реквізити рахунку-фактури",
   "donation_link_details": "Деталі посилання для пожертв",
   "anonpay_description": "Згенерувати ${type}. Одержувач може ${method} будь-якою підтримуваною криптовалютою, і ви отримаєте кошти на цей гаманець.",
@@ -696,5 +702,10 @@
   "optional_name": "Додаткове ім'я одержувача",
   "clearnet_link": "Посилання Clearnet",
   "onion_link": "Посилання на цибулю",
-  "sell_monero_com_alert_content": "Продаж Monero ще не підтримується"
+  "settings": "Налаштування",
+  "sell_monero_com_alert_content": "Продаж Monero ще не підтримується",
+  "error_text_input_below_minimum_limit" : "Сума менша мінімальної",
+  "error_text_input_above_maximum_limit" : "Сума більше максимальної",
+  "show_market_place":"Відображати маркетплейс",
+  "prevent_screenshots": "Запобігати знімкам екрана та запису екрана"
 }
diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb
index 7c46baf40..2e88a0bd6 100644
--- a/res/values/strings_ur.arb
+++ b/res/values/strings_ur.arb
@@ -481,8 +481,8 @@
   "xrp_extra_info" : "ایکسچینج کے لیے XRP ٹرانزیکشن بھیجتے وقت ڈیسٹینیشن ٹیگ بتانا نہ بھولیں۔",
 
   "exchange_incorrect_current_wallet_for_xmr" : "اگر آپ اپنے Cake والیٹ Monero بیلنس سے XMR کا تبادلہ کرنا چاہتے ہیں، تو براہ کرم پہلے اپنے Monero والیٹ پر جائیں۔",
-  "confirmed" : "تصدیق شدہ",
-  "unconfirmed" : "غیر تصدیق شدہ",
+  "confirmed" : "تصدیق شدہ بیلنس",
+  "unconfirmed" : "غیر تصدیق شدہ بیلنس",
   "displayable" : "قابل نمائش",
 
   "submit_request" : "درخواست بھیج دو",
@@ -688,6 +688,7 @@
   "error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔",
   "decimal_places_error": "بہت زیادہ اعشاریہ جگہیں۔",
   "edit_node": "نوڈ میں ترمیم کریں۔",
+  "frozen_balance": "منجمد بیلنس",
   "invoice_details": "رسید کی تفصیلات",
   "donation_link_details": "عطیہ کے لنک کی تفصیلات",
   "anonpay_description": "${type} بنائیں۔ وصول کنندہ کسی بھی تعاون یافتہ کرپٹو کرنسی کے ساتھ ${method} کرسکتا ہے، اور آپ کو اس بٹوے میں فنڈز موصول ہوں گے۔",
@@ -698,5 +699,9 @@
   "optional_name": "اختیاری وصول کنندہ کا نام",
   "clearnet_link": "کلیرنیٹ لنک",
   "onion_link": "پیاز کا لنک",
-  "sell_monero_com_alert_content": "Monero فروخت کرنا ابھی تک تعاون یافتہ نہیں ہے۔"
+  "sell_monero_com_alert_content": "Monero فروخت کرنا ابھی تک تعاون یافتہ نہیں ہے۔",
+  "error_text_input_below_minimum_limit" : "رقم کم از کم سے کم ہے۔",
+  "error_text_input_above_maximum_limit" : "رقم زیادہ سے زیادہ سے زیادہ ہے۔",
+  "show_market_place":"بازار دکھائیں۔",
+  "prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔"
 }
diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb
index fcaf66b6a..10a7d89f2 100644
--- a/res/values/strings_zh.arb
+++ b/res/values/strings_zh.arb
@@ -150,7 +150,7 @@
   "receive_amount" : "金额",
   "subaddresses" : "子地址",
   "addresses" : "地址",
-  "scan_qr_code" : "扫描二维码获取地址",
+  "scan_qr_code_to_get_address" : "扫描二维码获取地址",
   "qr_fullscreen" : "点击打开全屏二维码",
   "rename" : "重命名",
   "choose_account" : "选择账户",
@@ -478,8 +478,8 @@
   "xrp_extra_info" : "发送用于交换的XRP交易时,请不要忘记指定目标Tag",
 
   "exchange_incorrect_current_wallet_for_xmr" : "如果要从Cake Wallet Monero余额中兑换XMR,请先切换到Monero钱包。",
-  "confirmed" : "已确认",
-  "unconfirmed" : "未经证实",
+  "confirmed" : "确认余额",
+  "unconfirmed" : "未确认余额",
   "displayable" : "可显示",
 
   "submit_request" : "提交请求",
@@ -684,8 +684,14 @@
   "arrive_in_this_address" : "${currency} ${tag}将到达此地址",
   "do_not_send": "不要发送",
   "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。",
+  "scan_qr_code": "扫描二维码",
+  "cold_or_recover_wallet": "添加冷钱包或恢复纸钱包",
+  "please_wait": "请稍等",
+  "sweeping_wallet": "扫一扫钱包",
+  "sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失所掠取的资金",
   "decimal_places_error": "小数位太多",
   "edit_node": "编辑节点",
+  "frozen_balance": "冻结余额",
   "invoice_details": "发票明细",
   "donation_link_details": "捐赠链接详情",
   "anonpay_description": "生成 ${type}。收款人可以使用任何受支持的加密货币 ${method},您将在此钱包中收到资金。",
@@ -696,5 +702,10 @@
   "optional_name": "可选收件人姓名",
   "clearnet_link": "明网链接",
   "onion_link": "洋葱链接",
-  "sell_monero_com_alert_content": "尚不支持出售门罗币"
+  "settings": "设置",
+  "sell_monero_com_alert_content": "尚不支持出售门罗币",
+  "error_text_input_below_minimum_limit" : "金额小于最小值",
+  "error_text_input_above_maximum_limit" : "金额大于最大值",
+  "show_market_place" :"显示市场",
+  "prevent_screenshots": "防止截屏和录屏"
 }
diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh
index 298bb69f4..72d3aabfc 100644
--- a/scripts/android/app_env.sh
+++ b/scripts/android/app_env.sh
@@ -14,14 +14,14 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
 APP_ANDROID_TYPE=$1
 
 MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="1.3.2"
-MONERO_COM_BUILD_NUMBER=42
+MONERO_COM_VERSION="1.3.5"
+MONERO_COM_BUILD_NUMBER=48
 MONERO_COM_BUNDLE_ID="com.monero.app"
 MONERO_COM_PACKAGE="com.monero.app"
 
 CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.6.2"
-CAKEWALLET_BUILD_NUMBER=151
+CAKEWALLET_VERSION="4.6.4"
+CAKEWALLET_BUILD_NUMBER=158
 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
 CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
 
diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh
index 998e48b68..412ec5aa9 100644
--- a/scripts/ios/app_env.sh
+++ b/scripts/ios/app_env.sh
@@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
 APP_IOS_TYPE=$1
 
 MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="1.3.2"
-MONERO_COM_BUILD_NUMBER=40
+MONERO_COM_VERSION="1.3.5"
+MONERO_COM_BUILD_NUMBER=46
 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
 
 CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.6.2"
-CAKEWALLET_BUILD_NUMBER=145
+CAKEWALLET_VERSION="4.6.4"
+CAKEWALLET_BUILD_NUMBER=153
 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
 
 HAVEN_NAME="Haven"
diff --git a/scripts/macos/app_config.sh b/scripts/macos/app_config.sh
new file mode 100755
index 000000000..231945659
--- /dev/null
+++ b/scripts/macos/app_config.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+CAKEWALLET="cakewallet"
+DIR=`pwd`
+
+if [ -z "$APP_MACOS_TYPE" ]; then
+        echo "Please set APP_MACOS_TYPE"
+        exit 1
+fi
+
+cd ../.. # go to root
+cp -rf ./macos/Runner/InfoBase.plist ./macos/Runner/Info.plist
+/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier ${APP_MACOS_BUNDLE_ID}" ./macos/Runner/Info.plist
+/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${APP_MACOS_VERSION}" ./macos/Runner/Info.plist
+/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${APP_MACOS_BUILD_NUMBER}" ./macos/Runner/Info.plist
+
+# Fill entitlements Bundle ID
+cp -rf ./macos/Runner/DebugProfileBase.entitlements ./macos/Runner/DebugProfile.entitlements
+cp -rf ./macos/Runner/ReleaseBase.entitlements ./macos/Runner/Release.entitlements
+sed -i '' "s/\${BUNDLE_ID}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/DebugProfile.entitlements
+sed -i '' "s/\${BUNDLE_ID}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/Release.entitlements
+CONFIG_ARGS=""
+
+case $APP_MACOS_TYPE in
+        $CAKEWALLET)
+		CONFIG_ARGS="--monero --bitcoin";; #--haven
+esac
+
+cp -rf pubspec_description.yaml pubspec.yaml
+flutter pub get
+flutter pub run tool/generate_pubspec.dart
+flutter pub get
+flutter packages pub run tool/configure.dart $CONFIG_ARGS
+cd $DIR
\ No newline at end of file
diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh
new file mode 100755
index 000000000..76a32903b
--- /dev/null
+++ b/scripts/macos/app_env.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+APP_MACOS_NAME=""
+APP_MACOS_VERSION=""
+APP_MACOS_BUILD_VERSION=""
+APP_MACOS_BUNDLE_ID=""
+
+CAKEWALLET="cakewallet"
+
+TYPES=($CAKEWALLET)
+APP_MACOS_TYPE=$CAKEWALLET
+
+if [ -n "$1" ]; then
+	APP_MACOS_TYPE=$1
+fi
+
+CAKEWALLET_NAME="Cake Wallet"
+CAKEWALLET_VERSION="1.0.2"
+CAKEWALLET_BUILD_NUMBER=18
+CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
+
+if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
+    echo "Wrong app type."
+    exit 1
+fi
+
+case $APP_MACOS_TYPE in
+	$CAKEWALLET)
+		APP_MACOS_NAME=$CAKEWALLET_NAME
+		APP_MACOS_VERSION=$CAKEWALLET_VERSION
+		APP_MACOS_BUILD_NUMBER=$CAKEWALLET_BUILD_NUMBER
+		APP_MACOS_BUNDLE_ID=$CAKEWALLET_BUNDLE_ID;;
+esac
+
+export APP_MACOS_TYPE
+export APP_MACOS_NAME
+export APP_MACOS_VERSION
+export APP_MACOS_BUILD_NUMBER
+export APP_MACOS_BUNDLE_ID
diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh
new file mode 100755
index 000000000..4116704bf
--- /dev/null
+++ b/scripts/macos/build_all.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+./build_monero_all.sh
\ No newline at end of file
diff --git a/scripts/macos/build_boost_arm64.sh b/scripts/macos/build_boost_arm64.sh
new file mode 100755
index 000000000..11f26040f
--- /dev/null
+++ b/scripts/macos/build_boost_arm64.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_boost_common.sh
+build_boost_arm64
\ No newline at end of file
diff --git a/scripts/macos/build_boost_common.sh b/scripts/macos/build_boost_common.sh
new file mode 100755
index 000000000..0c75be2bd
--- /dev/null
+++ b/scripts/macos/build_boost_common.sh
@@ -0,0 +1,210 @@
+#!/bin/sh
+
+. ./config.sh
+
+# Boost combined
+
+BOOST_CXXFLAGS_COMBINED="-arch x86_64 -arch arm64"
+BOOST_CFLAGS_COMBINED="-arch x86_64 -arch arm64"
+BOOST_LINKFLAGS_COMBINED="-arch x86_64 -arch arm64"
+
+# Boost arm64
+
+BOOST_CXXFLAGS_ARM64="-arch arm64"
+BOOST_CFLAGS_ARM64="-arch arm64"
+BOOST_LINKFLAGS_ARM64="-arch arm64"
+
+# Boost x86_64
+
+BOOST_CXXFLAGS_X86_64="-arch x86_64"
+BOOST_CFLAGS_X86_64="-arch x86_64"
+BOOST_LINKFLAGS_X86_64="-arch x86_64"
+
+# Boost B2 arm64
+
+BOOST_B2_CXXFLAGS_ARM_64="-arch arm64"
+BOOST_B2_CFLAGS_ARM_64="-arch arm64"
+BOOST_B2_LINKFLAGS_ARM_64="-arch arm64"
+BOOST_B2_BUILD_DIR_ARM_64=macos-arm64
+
+# Boost B2 x86_64
+
+BOOST_B2_CXXFLAGS_X86_64="-arch x86_64"
+BOOST_B2_CFLAGS_X86_64="-arch x86_64"
+BOOST_B2_LINKFLAGS_X86_64="-arch x86_64"
+BOOST_B2_BUILD_DIR_X86_64=macos-x86_64
+
+build_boost_init_common() {
+	CXXFLAGS=$1
+	CFLAGS=$2
+	LINKFLAGS=$3
+	BOOST_SRC_DIR=${EXTERNAL_MACOS_SOURCE_DIR}/boost_1_72_0
+	BOOST_FILENAME=boost_1_72_0.tar.bz2
+	BOOST_VERSION=1.72.0
+	BOOST_FILE_PATH=${EXTERNAL_MACOS_SOURCE_DIR}/${BOOST_FILENAME}
+	BOOST_SHA256="59c9b274bc451cf91a9ba1dd2c7fdcaf5d60b1b3aa83f2c9fa143417cc660722"
+
+	if [ ! -e "$BOOST_FILE_PATH" ]; then
+		curl -L http://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSION}/${BOOST_FILENAME} > $BOOST_FILE_PATH
+	fi
+
+	echo $BOOST_SHA256 *$BOOST_FILE_PATH | shasum -a 256 -c - || exit 1
+
+	cd $EXTERNAL_MACOS_SOURCE_DIR
+	rm -rf $BOOST_SRC_DIR
+	tar -xvf $BOOST_FILE_PATH -C $EXTERNAL_MACOS_SOURCE_DIR
+	cd $BOOST_SRC_DIR
+	./bootstrap.sh --with-toolset=clang-darwin  cxxflags="${CXXFLAGS}" cflags="${CFLAGS}" linkflags="${LINKFLAGS}"
+}
+
+build_boost_init_arm64() {
+	CXXFLAGS="-arch arm64"
+	CFLAGS="-arch arm64"
+	LINKFLAGS="-arch arm64"
+	build_boost_init_common "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}"
+}
+
+build_boost_init_x86_64() {
+	CXXFLAGS="-arch x86_64"
+	CFLAGS="-arch x86_64"
+	LINKFLAGS="-arch x86_64"
+	build_boost_init_common "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}"
+}
+
+build_boost_init_universal() {
+	CXXFLAGS="-arch x86_64 -arch arm64"
+	CFLAGS="-arch x86_64 -arch arm64"
+	LINKFLAGS="-arch x86_64 -arch arm64"
+	build_boost_init_common "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}"
+}
+
+build_boost_compile_common() {
+	ARCH=$1
+	ABI=$2
+	CXXFLAGS=$3
+	CFLAGS=$4
+	LINKFLAGS=$5
+	FLAGS=$6
+	BUILD_DIR=$7
+	./b2 toolset=clang-darwin target-os=darwin architecture="${ARCH}" cxxflags="${CXXFLAGS}" cflags="${CFLAGS}" linkflags="${LINKFLAGS}" abi="${ABI}" "${FLAGS}" -a \
+		--with-chrono \
+		--with-date_time \
+		--with-filesystem \
+		--with-program_options \
+		--with-regex \
+		--with-serialization \
+		--with-system \
+		--with-thread \
+		--with-locale \
+		--build-dir=$BUILD_DIR \
+	    --stagedir=${BUILD_DIR}/stage \
+	    link=static
+}
+
+build_boost_compile_arm64() {
+	ARCH="arm"
+	ABI="aapcs"
+	CXXFLAGS="-arch arm64"
+	CFLAGS="-arch arm64"
+	LINKFLAGS="-arch arm64"
+	FLAGS=""
+	BUILD_DIR="macos-arm64"
+	build_boost_compile_common "${ARCH}" "${ABI}" "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}" "${FLAGS}" "${BUILD_DIR}"
+}
+
+build_boost_compile_x86_64() {
+	ARCH="x86"
+	ABI="sysv"
+	CXXFLAGS="-arch x86_64"
+	CFLAGS="-arch x86_64"
+	LINKFLAGS="-arch x86_64"
+	FLAGS="binary-format=mach-o"
+	BUILD_DIR="macos-x86_64"
+	build_boost_compile_common "${ARCH}" "${ABI}" "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}" "${FLAGS}" "${BUILD_DIR}"
+}
+
+build_boost_compile_universal() {
+	ARCHES=(arm x86)
+	for ARCH in ${ARCHES[@]}; do
+		ABI=""
+		CXXFLAGS=""
+		CFLAGS=""
+		LINKFLAGS=""
+		FLAGS=""
+		BUILD_DIR=""
+
+		case $ARCH in
+			arm)
+				ABI="aapcs"
+				CXXFLAGS="-arch arm64"
+				CFLAGS="-arch arm64"
+				LINKFLAGS="-arch arm64"
+				FLAGS=""
+				BUILD_DIR="macos-arm64";;
+			x86)
+				ABI="sysv"
+				CXXFLAGS="-arch x86_64"
+				CFLAGS="-arch x86_64"
+				LINKFLAGS="-arch x86_64"
+				FLAGS="binary-format=mach-o"
+				BUILD_DIR="macos-x86_64"
+		esac
+
+		build_boost_compile_common "${ARCH}" "${ABI}" "${CXXFLAGS}" "${CFLAGS}" "${LINKFLAGS}" "${FLAGS}" "${BUILD_DIR}"
+	done
+}
+
+build_boost_install_common() {
+	ARCH=$1
+	LIB_DIR=""
+	mkdir $EXTERNAL_MACOS_LIB_DIR
+	mkdir $EXTERNAL_MACOS_INCLUDE_DIR
+
+	case $ARCH in
+		arm64) LIB_DIR="${BOOST_B2_BUILD_DIR_ARM_64}/stage/lib";;
+		x86_64) LIB_DIR="${BOOST_B2_BUILD_DIR_X86_64}/stage/lib";;
+		*) LIB_DIR="lib";;
+	esac
+
+	cp -r ${LIB_DIR}/*.a ${EXTERNAL_MACOS_LIB_DIR}
+	cp -r boost ${EXTERNAL_MACOS_INCLUDE_DIR}
+}
+
+build_boost_install_arm64() {
+	ARCH="arm64"
+	build_boost_install_common $ARCH
+}
+
+build_boost_install_x86_64() {
+	ARCH="x86_64"
+	build_boost_install_common $ARCH
+}
+
+build_boost_install_universal() {
+	mkdir lib
+
+	for blib in ${BOOST_B2_BUILD_DIR_ARM_64}/stage/lib/*.a; do 
+	  lipo -create -arch arm64 $blib -arch x86_64 ${BOOST_B2_BUILD_DIR_X86_64}/stage/lib/$(basename $blib) -output lib/$(basename $blib); 
+	done
+
+	cp -r lib/* ${EXTERNAL_MACOS_LIB_DIR}
+	cp -r boost ${EXTERNAL_MACOS_INCLUDE_DIR}
+}
+
+build_boost_arm64() {
+	build_boost_init_arm64
+	build_boost_compile_arm64
+	build_boost_install_arm64
+}
+
+build_boost_x86_64() {
+	build_boost_init_x86_64
+	build_boost_compile_x86_64
+	build_boost_install_x86_64
+}
+
+build_boost_universal() {
+	build_boost_init_universal
+	build_boost_compile_universal
+	build_boost_install_universal
+}
\ No newline at end of file
diff --git a/scripts/macos/build_boost_universal.sh b/scripts/macos/build_boost_universal.sh
new file mode 100755
index 000000000..0b5945aec
--- /dev/null
+++ b/scripts/macos/build_boost_universal.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_boost_common.sh
+build_boost_universal
\ No newline at end of file
diff --git a/scripts/macos/build_boost_x86_64.sh b/scripts/macos/build_boost_x86_64.sh
new file mode 100755
index 000000000..a697b7027
--- /dev/null
+++ b/scripts/macos/build_boost_x86_64.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_boost_common.sh
+build_boost_x86_64
\ No newline at end of file
diff --git a/scripts/macos/build_expat.sh b/scripts/macos/build_expat.sh
new file mode 100755
index 000000000..0c5857907
--- /dev/null
+++ b/scripts/macos/build_expat.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+. ./config.sh
+
+EXPAT_VERSION=R_2_4_8
+EXPAT_HASH="3bab6c09bbe8bf42d84b81563ddbcf4cca4be838"
+EXPAT_SRC_DIR=${EXTERNAL_MACOS_SOURCE_DIR}/libexpat
+
+git clone https://github.com/libexpat/libexpat.git -b ${EXPAT_VERSION} ${EXPAT_SRC_DIR}
+cd $EXPAT_SRC_DIR
+test `git rev-parse HEAD` = ${EXPAT_HASH} || exit 1
+cd $EXPAT_SRC_DIR/expat
+
+./buildconf.sh
+./configure --enable-static --disable-shared --prefix=${EXTERNAL_MACOS_DIR}
+make
+make install
\ No newline at end of file
diff --git a/scripts/macos/build_haven.sh b/scripts/macos/build_haven.sh
new file mode 100755
index 000000000..fb67da442
--- /dev/null
+++ b/scripts/macos/build_haven.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+. ./config.sh
+
+HAVEN_URL="https://github.com/haven-protocol-org/haven-main.git"
+HAVEN_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/haven"
+HAVEN_VERSION=tags/v3.0.0
+BUILD_TYPE=release
+PREFIX=${EXTERNAL_MACOS_DIR}
+DEST_LIB_DIR=${EXTERNAL_MACOS_LIB_DIR}/haven
+DEST_INCLUDE_DIR=${EXTERNAL_MACOS_INCLUDE_DIR}/haven
+ARCH=`uname -m`
+
+echo "Cloning haven from - $HAVEN_URL to - $HAVEN_DIR_PATH"		
+git clone $HAVEN_URL $HAVEN_DIR_PATH
+cd $HAVEN_DIR_PATH
+git checkout $HAVEN_VERSION
+git submodule update --init --force
+mkdir -p build
+cd ..
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+if [ -z $INSTALL_PREFIX ]; then
+    INSTALL_PREFIX=${ROOT_DIR}/haven
+fi
+
+mkdir -p $DEST_LIB_DIR
+mkdir -p $DEST_INCLUDE_DIR
+
+echo "Building MACOS ${ARCH}"
+export CMAKE_INCLUDE_PATH="${PREFIX}/include"
+export CMAKE_LIBRARY_PATH="${PREFIX}/lib"
+rm -rf haven/build > /dev/null
+
+mkdir -p haven/build/${BUILD_TYPE}
+pushd haven/build/${BUILD_TYPE}
+cmake -DARCH=${ARCH} \
+	-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
+	-DSTATIC=ON \
+	-DBUILD_GUI_DEPS=ON \
+	-DINSTALL_VENDORED_LIBUNBOUND=ON \
+	-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}  \
+    -DUSE_DEVICE_TREZOR=OFF \
+	../..
+make -j4 && make install
+find . -path ./lib -prune -o -name '*.a' -exec cp '{}' lib \;
+cp -r ./lib/* $DEST_LIB_DIR
+cp ../../src/wallet/api/wallet2_api.h  $DEST_INCLUDE_DIR
+popd
+
diff --git a/scripts/macos/build_monero.sh b/scripts/macos/build_monero.sh
new file mode 100755
index 000000000..4dc9a9137
--- /dev/null
+++ b/scripts/macos/build_monero.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+. ./config.sh
+
+MONERO_URL="https://github.com/cake-tech/monero.git"
+MONERO_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/monero"
+MONERO_VERSION=release-v0.18.0.0
+BUILD_TYPE=release
+PREFIX=${EXTERNAL_MACOS_DIR}
+DEST_LIB_DIR=${EXTERNAL_MACOS_LIB_DIR}/monero
+DEST_INCLUDE_DIR=${EXTERNAL_MACOS_INCLUDE_DIR}/monero
+ARCH=`uname -m`
+
+echo "Cloning monero from - $MONERO_URL to - $MONERO_DIR_PATH"		
+git clone $MONERO_URL $MONERO_DIR_PATH
+cd $MONERO_DIR_PATH
+git checkout $MONERO_VERSION
+git submodule update --init --force
+mkdir -p build
+cd ..
+
+mkdir -p $DEST_LIB_DIR
+mkdir -p $DEST_INCLUDE_DIR
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+if [ -z $INSTALL_PREFIX ]; then
+    INSTALL_PREFIX=${ROOT_DIR}/monero
+fi
+
+echo "Building MACOS ${ARCH}"
+export CMAKE_INCLUDE_PATH="${PREFIX}/include"
+export CMAKE_LIBRARY_PATH="${PREFIX}/lib"
+rm -r monero/build > /dev/null
+
+if [ "${ARCH}" == "x86_64" ]; then
+	ARCH="x86-64"
+fi
+
+mkdir -p monero/build/${BUILD_TYPE}
+pushd monero/build/${BUILD_TYPE}
+cmake -DARCH=${ARCH} \
+	-DBUILD_64=ON \
+	-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
+	-DSTATIC=ON \
+	-DBUILD_GUI_DEPS=ON \
+	-DUNBOUND_INCLUDE_DIR=${EXTERNAL_MACOS_INCLUDE_DIR} \
+	-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}  \
+    -DUSE_DEVICE_TREZOR=OFF \
+	../..
+make wallet_api -j4
+find . -path ./lib -prune -o -name '*.a' -exec cp '{}' lib \;
+cp -r ./lib/* $DEST_LIB_DIR
+cp ../../src/wallet/api/wallet2_api.h  $DEST_INCLUDE_DIR
+popd
diff --git a/scripts/macos/build_monero_all.sh b/scripts/macos/build_monero_all.sh
new file mode 100755
index 000000000..f7e55909b
--- /dev/null
+++ b/scripts/macos/build_monero_all.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+ARCH=`uname -m`
+
+. ./config.sh
+
+case $ARCH in
+	arm64)
+		./build_openssl_arm64.sh
+		./build_boost_arm64.sh;;
+	x86_64)
+		./build_openssl_x86_64.sh
+		./build_boost_x86_64.sh;;
+esac
+
+./build_zmq.sh
+./build_expat.sh
+./build_unbound.sh
+./build_sodium.sh
+./build_monero.sh
\ No newline at end of file
diff --git a/scripts/macos/build_openssl_arm64.sh b/scripts/macos/build_openssl_arm64.sh
new file mode 100755
index 000000000..fd8d7b2f5
--- /dev/null
+++ b/scripts/macos/build_openssl_arm64.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_openssl_common.sh
+build_openssl_arm64
\ No newline at end of file
diff --git a/scripts/macos/build_openssl_common.sh b/scripts/macos/build_openssl_common.sh
new file mode 100755
index 000000000..fd07312fa
--- /dev/null
+++ b/scripts/macos/build_openssl_common.sh
@@ -0,0 +1,116 @@
+#!/bin/sh
+
+. ./config.sh
+
+OPEN_SSL_DIR_NAME="OpenSSL"
+OPEN_SSL_x86_64_DIR_NAME="${OPEN_SSL_DIR_NAME}-x86_64"
+OPEN_SSL_ARM_DIR_NAME="${OPEN_SSL_DIR_NAME}-arm"
+OPEN_SSL_X86_64_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/${OPEN_SSL_x86_64_DIR_NAME}"
+OPEN_SSL_ARM_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/${OPEN_SSL_ARM_DIR_NAME}"
+
+build_openssl_init_common() {
+	DIR=$1
+	# Use 1.1.1s becasue of https://github.com/openssl/openssl/issues/18720
+	OPENSSL_VERSION="1.1.1s"
+
+	echo "============================ OpenSSL ============================"
+
+	cd $EXTERNAL_MACOS_SOURCE_DIR
+	curl -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz
+	tar -xvzf openssl-$OPENSSL_VERSION.tar.gz
+	rm -rf $DIR
+	rm -rf $OPEN_SSL_DIR_PATH
+	mv openssl-$OPENSSL_VERSION $DIR
+	tar -xvzf openssl-$OPENSSL_VERSION.tar.gz
+	mv openssl-$OPENSSL_VERSION $OPEN_SSL_ARM_DIR_NAME
+}
+
+build_openssl_init_arm64() {
+	DIR=$OPEN_SSL_ARM_DIR_PATH
+	build_openssl_init_common ${DIR}	
+}
+
+build_openssl_init_x86_64() {
+	DIR=$OPEN_SSL_X86_64_DIR_PATH
+	build_openssl_init_common ${DIR}	
+}
+
+build_openssl_compile_common() {
+	ARCH=$1
+	DIR=""
+	XARCH=""
+	case $ARCH in
+		arm64)
+			DIR=$OPEN_SSL_ARM_DIR_PATH
+			XARCH="darwin64-arm64-cc";;
+		x86_64)
+			DIR=$OPEN_SSL_X86_64_DIR_PATH
+			XARCH="darwin64-x86_64-cc";;
+	esac
+
+	echo "Build OpenSSL for ${ARCH}"
+	cd $DIR
+	./Configure $XARCH
+	make
+
+}
+
+build_openssl_compile_arm64() {
+	ARCH=arm64
+	build_openssl_compile_common "${ARCH}"
+}
+
+build_openssl_compile_x86_64() {
+	ARCH=x86_64
+	build_openssl_compile_common "${ARCH}"
+}
+
+build_openssl_install_common() {
+	DIR=$1
+	mv ${DIR}/include/* $EXTERNAL_MACOS_INCLUDE_DIR
+	mv ${DIR}/libcrypto.a ${EXTERNAL_MACOS_LIB_DIR}/libcrypto.a
+	mv ${DIR}/libssl.a ${EXTERNAL_MACOS_LIB_DIR}/libssl.a
+}
+
+build_openssl_install_arm64() {
+	build_openssl_install_common "${OPEN_SSL_ARM_DIR_PATH}"
+}
+
+build_openssl_install_x86_64() {
+	build_openssl_install_common "${OPEN_SSL_X86_64_DIR_PATH}"
+}
+
+build_openssl_install_universal() {
+	OPEN_SSL_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/${OPEN_SSL_DIR_NAME}"
+	mv ${OPEN_SSL_ARM_DIR_PATH}/include/* $OPEN_SSL_DIR_PATH/include
+	build_openssl_install_common "${OPEN_SSL_DIR_PATH}"
+}
+
+build_openssl_arm64() {
+	build_openssl_init_arm64
+	build_openssl_compile_arm64
+	build_openssl_install_arm64
+}
+
+build_openssl_x86_64() {
+	build_openssl_init_x86_64
+	build_openssl_compile_x86_64
+	build_openssl_install_x86_64
+}
+
+build_openssl_combine() {
+	OPEN_SSL_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/${OPEN_SSL_DIR_NAME}"
+	echo "Create universal bin"
+	mkdir -p $OPEN_SSL_DIR_PATH/include
+	lipo -create ${OPEN_SSL_ARM_DIR_PATH}/libcrypto.a ${OPEN_SSL_X86_64_DIR_PATH}/libcrypto.a -output ${OPEN_SSL_DIR_PATH}/libcrypto.a
+	lipo -create ${OPEN_SSL_ARM_DIR_PATH}/libssl.a ${OPEN_SSL_X86_64_DIR_PATH}/libssl.a -output ${OPEN_SSL_DIR_PATH}/libssl.a
+}
+
+build_openssl_universal() {
+	build_openssl_init_arm64
+	build_openssl_compile_arm64
+	build_openssl_init_x86_64
+	build_openssl_compile_x86_64
+	build_openssl_combine
+	build_openssl_install_universal
+}
\ No newline at end of file
diff --git a/scripts/macos/build_openssl_universal.sh b/scripts/macos/build_openssl_universal.sh
new file mode 100755
index 000000000..ba7fc5e4a
--- /dev/null
+++ b/scripts/macos/build_openssl_universal.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_openssl_common.sh
+build_openssl_universal
\ No newline at end of file
diff --git a/scripts/macos/build_openssl_x86_64.sh b/scripts/macos/build_openssl_x86_64.sh
new file mode 100755
index 000000000..6ef326e8a
--- /dev/null
+++ b/scripts/macos/build_openssl_x86_64.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./build_openssl_common.sh
+build_openssl_x86_64
\ No newline at end of file
diff --git a/scripts/macos/build_sodium.sh b/scripts/macos/build_sodium.sh
new file mode 100755
index 000000000..b50d3c2ee
--- /dev/null
+++ b/scripts/macos/build_sodium.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. ./config.sh
+
+SODIUM_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/libsodium"
+SODIUM_URL="https://github.com/jedisct1/libsodium.git"
+
+echo "============================ SODIUM ============================"
+
+echo "Cloning SODIUM from - $SODIUM_URL"
+git clone $SODIUM_URL $SODIUM_PATH --branch stable
+cd $SODIUM_PATH
+./dist-build/osx.sh
+
+mv ${SODIUM_PATH}/libsodium-osx/include/* $EXTERNAL_MACOS_INCLUDE_DIR
+mv ${SODIUM_PATH}/libsodium-osx/lib/* $EXTERNAL_MACOS_LIB_DIR
\ No newline at end of file
diff --git a/scripts/macos/build_unbound.sh b/scripts/macos/build_unbound.sh
new file mode 100755
index 000000000..ed115d464
--- /dev/null
+++ b/scripts/macos/build_unbound.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+. ./config.sh
+
+UNBOUND_VERSION=release-1.16.2
+UNBOUND_HASH="cbed768b8ff9bfcf11089a5f1699b7e5707f1ea5"
+UNBOUND_URL="https://www.nlnetlabs.nl/downloads/unbound/unbound-${UNBOUND_VERSION}.tar.gz"
+UNBOUND_DIR_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/unbound-1.16.2"
+
+echo "============================ Unbound ============================"
+rm -rf ${UNBOUND_DIR_PATH}
+git clone https://github.com/NLnetLabs/unbound.git -b ${UNBOUND_VERSION} ${UNBOUND_DIR_PATH}
+cd $UNBOUND_DIR_PATH
+test `git rev-parse HEAD` = ${UNBOUND_HASH} || exit 1
+
+./configure --prefix="${EXTERNAL_MACOS_DIR}" \
+			--with-ssl="${EXTERNAL_MACOS_DIR}" \
+			--with-libexpat="${EXTERNAL_MACOS_DIR}" \
+			--enable-static \
+			--disable-shared \
+			--disable-flto
+make
+make install
\ No newline at end of file
diff --git a/scripts/macos/build_zmq.sh b/scripts/macos/build_zmq.sh
new file mode 100755
index 000000000..dd5623f06
--- /dev/null
+++ b/scripts/macos/build_zmq.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+. ./config.sh
+
+ZMQ_PATH="${EXTERNAL_MACOS_SOURCE_DIR}/libzmq"
+ZMQ_URL="https://github.com/zeromq/libzmq.git"
+
+echo "============================ ZMQ ============================"
+
+echo "Cloning ZMQ from - $ZMQ_URL"
+git clone $ZMQ_URL $ZMQ_PATH
+cd $ZMQ_PATH
+mkdir cmake-build
+cd cmake-build
+cmake .. -DCMAKE_INSTALL_PREFIX="${EXTERNAL_MACOS_DIR}"
+make
+make install
\ No newline at end of file
diff --git a/scripts/macos/cakewallet.sh b/scripts/macos/cakewallet.sh
new file mode 100755
index 000000000..5f591327e
--- /dev/null
+++ b/scripts/macos/cakewallet.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. ./app_env.sh "cakewallet"
+. ./app_config.sh
\ No newline at end of file
diff --git a/scripts/macos/config.sh b/scripts/macos/config.sh
new file mode 100755
index 000000000..493aaa6c3
--- /dev/null
+++ b/scripts/macos/config.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+export MACOS_SCRIPTS_DIR=`pwd`
+export CW_ROOT=${MACOS_SCRIPTS_DIR}/../..
+export EXTERNAL_DIR=${CW_ROOT}/cw_shared_external/ios/External
+export EXTERNAL_MACOS_DIR=${EXTERNAL_DIR}/macos
+export EXTERNAL_MACOS_SOURCE_DIR=${EXTERNAL_MACOS_DIR}/sources
+export EXTERNAL_MACOS_LIB_DIR=${EXTERNAL_MACOS_DIR}/lib
+export EXTERNAL_MACOS_INCLUDE_DIR=${EXTERNAL_MACOS_DIR}/include
+
+mkdir -p $EXTERNAL_MACOS_LIB_DIR
+mkdir -p $EXTERNAL_MACOS_INCLUDE_DIR
+mkdir -p $EXTERNAL_MACOS_SOURCE_DIR
\ No newline at end of file
diff --git a/scripts/macos/gen_arm64.sh b/scripts/macos/gen_arm64.sh
new file mode 100755
index 000000000..ca604bb43
--- /dev/null
+++ b/scripts/macos/gen_arm64.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+. ./gen_common.sh
+
+gen "arm64"
\ No newline at end of file
diff --git a/scripts/macos/gen_common.sh b/scripts/macos/gen_common.sh
new file mode 100755
index 000000000..62f4effab
--- /dev/null
+++ b/scripts/macos/gen_common.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+gen_podspec() {
+	ARCH=$1
+	CW_PLUGIN_DIR="`pwd`/../../cw_monero/macos"
+	BASE_FILENAME="cw_monero_base.podspec"
+	BASE_FILE_PATH="${CW_PLUGIN_DIR}/${BASE_FILENAME}"
+	DEFAULT_FILENAME="cw_monero.podspec"
+	DEFAULT_FILE_PATH="${CW_PLUGIN_DIR}/${DEFAULT_FILENAME}"
+	rm -f $DEFAULT_FILE_PATH
+	cp $BASE_FILE_PATH $DEFAULT_FILE_PATH
+	sed -i '' "s/#___VALID_ARCHS___#/${ARCH}/g" $DEFAULT_FILE_PATH
+}
+
+gen_project() {
+	ARCH=$1
+	CW_DIR="`pwd`/../../macos/Runner.xcodeproj"
+	BASE_FILENAME="project_base.pbxproj"
+	BASE_FILE_PATH="${CW_DIR}/${BASE_FILENAME}"
+	DEFAULT_FILENAME="project.pbxproj"
+	DEFAULT_FILE_PATH="${CW_DIR}/${DEFAULT_FILENAME}"
+	rm -f $DEFAULT_FILE_PATH
+	cp $BASE_FILE_PATH $DEFAULT_FILE_PATH
+	sed -i '' "s/ARCHS =.*/ARCHS = ${ARCH};/g" $DEFAULT_FILE_PATH
+}
+
+gen() {
+	ARCH=$1
+	gen_podspec "${ARCH}"
+	gen_project "${ARCH}"
+}
\ No newline at end of file
diff --git a/scripts/macos/gen_universal.sh b/scripts/macos/gen_universal.sh
new file mode 100755
index 000000000..6056053a5
--- /dev/null
+++ b/scripts/macos/gen_universal.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+. ./gen_common.sh
+
+gen "arm64, x86_64"
\ No newline at end of file
diff --git a/scripts/macos/gen_x86_64.sh b/scripts/macos/gen_x86_64.sh
new file mode 100755
index 000000000..c6988d8f0
--- /dev/null
+++ b/scripts/macos/gen_x86_64.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+. ./gen_common.sh
+
+gen "x86_64"
\ No newline at end of file
diff --git a/scripts/macos/setup.sh b/scripts/macos/setup.sh
new file mode 100755
index 000000000..fea2a6c8d
--- /dev/null
+++ b/scripts/macos/setup.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+. ./config.sh
+
+cd $EXTERNAL_MACOS_LIB_DIR
+
+
+# LIBRANDOMX_PATH=${EXTERNAL_MACOS_LIB_DIR}/monero/librandomx.a
+
+# if [ -f "$LIBRANDOMX_PATH" ]; then
+#     cp $LIBRANDOMX_PATH ./haven
+# fi
+
+libtool -static -o libboost.a ./libboost_*.a
+libtool -static -o libmonero.a ./monero/*.a
+
+# CW_HAVEN_EXTERNAL_LIB=../../../../../cw_haven/macos/External/macos/lib
+# CW_HAVEN_EXTERNAL_INCLUDE=../../../../../cw_haven/macos/External/macos/include
+CW_MONERO_EXTERNAL_LIB=../../../../../cw_monero/macos/External/macos/lib
+CW_MONERO_EXTERNAL_INCLUDE=../../../../../cw_monero/macos/External/macos/include
+
+# mkdir -p $CW_HAVEN_EXTERNAL_INCLUDE
+mkdir -p $CW_MONERO_EXTERNAL_INCLUDE
+# mkdir -p $CW_HAVEN_EXTERNAL_LIB
+mkdir -p $CW_MONERO_EXTERNAL_LIB
+
+# ln ./libboost.a ${CW_HAVEN_EXTERNAL_LIB}/libboost.a
+# ln ./libcrypto.a ${CW_HAVEN_EXTERNAL_LIB}/libcrypto.a
+# ln ./libssl.a ${CW_HAVEN_EXTERNAL_LIB}/libssl.a
+# ln ./libsodium.a ${CW_HAVEN_EXTERNAL_LIB}/libsodium.a
+# cp ./libhaven.a $CW_HAVEN_EXTERNAL_LIB
+# cp ../include/haven/* $CW_HAVEN_EXTERNAL_INCLUDE
+
+ln ./libboost.a ${CW_MONERO_EXTERNAL_LIB}/libboost.a
+ln ./libcrypto.a ${CW_MONERO_EXTERNAL_LIB}/libcrypto.a
+ln ./libssl.a ${CW_MONERO_EXTERNAL_LIB}/libssl.a
+ln ./libsodium.a ${CW_MONERO_EXTERNAL_LIB}/libsodium.a
+ln ./libunbound.a ${CW_MONERO_EXTERNAL_LIB}/libunbound.a
+cp ./libmonero.a $CW_MONERO_EXTERNAL_LIB
+cp ../include/monero/* $CW_MONERO_EXTERNAL_INCLUDE
\ No newline at end of file
diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart
index e4e59819f..621ab1cfc 100644
--- a/tool/utils/secret_key.dart
+++ b/tool/utils/secret_key.dart
@@ -13,6 +13,7 @@ class SecretKey {
     SecretKey('backupSalt', () => hex.encode(encrypt.Key.fromSecureRandom(8).bytes)),
     SecretKey('backupKeychainSalt', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)),
     SecretKey('changeNowApiKey', () => ''),
+    SecretKey('changeNowApiKeyDesktop', () => ''),
     SecretKey('wyreSecretKey', () => ''),
     SecretKey('wyreApiKey', () => ''),
     SecretKey('wyreAccountId', () => ''),
@@ -21,6 +22,7 @@ class SecretKey {
     SecretKey('sideShiftAffiliateId', () => ''),
     SecretKey('sideShiftApiKey', () => ''),
     SecretKey('simpleSwapApiKey', () => ''),
+    SecretKey('simpleSwapApiKeyDesktop', () => ''),
     SecretKey('anypayToken', () => ''),
     SecretKey('onramperApiKey', () => ''),
     SecretKey('ioniaClientId', () => ''),