diff --git a/app/js/app.config.js b/app/js/app.config.js
index a8be58e4d07550cec4b43e616274951d57216ffa..10c4c8a83cc391e729fe3d9a48aeddd18988cdca 100644
--- a/app/js/app.config.js
+++ b/app/js/app.config.js
@@ -13,6 +13,7 @@ module.exports = () => {
   require('js/services/datetime')(duniterApp);
   require('js/services/ui_utils')(duniterApp);
   require('js/services/graphs')(duniterApp);
+  require('js/services/pubkeyGenerator')(duniterApp);
 
   let homeControllers = angular.module('homeControllers', ['duniter.services']);
 
diff --git a/app/js/controllers/init/create/IdentityController.js b/app/js/controllers/init/create/IdentityController.js
index d11adafcfeb3aaf57ef54c56e87d7a42a8789295..5dcc0ee3ac06ff537e086943d29390c492778635 100644
--- a/app/js/controllers/init/create/IdentityController.js
+++ b/app/js/controllers/init/create/IdentityController.js
@@ -1,8 +1,6 @@
 "use strict";
 
-var co = require('co');
-
-module.exports = ($scope, $timeout, BMA) => {
+module.exports = ($scope, PubkeyGenerator) => {
 
   setTimeout(() => {
     $('select').material_select();
@@ -15,32 +13,5 @@ module.exports = ($scope, $timeout, BMA) => {
     }
   };
 
-  let concat = "";
-  $scope.pubkey_preview = "";
-  let timeout = preview();
-
-  function preview() {
-    return $timeout(() => {
-      if ($scope.$parent) {
-        let salt = $scope.$parent.conf.idty_entropy;
-        let pass = $scope.$parent.conf.idty_password;
-        let newConcat = [salt, pass].join('');
-        if (salt && pass && newConcat != concat) {
-          console.log('different');
-          concat = newConcat;
-          $scope.previewPubkey(concat);
-          timeout = preview();
-        } else {
-          timeout = preview();
-        }
-      }
-    }, 100);
-  }
-
-  $scope.previewPubkey = () => co(function *() {
-    let data = yield BMA.webmin.key.preview({
-      conf: $scope.$parent.conf
-    });
-    $scope.pubkey_preview = data.pubkey;
-  }).catch(() => null);
+  PubkeyGenerator($scope);
 };
diff --git a/app/js/controllers/main/settings/tabs/KeyController.js b/app/js/controllers/main/settings/tabs/KeyController.js
index ae37f8da119e77f6bc3fe3c0b1d30e516120637c..63d18a2caf910e6eae2e3e13a9c31ab7b3c737df 100644
--- a/app/js/controllers/main/settings/tabs/KeyController.js
+++ b/app/js/controllers/main/settings/tabs/KeyController.js
@@ -2,7 +2,7 @@
 
 var co = require('co');
 
-module.exports = ($scope, $state, BMA, summary) => {
+module.exports = ($scope, $state, BMA, summary, PubkeyGenerator) => {
 
   $scope.pubkey = summary.pubkey;
 
@@ -18,4 +18,6 @@ module.exports = ($scope, $state, BMA, summary) => {
     $scope.$parent.conf.idty_password = '';
     $state.reload();
   });
+
+  PubkeyGenerator($scope);
 };
diff --git a/app/js/services/pubkeyGenerator.js b/app/js/services/pubkeyGenerator.js
new file mode 100644
index 0000000000000000000000000000000000000000..b38baf5691ae89e4119f7586ebd764d16acda847
--- /dev/null
+++ b/app/js/services/pubkeyGenerator.js
@@ -0,0 +1,39 @@
+module.exports = (app) => {
+
+  app.factory('PubkeyGenerator', function($timeout, BMA) {
+
+    var co = require('co');
+
+    return ($scope) => {
+
+      let concat = "";
+      $scope.pubkey_preview = "";
+      let timeout = preview();
+
+      function preview() {
+        return $timeout(() => {
+          if ($scope.$parent) {
+            let salt = $scope.$parent.conf.idty_entropy;
+            let pass = $scope.$parent.conf.idty_password;
+            let newConcat = [salt, pass].join('');
+            if (salt && pass && newConcat != concat) {
+              console.log('different');
+              concat = newConcat;
+              $scope.previewPubkey(concat);
+              timeout = preview();
+            } else {
+              timeout = preview();
+            }
+          }
+        }, 100);
+      }
+
+      $scope.previewPubkey = () => co(function *() {
+        let data = yield BMA.webmin.key.preview({
+          conf: $scope.$parent.conf
+        });
+        $scope.pubkey_preview = data.pubkey;
+      }).catch(() => null);
+    };
+  });
+};