diff --git a/lib/main.dart b/lib/main.dart
index c313d400821123a20e35fd29522add6006df7d95..8f013a921583196f62a6405f82bd3fd7dded42c6 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,7 +1,11 @@
+import 'package:dubp/dubp.dart';
+import 'package:gecko/models/history.dart';
+import 'package:gecko/models/myWallets.dart';
 import 'package:gecko/ui/home.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
+import 'package:provider/provider.dart';
 import 'package:sentry_flutter/sentry_flutter.dart';
 import 'package:flutter/foundation.dart';
 import 'package:http/http.dart' as http;
@@ -90,23 +94,41 @@ class Gecko extends StatelessWidget {
         link: _httpLink,
       ),
     );
-    return MaterialApp(
-      title: 'Äžecko',
-      theme: ThemeData(
-        primaryColor: Color(0xffFFD58D),
-        accentColor: Colors.grey[850],
-        textTheme: TextTheme(
-          bodyText1: TextStyle(),
-          bodyText2: TextStyle(),
-        ).apply(
-          bodyColor: Color(0xff855F2D),
-          // displayColor: Colors.blue,
-        ),
-      ),
-      home: GraphQLProvider(
-        client: _client,
-        child: HomeScreen(),
-      ),
-    );
+
+    DubpRust.setup();
+    return MultiProvider(
+        providers: [
+          // In this sample app, CatalogModel never changes, so a simple Provider
+          // is sufficient.
+          Provider(create: (context) => HistoryProvider()),
+          // CartModel is implemented as a ChangeNotifier, which calls for the use
+          // of ChangeNotifierProvider. Moreover, CartModel depends
+          // on CatalogModel, so a ProxyProvider is needed.
+          ChangeNotifierProxyProvider<HistoryProvider, MyWalletsProvider>(
+            create: (context) => MyWalletsProvider(),
+            update: (context, history, myWallets) {
+              cart.catalog = catalog;
+              return cart;
+            },
+          ),
+        ],
+        child: MaterialApp(
+          title: 'Äžecko',
+          theme: ThemeData(
+            primaryColor: Color(0xffFFD58D),
+            accentColor: Colors.grey[850],
+            textTheme: TextTheme(
+              bodyText1: TextStyle(),
+              bodyText2: TextStyle(),
+            ).apply(
+              bodyColor: Color(0xff855F2D),
+              // displayColor: Colors.blue,
+            ),
+          ),
+          home: GraphQLProvider(
+            client: _client,
+            child: HomeScreen(),
+          ),
+        ));
   }
 }
diff --git a/lib/models/history.dart b/lib/models/history.dart
new file mode 100644
index 0000000000000000000000000000000000000000..099ddfd927a3bb8956db3fb69d0f6ca435c1a730
--- /dev/null
+++ b/lib/models/history.dart
@@ -0,0 +1,59 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:permission_handler/permission_handler.dart';
+import 'package:sentry/sentry.dart' as sentry;
+import 'package:qrscan/qrscan.dart' as scanner;
+
+class HistoryProvider with ChangeNotifier {
+  final TextEditingController _outputPubkey = new TextEditingController();
+  String pubkey = '';
+
+  ScrollController scrollController = new ScrollController();
+
+  Future scan() async {
+    await Permission.camera.request();
+    String barcode;
+    try {
+      barcode = await scanner.scan();
+    } catch (e, stack) {
+      print(e);
+      if (kReleaseMode) {
+        await sentry.Sentry.captureException(
+          e,
+          stackTrace: stack,
+        );
+      }
+      return 'false';
+    }
+    // this._outputPubkey.text = "";
+    if (barcode != null) {
+      this._outputPubkey.text = barcode;
+      isPubkey(barcode);
+    } else {
+      return 'false';
+    }
+    return barcode;
+  }
+
+  String isPubkey(pubkey) {
+    final RegExp regExp = new RegExp(
+      r'^[a-zA-Z0-9]+$',
+      caseSensitive: false,
+      multiLine: false,
+    );
+
+    if (regExp.hasMatch(pubkey) == true &&
+        pubkey.length > 42 &&
+        pubkey.length < 45) {
+      print("C'est une pubkey !!!");
+
+      this.pubkey = pubkey;
+      this._outputPubkey.text = pubkey;
+      notifyListeners();
+
+      return pubkey;
+    }
+
+    return '';
+  }
+}
diff --git a/lib/models/myWallets.dart b/lib/models/myWallets.dart
new file mode 100644
index 0000000000000000000000000000000000000000..ebbed9a48fc7e6d21dc7e587bc793f659c70af36
--- /dev/null
+++ b/lib/models/myWallets.dart
@@ -0,0 +1,54 @@
+import 'dart:io';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'dart:async';
+import 'package:path_provider/path_provider.dart';
+
+class MyWalletsProvider with ChangeNotifier {
+  Directory appPath;
+
+  bool checkIfWalletExist() {
+    if (this.appPath == null) {
+      return false;
+    }
+
+    var walletsFolder = new Directory("${this.appPath.path}/wallets/");
+
+    bool isWalletFolderExist = walletsFolder.existsSync();
+
+    if (!isWalletFolderExist) {
+      Directory(walletsFolder.path).createSync();
+    }
+
+    List contents = walletsFolder.listSync();
+    if (contents.length == 0) {
+      print('No wallets detected');
+      return false;
+    } else {
+      print('Some wallets have been detected:');
+      for (var _wallets in contents) {
+        print(_wallets);
+      }
+      return true;
+    }
+
+    // final bool isExist =
+    //     File('${walletsFolder.path}/$name/wallet.dewif').existsSync();
+    // print(this.appPath.path);
+    // print('Wallet existe ? : ' + isExist.toString());
+    // print('Is wallet generated ? : ' + walletIsGenerated.toString());
+    // if (isExist) {
+    //   print('Un wallet existe !');
+    //   return true;
+    // } else {
+    //   return false;
+    // }
+  }
+
+  Future getAppDirectory() async {
+    this.appPath = await getApplicationDocumentsDirectory();
+    notifyListeners();
+  }
+
+  Future importWallet() async {}
+}
diff --git a/lib/ui/historyScreen.dart b/lib/ui/historyScreen.dart
index 36cfa469b6cd7802172b088ce412a12900dd1892..d1ebcd6842bc9f552dfa0dbbe7b52493d217d205 100644
--- a/lib/ui/historyScreen.dart
+++ b/lib/ui/historyScreen.dart
@@ -1,25 +1,15 @@
 import 'package:gecko/parsingGVA.dart';
 import 'package:gecko/query.dart';
+import 'package:gecko/models/history.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/foundation.dart';
-import 'package:qrscan/qrscan.dart' as scanner;
-import 'dart:async';
 import 'dart:typed_data';
 import 'dart:ui';
 import 'package:graphql_flutter/graphql_flutter.dart';
-import 'package:permission_handler/permission_handler.dart';
-import 'package:sentry/sentry.dart' as sentry;
 import 'package:truncate/truncate.dart';
 
 //ignore: must_be_immutable
-class HistoryScreen extends StatefulWidget {
-  const HistoryScreen({Key keyHistory}) : super(key: keyHistory);
-
-  @override
-  State<StatefulWidget> createState() => HistoryScreenState();
-}
-
-class HistoryScreenState extends State<HistoryScreen> {
+class HistoryScreen extends StatelessWidget with ChangeNotifier {
   Widget currentScreen;
 
   Uint8List bytes = Uint8List(0);
@@ -29,33 +19,15 @@ class HistoryScreenState extends State<HistoryScreen> {
   // String pubkey = 'D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU'; // For debug
   String pubkey = '';
   bool isBuilding = true;
-  ScrollController _scrollController = new ScrollController();
 
-  _scrollListener() {
-    if (_scrollController.offset >=
-            _scrollController.position.maxScrollExtent &&
-        !_scrollController.position.outOfRange) {
-      setState(() {
-        print("reach the bottom");
-      });
-    }
-  }
+  HistoryProvider historyProvider = HistoryProvider();
 
-  @override
-  void initState() {
-    super.initState();
-    _scrollController = ScrollController();
-    _scrollController.addListener(_scrollListener);
-
-    // _scrollController
-    //   ..addListener(() {
-    //     if (_scrollController.position.pixels ==
-    //         _scrollController.position.maxScrollExtent) {
-    //       // print(
-    //       //     "DEBUG H fetchMoreCursor in scrollController: $fetchMoreCursor");
-    //       fetchMore(opts);
-    //     }
-    //   });
+  scrollListener() {
+    if (historyProvider.scrollController.offset >=
+            historyProvider.scrollController.position.maxScrollExtent &&
+        !historyProvider.scrollController.position.outOfRange) {
+      notifyListeners();
+    }
   }
 
   @override
@@ -63,6 +35,9 @@ class HistoryScreenState extends State<HistoryScreen> {
     print('Build pubkey : ' + pubkey);
     print('Build this.pubkey : ' + this.pubkey);
     print('isBuilding: ' + isBuilding.toString());
+    historyProvider.scrollController.addListener(scrollListener);
+    historyProvider.scrollController = ScrollController();
+
     return Scaffold(
         floatingActionButton: Container(
           height: 80.0,
@@ -71,7 +46,7 @@ class HistoryScreenState extends State<HistoryScreen> {
             child: FloatingActionButton(
               heroTag: "buttonScan",
               onPressed: () async {
-                await scan();
+                await historyProvider.scan();
                 // print(resultScan);
                 // if (resultScan != 'false') {
                 //   onTabTapped(0);
@@ -93,7 +68,7 @@ class HistoryScreenState extends State<HistoryScreen> {
               onChanged: (text) {
                 print("Clé tappxé: $text");
                 this.pubkey = text;
-                isPubkey(text);
+                historyProvider.isPubkey(text);
               },
               controller: this._outputPubkey,
               maxLines: 1,
@@ -211,7 +186,7 @@ class HistoryScreenState extends State<HistoryScreen> {
             // Build history list
             return Expanded(
                 child: ListView(
-              controller: _scrollController,
+              controller: historyProvider.scrollController,
               children: <Widget>[
                 SizedBox(height: 7),
                 if (this.pubkey != '')
@@ -235,7 +210,7 @@ class HistoryScreenState extends State<HistoryScreen> {
                           Text(repository[5], style: TextStyle(fontSize: 14.0)),
                       dense: true,
                       onTap: () {
-                        isPubkey(repository[2]);
+                        historyProvider.isPubkey(repository[2]);
                       }),
                 if (result.isLoading)
                   Row(
@@ -252,58 +227,6 @@ class HistoryScreenState extends State<HistoryScreen> {
     ));
   }
 
-  Future scan() async {
-    await Permission.camera.request();
-    String barcode;
-    try {
-      barcode = await scanner.scan();
-    } catch (e, stack) {
-      print(e);
-      if (kReleaseMode) {
-        await sentry.Sentry.captureException(
-          e,
-          stackTrace: stack,
-        );
-      }
-      return 'false';
-    }
-    // this._outputPubkey.text = "";
-    if (barcode != null) {
-      this._outputPubkey.text = barcode;
-      isPubkey(barcode);
-    } else {
-      return 'false';
-    }
-    return barcode;
-  }
-
-  String isPubkey(pubkey) {
-    final RegExp regExp = new RegExp(
-      r'^[a-zA-Z0-9]+$',
-      caseSensitive: false,
-      multiLine: false,
-    );
-
-    if (regExp.hasMatch(pubkey) == true &&
-        pubkey.length > 42 &&
-        pubkey.length < 45) {
-      print("C'est une pubkey !!!");
-
-      setState(() {
-        this.pubkey = pubkey;
-        this._outputPubkey.text = pubkey;
-      });
-
-      // setState(() {
-      //   this._outputBalance.text = balance.toString();
-      // });
-
-      return pubkey;
-    }
-
-    return '';
-  }
-
   num removeDecimalZero(double n) {
     String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1);
     return num.parse(result);
diff --git a/lib/ui/home.dart b/lib/ui/home.dart
index f9e32a595df0c4f780a9a0bff84cbbf6fa151b07..782e2d5efd5456942c984346ec227a5a78952d9f 100644
--- a/lib/ui/home.dart
+++ b/lib/ui/home.dart
@@ -15,8 +15,6 @@ class HomeScreen extends StatefulWidget {
 }
 
 class HomeScreenState extends State<HomeScreen> {
-  GlobalKey<HistoryScreenState> _keyHistory = GlobalKey();
-
   int currentIndex = 0;
   Widget currentScreen;
   String appName;
@@ -101,9 +99,7 @@ class HomeScreenState extends State<HomeScreen> {
         child: IndexedStack(
           index: currentIndex,
           children: <Widget>[
-            HistoryScreen(
-              keyHistory: _keyHistory,
-            ),
+            HistoryScreen(),
             WalletsHome(),
           ],
         ),
diff --git a/lib/ui/myWallets/changePin.dart b/lib/ui/myWallets/changePin.dart
index a132c400450d8b7c3b9d7baef96504b610b82cc2..455b81276e8e9920224540da35128b75e7191289 100644
--- a/lib/ui/myWallets/changePin.dart
+++ b/lib/ui/myWallets/changePin.dart
@@ -26,7 +26,6 @@ class ChangePinScreenState extends State<ChangePinScreen> {
 
   void initState() {
     super.initState();
-    DubpRust.setup();
     changePin(widget.walletName, widget.oldPin);
   }
 
diff --git a/lib/ui/myWallets/generateWalletsScreen.dart b/lib/ui/myWallets/generateWalletsScreen.dart
index 9f1c75ef3b7b821f27a12f0f29226d3092fc7d7d..931f46fae9c7bfba7fb558dbcf442b6740adf526 100644
--- a/lib/ui/myWallets/generateWalletsScreen.dart
+++ b/lib/ui/myWallets/generateWalletsScreen.dart
@@ -16,7 +16,6 @@ class GenerateWalletsState extends State<GenerateWalletsScreen> {
   // GlobalKey<ValidStoreWalletState> _keyValidWallets = GlobalKey();
   void initState() {
     super.initState();
-    DubpRust.setup();
     generateMnemonic();
   }
 
diff --git a/lib/ui/myWallets/walletOptions.dart b/lib/ui/myWallets/walletOptions.dart
index d4f434c68bf3dbe664faac0e28d82d335f511c37..1f7d23415ca90aae034a81d781f92a95d392473b 100644
--- a/lib/ui/myWallets/walletOptions.dart
+++ b/lib/ui/myWallets/walletOptions.dart
@@ -35,7 +35,6 @@ class WalletOptionsState extends State<WalletOptions> {
   void initState() {
     super.initState();
     errorController = StreamController<ErrorAnimationType>();
-    DubpRust.setup();
     isWalletUnlock = false;
   }
 
diff --git a/lib/ui/myWallets/walletsHome.dart b/lib/ui/myWallets/walletsHome.dart
index 1c415b213ec0a6834135306b1940a763791a5310..6c37c9d9679d290e72258497d1056c780dc428d6 100644
--- a/lib/ui/myWallets/walletsHome.dart
+++ b/lib/ui/myWallets/walletsHome.dart
@@ -1,29 +1,12 @@
+import 'package:gecko/models/myWallets.dart';
 import 'package:gecko/ui/myWallets/generateWalletsScreen.dart';
 import 'package:gecko/ui/myWallets/myWalletsList.dart';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:dubp/dubp.dart';
-import 'dart:io';
-import 'dart:async';
-import 'package:path_provider/path_provider.dart';
 
-class WalletsHome extends StatefulWidget {
-  const WalletsHome({Key keyGenWallet}) : super(key: keyGenWallet);
-  @override
-  WalletsHomeState createState() => WalletsHomeState();
-}
-
-class WalletsHomeState extends State<WalletsHome> {
-  GlobalKey<WalletsHomeState> _keyWalletsHome = GlobalKey();
-  // GlobalKey<MyWalletState> _keyMyWallets = GlobalKey();
-  // GlobalKey<ValidStoreWalletState> _keyValidWallets = GlobalKey();
-  void initState() {
-    super.initState();
-    DubpRust.setup();
-    getAppDirectory();
-    // _keyWalletsHome.currentState.getAllWalletsNames();
-    // _keyMyWallets.currentState.getAllWalletsNames();
-  }
+class WalletsHome extends StatelessWidget with ChangeNotifier {
+  MyWalletsProvider historyProvider = MyWalletsProvider();
 
   String generatedMnemonic;
   bool walletIsGenerated = false;
@@ -34,15 +17,14 @@ class WalletsHomeState extends State<WalletsHome> {
   String validPin = 'NO PIN';
   String currentText = "";
   var pinColor = Colors.grey[300];
-  Directory appPath;
 
   @override
   Widget build(BuildContext context) {
-    // getAppDirectory();
+    historyProvider.getAppDirectory();
     return Scaffold(
         floatingActionButton: Visibility(
-            visible:
-                (checkIfWalletExist()), //!checkIfWalletExist('MonWallet') &&
+            visible: (historyProvider
+                .checkIfWalletExist()), //!checkIfWalletExist('MonWallet') &&
             child: Container(
                 height: 80.0,
                 width: 80.0,
@@ -55,10 +37,7 @@ class WalletsHomeState extends State<WalletsHome> {
                             MaterialPageRoute(builder: (context) {
                               return GenerateWalletsScreen();
                             }),
-                          ).then((value) => setState(() {
-                                this.newWalletName = value;
-                                checkIfWalletExist();
-                              }));
+                          );
                         },
                         child: Container(
                             height: 40.0,
@@ -69,7 +48,8 @@ class WalletsHomeState extends State<WalletsHome> {
         body: SafeArea(
             child: Column(children: <Widget>[
           Visibility(
-              visible: (!checkIfWalletExist() && !walletIsGenerated),
+              visible:
+                  (!historyProvider.checkIfWalletExist() && !walletIsGenerated),
               child: Column(children: <Widget>[
                 SizedBox(height: 120),
                 Center(
@@ -88,10 +68,7 @@ class WalletsHomeState extends State<WalletsHome> {
                           MaterialPageRoute(builder: (context) {
                             return GenerateWalletsScreen();
                           }),
-                        ).then((value) => setState(() {
-                              this.newWalletName = value;
-                              checkIfWalletExist();
-                            })),
+                        ),
                     child: Text('Générer un portefeuille',
                         style: TextStyle(fontSize: 20))),
                 SizedBox(height: 15),
@@ -106,13 +83,13 @@ class WalletsHomeState extends State<WalletsHome> {
                       primary: Color(0xffFFD68E), // background
                       onPrimary: Colors.black, // foreground
                     ),
-                    onPressed: () => importWallet(),
+                    onPressed: () => historyProvider.importWallet(),
                     child: Text('Importer un portefeuille existant',
                         style: TextStyle(fontSize: 20))),
               ])),
           Visibility(
-              visible: checkIfWalletExist(),
-              child: MyWalletsList(keyMyWallets: _keyWalletsHome))
+              visible: historyProvider.checkIfWalletExist(),
+              child: MyWalletsList())
         ])));
   }
 
@@ -128,48 +105,4 @@ class WalletsHomeState extends State<WalletsHome> {
   //   });
   // }
 
-  bool checkIfWalletExist() {
-    if (this.appPath == null) {
-      return false;
-    }
-
-    var walletsFolder = new Directory("${this.appPath.path}/wallets/");
-
-    bool isWalletFolderExist = walletsFolder.existsSync();
-
-    if (!isWalletFolderExist) {
-      Directory(walletsFolder.path).createSync();
-    }
-
-    List contents = walletsFolder.listSync();
-    if (contents.length == 0) {
-      print('No wallets detected');
-      return false;
-    } else {
-      print('Some wallets have been detected:');
-      for (var _wallets in contents) {
-        print(_wallets);
-      }
-      return true;
-    }
-
-    // final bool isExist =
-    //     File('${walletsFolder.path}/$name/wallet.dewif').existsSync();
-    // print(this.appPath.path);
-    // print('Wallet existe ? : ' + isExist.toString());
-    // print('Is wallet generated ? : ' + walletIsGenerated.toString());
-    // if (isExist) {
-    //   print('Un wallet existe !');
-    //   return true;
-    // } else {
-    //   return false;
-    // }
-  }
-
-  Future getAppDirectory() async {
-    this.appPath = await getApplicationDocumentsDirectory();
-    setState(() {});
-  }
-
-  Future importWallet() async {}
 }