diff --git a/app/controllers/amendments.js b/app/controllers/amendments.js
index 18ef5cac3cddd48da4d0c70625654d39b246b4b2..da8fb40c1b60b7e08f3c8c8c8b037fc649e4f1fe 100644
--- a/app/controllers/amendments.js
+++ b/app/controllers/amendments.js
@@ -23,21 +23,11 @@ function AmendmentBinding (hdcServer) {
 
   // Services
   var ParametersService = hdcServer.ParametersService;
-  var MerkleService     = hdcServer.MerkleService;
-  var VoteService       = hdcServer.VoteService;
-  var StrategyService   = hdcServer.StrategyService;
-  var PeeringService    = hdcServer.PeeringService;
-  var SyncService       = hdcServer.SyncService;
-  var ContractService   = hdcServer.ContractService;
 
   // Models
   var Amendment = hdcServer.conn.model('Amendment');
   var Merkle    = hdcServer.conn.model('Merkle');
 
-  this.promoted = function (req, res) {
-    showAmendment(res, ContractService.current());
-  };
-
   this.promotedNumber = function (req, res) {
     async.waterfall([
       function (next){
@@ -57,125 +47,6 @@ function AmendmentBinding (hdcServer) {
       });
     });
   };
-
-  this.viewAM = {
-
-    signatures: function (req, res) {
-      amendmentMerkle(req, res, Merkle.signaturesOfAmendment.bind(Merkle), Merkle.mapForSignatures.bind(Merkle));
-    },
-
-    self: function (req, res) {
-      ParametersService.getAmendmentID(req, function (err, number, hash) {
-        if(err){
-          res.send(400, err);
-          return;
-        }
-        async.waterfall([
-          function (next){
-            ParametersService.getAmendmentID(req, next);
-          },
-          function (number, hash, next){
-            Amendment.findByNumberAndHash(number, hash, next);
-          },
-        ], function (err, found) {
-          if(err){
-            res.send(404, err);
-            return;
-          }
-          res.setHeader("Content-Type", "text/plain");
-          res.send(JSON.stringify(found.json(), null, "  "));
-        });
-      });
-    }
-  };
-
-  this.votes = {
-
-    sigs: function (req, res) {
-      async.waterfall([
-        function (next){
-          ParametersService.getAmendmentID(req, next);
-        },
-        function (number, hash, next){
-          Merkle.signaturesOfAmendment(number, hash, function (err, merkle) {
-            next(err, merkle, number);
-          });
-        },
-        function (merkle, number, next){
-          MerkleService.processForURL(req, merkle, async.apply(Merkle.mapForSignatures.bind(Merkle), number), next);
-        }
-      ], function (err, json) {
-        if(err){
-          res.send(400, err);
-          return;
-        }
-        MerkleService.merkleDone(req, res, json);
-      });
-    },
-
-    get: function (req, res) {
-      VoteService.votesIndex(function (err, json) {
-        if(err){
-          res.send(500, err);
-          return;
-        }
-        if(req.query.nice){
-          res.setHeader("Content-Type", "text/plain");
-          res.end(JSON.stringify(json, null, "  "));
-        }
-        else res.end(JSON.stringify(json));
-      });
-    },
-
-    post: function (req, res) {
-      var onError = http400(res);
-      http2raw.vote(req, onError)
-        .pipe(unix2dos())
-        .pipe(parsers.parseVote(onError))
-        .pipe(versionFilter(onError))
-        .pipe(currencyFilter(conf.currency, onError))
-        .pipe(extractSignature(onError))
-        .pipe(link2pubkey(hdcServer.PublicKeyService, onError))
-        .pipe(verifySignature(onError))
-        .pipe(hdcServer.singleWriteStream(onError))
-        .pipe(jsoner())
-        .pipe(es.stringify())
-        .pipe(res);
-    }
-  }
-}
-
-function amendmentMerkle (req, res, merkleSource, merkleMap) {
-  ParametersService.getAmendmentID(req, function (err, number, hash) {
-    if(err){
-      res.send(400, err);
-      return;
-    }
-    async.waterfall([
-      function (next){
-        Amendment.findByNumberAndHash(number, hash, next);
-      },
-    ], function (err, am) {
-      if(err){
-        res.send(404, err);
-        return;
-      }
-      async.waterfall([
-        function (next){
-          merkleSource.call(merkleSource, am.number, am.hash, next);
-        },
-        function (merkle, next){
-          MerkleService.processForURL(req, merkle, merkleMap, next);
-        }
-      ], function (err, json) {
-        if(err){
-          res.send(400, err);
-          return;
-        }
-        MerkleService.merkleDone(req, res, json);
-      });
-    });
-  });
 }
 
 function showAmendment (res, current) {
diff --git a/app/controllers/keychain.js b/app/controllers/keychain.js
new file mode 100644
index 0000000000000000000000000000000000000000..a41c5f4457d38e451ba620382fe7d95eebb247ff
--- /dev/null
+++ b/app/controllers/keychain.js
@@ -0,0 +1,66 @@
+var jpgp             = require('../lib/jpgp');
+var async            = require('async');
+var vucoin           = require('vucoin');
+var _                = require('underscore');
+var es               = require('event-stream');
+var unix2dos         = require('../lib/unix2dos');
+var versionFilter    = require('../lib/streams/versionFilter');
+var currencyFilter   = require('../lib/streams/currencyFilter');
+var http2raw         = require('../lib/streams/parsers/http2raw');
+var jsoner           = require('../lib/streams/jsoner');
+var http400          = require('../lib/http/http400');
+var parsers          = require('../lib/streams/parsers/doc');
+var link2pubkey      = require('../lib/streams/link2pubkey');
+var extractSignature = require('../lib/streams/extractSignature');
+var verifySignature  = require('../lib/streams/verifySignature');
+var logger           = require('../lib/logger')();
+var mlogger          = require('../lib/logger')('membership');
+
+module.exports = function (wotServer) {
+  return new KeychainBinding(wotServer);
+}
+
+function KeychainBinding (wotServer) {
+
+  var that = this;
+
+  // Services
+  var http              = wotServer.HTTPService;
+  var MerkleService     = wotServer.MerkleService;
+  var ParametersService = wotServer.ParametersService;
+  var PeeringService    = wotServer.PeeringService;
+  var SyncService       = wotServer.SyncService;
+  var ContractService   = wotServer.ContractService;
+
+  // Models
+  var Peer       = wotServer.conn.model('Peer');
+  var Forward    = wotServer.conn.model('Forward');
+  var Membership = wotServer.conn.model('Membership');
+  var PublicKey  = wotServer.conn.model('PublicKey');
+  var Merkle     = wotServer.conn.model('Merkle');
+  var Key        = wotServer.conn.model('Key');
+
+  this.parseMembership = function (req, res) {
+    var onError = http400(res);
+    http2raw.membership(req, onError)
+      .pipe(unix2dos())
+      .pipe(parsers.parseMembership(onError))
+      .pipe(versionFilter(onError))
+      .pipe(currencyFilter(conf.currency, onError))
+      .pipe(extractSignature(onError))
+      .pipe(link2pubkey(wotServer.PublicKeyService, onError))
+      .pipe(verifySignature(onError))
+      .pipe(wotServer.singleWriteStream(onError))
+      .pipe(jsoner())
+      .pipe(es.stringify())
+      .pipe(res);
+  };
+
+  this.parseKeyblock = function (req, res) {
+    res.end(503);
+  }
+
+  this.current = function (req, res) {
+    res.end(503);
+  }
+}
diff --git a/app/controllers/registry.js b/app/controllers/registry.js
deleted file mode 100644
index 4377df71c53efe68476dab0e9f4effdcda2178e5..0000000000000000000000000000000000000000
--- a/app/controllers/registry.js
+++ /dev/null
@@ -1,310 +0,0 @@
-var jpgp             = require('../lib/jpgp');
-var async            = require('async');
-var vucoin           = require('vucoin');
-var _                = require('underscore');
-var es               = require('event-stream');
-var unix2dos         = require('../lib/unix2dos');
-var versionFilter    = require('../lib/streams/versionFilter');
-var currencyFilter   = require('../lib/streams/currencyFilter');
-var http2raw         = require('../lib/streams/parsers/http2raw');
-var jsoner           = require('../lib/streams/jsoner');
-var http400          = require('../lib/http/http400');
-var parsers          = require('../lib/streams/parsers/doc');
-var link2pubkey      = require('../lib/streams/link2pubkey');
-var extractSignature = require('../lib/streams/extractSignature');
-var verifySignature  = require('../lib/streams/verifySignature');
-var logger           = require('../lib/logger')();
-var mlogger          = require('../lib/logger')('membership');
-var vlogger          = require('../lib/logger')('voting');
-
-module.exports = function (registryServer, conf) {
-  return new RegistryBinding(registryServer, conf);
-};
-
-function RegistryBinding (registryServer, conf) {
-
-  var that = this;
-
-  // Services
-  var http              = registryServer.HTTPService;
-  var MerkleService     = registryServer.MerkleService;
-  var ParametersService = registryServer.ParametersService;
-  var PeeringService    = registryServer.PeeringService;
-  var SyncService       = registryServer.SyncService;
-  var ContractService   = registryServer.ContractService;
-
-  // Models
-  var Peer       = registryServer.conn.model('Peer');
-  var Forward    = registryServer.conn.model('Forward');
-  var Amendment  = registryServer.conn.model('Amendment');
-  var Membership = registryServer.conn.model('Membership');
-  var Voting     = registryServer.conn.model('Voting');
-  var PublicKey  = registryServer.conn.model('PublicKey');
-  var Merkle     = registryServer.conn.model('Merkle');
-  var Key        = registryServer.conn.model('Key');
-
-  this.parameters = function (req, res) {
-    res.end(JSON.stringify({
-      AMStart: conf.sync.AMStart,
-      AMFrequency: conf.sync.AMFreq,
-      UDFrequency: conf.sync.UDFreq,
-      UD0: conf.sync.UD0,
-      UDPercent: conf.sync.UDPercent,
-      UDMinCoin: conf.sync.UDMinCoin,
-      Consensus: conf.sync.Consensus
-    }, null, "  "));
-  };
-
-  this.membershipPost = function (req, res) {
-    var onError = http400(res);
-    http2raw.membership(req, onError)
-      .pipe(unix2dos())
-      .pipe(parsers.parseMembership(onError))
-      .pipe(versionFilter(onError))
-      .pipe(currencyFilter(conf.currency, onError))
-      .pipe(extractSignature(onError))
-      .pipe(link2pubkey(registryServer.PublicKeyService, onError))
-      .pipe(verifySignature(onError))
-      .pipe(registryServer.singleWriteStream(onError))
-      .pipe(jsoner())
-      .pipe(es.stringify())
-      .pipe(res);
-  };
-
-  this.membershipCurrent = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getFingerprint(req, next);
-      },
-
-      function (fingerprint, next) {
-        Membership.getCurrent(fingerprint, next);
-      }
-
-    ], function (err, ms) {
-      if (!ms) {
-        res.send(404, "Not found");
-        return;
-      }
-      http.answer(res, 400, err, function () {
-        res.end(JSON.stringify(ms.json(), null, "  "));
-      });
-    });
-  };
-
-  this.membershipHistory = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getFingerprint(req, next);
-      },
-
-      function (fingerprint, next) {
-        Membership.getHistory(fingerprint, next);
-      }
-
-    ], function (err, history) {
-      var list = [];
-      history.forEach(function(ms){
-        list.push(ms.json());
-      });
-      http.answer(res, 400, err, function () {
-        res.end(JSON.stringify(list, null, "  "));
-      });
-    });
-  };
-
-  this.votingPost = function (req, res) {
-    var onError = http400(res);
-    http2raw.voting(req, onError)
-      .pipe(unix2dos())
-      .pipe(parsers.parseVoting(onError))
-      .pipe(versionFilter(onError))
-      .pipe(currencyFilter(conf.currency, onError))
-      .pipe(extractSignature(onError))
-      .pipe(link2pubkey(registryServer.PublicKeyService, onError))
-      .pipe(verifySignature(onError))
-      .pipe(registryServer.singleWriteStream(onError))
-      .pipe(jsoner())
-      .pipe(es.stringify())
-      .pipe(res);
-  };
-
-  this.votingCurrent = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getFingerprint(req, next);
-      },
-
-      function (fingerprint, next) {
-        Voting.getCurrent(fingerprint, next);
-      }
-
-    ], function (err, voting) {
-      if (!voting) {
-        res.send(404, "Not found");
-        return;
-      }
-      http.answer(res, 400, err, function () {
-        res.end(JSON.stringify(voting.json(), null, "  "));
-      });
-    });
-  };
-
-  this.votingHistory = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getFingerprint(req, next);
-      },
-
-      function (fingerprint, next) {
-        Voting.getHistory(fingerprint, next);
-      }
-
-    ], function (err, history) {
-      var list = [];
-      history.forEach(function(voting){
-        list.push(voting.json());
-      });
-      http.answer(res, 400, err, function () {
-        res.end(JSON.stringify(list, null, "  "));
-      });
-    });
-  };
-
-  this.membersIn = function (req, res) {
-    processMerkle(Merkle.membersIn.bind(Merkle), Merkle.mapForMemberships.bind(Merkle), req, res);
-  };
-
-  this.membersOut = function (req, res) {
-    processMerkle(Merkle.membersOut.bind(Merkle), Merkle.mapForMemberships.bind(Merkle), req, res);
-  };
-
-  this.votersIn = function (req, res) {
-    processMerkle(Merkle.votersIn.bind(Merkle), Merkle.mapForVotings.bind(Merkle), req, res);
-  };
-
-  this.votersOut = function (req, res) {
-    processMerkle(Merkle.votersOut.bind(Merkle), Merkle.mapForVotings.bind(Merkle), req, res);
-  };
-
-  this.statementPost = function (req, res) {
-    var onError = http400(res);
-    http2raw.communityFlow(req, onError)
-      .pipe(unix2dos())
-      .pipe(parsers.parseStatement(onError))
-      .pipe(versionFilter(onError))
-      .pipe(currencyFilter(conf.currency, onError))
-      .pipe(extractSignature(onError))
-      .pipe(link2pubkey(registryServer.PublicKeyService, onError))
-      .pipe(verifySignature(onError))
-      .pipe(registryServer.singleWriteStream(onError))
-      .pipe(jsoner())
-      .pipe(es.stringify())
-      .pipe(res);
-  };
-
-  function processMerkle (getMerkle, mapMerkle, req, res) {
-    var that = this;
-    async.waterfall([
-      function (next) {
-        ParametersService.getAmendmentNumberAndAlgo(req, next);
-      },
-      function (number, algo, next){
-        getMerkle(number, algo, next);
-      },
-      function (merkle, next){
-        MerkleService.processForURL(req, merkle, mapMerkle, next);
-      }
-    ], function (err, json) {
-      if(err){
-        res.send(400, err);
-        return;
-      }
-      MerkleService.merkleDone(req, res, json);
-    });
-  }
-
-  this.askSelf = function (req, res) {
-    async.waterfall([
-
-      function (next){
-        ParametersService.getAmendmentNumberAndAlgo(req, next);
-      },
-      function (amNumber, algo, next){
-        Amendment.getTheOneToBeVoted(amNumber, algo, next);
-      },
-
-    ], function (err, am) {
-      http.answer(res, 404, err, function () {
-        // Render the amendment
-        res.end(JSON.stringify(am.json(), null, "  "));
-      });
-    });
-  };
-
-  this.askStatement = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getAmendmentNumberAndAlgo(req, next);
-      },
-
-      function (amNumber, algo, next) {
-        SyncService.getStatement(parseInt(amNumber), algo, next)
-      },
-
-    ], function (err, cf, am) {
-
-      http.answer(res, 404, err, function () {
-        res.end(JSON.stringify({
-          "statement": cf.json()
-        }, null, "  "));
-      });
-    });
-  };
-
-  this.askVote = function (req, res) {
-    var that = this;
-    async.waterfall([
-
-      // Parameters
-      function(next){
-        ParametersService.getAmendmentNumberAndAlgo(req, next);
-      },
-
-      function (amNumber, algo, next) {
-        SyncService.getVote(amNumber, algo, next);
-      },
-
-      function (vote, next){
-        vote.getAmendment(function (err, am) {
-          next(err, vote, am);
-        });
-      },
-
-    ], function (err, vote, am) {
-
-      http.answer(res, 404, err, function () {
-        res.end(JSON.stringify({
-          "issuer": vote.issuer,
-          "amendment": am.json(),
-          "signature": vote.signature
-        }, null, "  "));
-      });
-    });
-  };
-}
diff --git a/app/lib/algos/community/1Sig.js b/app/lib/algos/community/1Sig.js
deleted file mode 100644
index 8ff0c2dffa27d45c42fb7866ab447d4d91dd8497..0000000000000000000000000000000000000000
--- a/app/lib/algos/community/1Sig.js
+++ /dev/null
@@ -1,97 +0,0 @@
-var async      = require('async');
-var common     = require('./common');
-var hexstrdump = require('../../hexstrdump');
-var jpgp       = require('../../jpgp');
-var parsers    = require('../../streams/parsers/doc');
-
-module.exports = function (isMemberFunc, getPubkeyFunc) {
-  return function (pkey, ctx, amNext, done) {
-    async.waterfall([
-      function (next){
-        parsers.parsePubkey(next).asyncWrite(pkey.raw, next);
-      },
-      function (betterPubkey, next) {
-        async.detect(betterPubkey.udid2s, function (udid2, cb) {
-          var nbMatching = 0;
-          async.forEach(udid2.signatures || [], function (certification, cb2) {
-            var issuer = hexstrdump(certification.issuerKeyId.bytes).toUpperCase();
-            async.waterfall([
-              function (next){
-                getPubkeyFunc(issuer, next);
-              },
-              function (issuerPubkey, next){
-                isMemberFunc(issuerPubkey.fingerprint, function (err, isOK) {
-                  next(err || (!isOK && "Signatory is not a member"), issuerPubkey);
-                });
-              },
-              function (issuerPubkey, next) {
-                var certSignatory = jpgp().certificate(issuerPubkey.raw);
-                var certOwner = jpgp().certificate(pkey.raw);
-                var verified = certification.verify(certSignatory.key.primaryKey, { userid: udid2.user.userId, key: certOwner.key.primaryKey });
-                next((!verified && "Certification verification gives FALSE") || null, verified);
-              }
-            ], function (err, verified) {
-              if (verified) nbMatching++;
-              cb2(err);
-            });
-          }, function (err) {
-              cb(nbMatching >= 1);
-          });
-        }, function (detected) {
-          if (detected != undefined)
-            next(null, { nbVerifiedSigs: 1 });
-          else
-            next(null, { nbVerifiedSigs: 0 });
-        });
-      },
-      function (virtualPubkey, next){
-        common.computeIndicators(virtualPubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, next);
-      },
-    ], done);
-  };
-}
-
-var VTExpires = 3600*24*14; // Every 14 days
-
-
-/**
-* Converts member context vars to analytical expression parameters (for computing functions' namespace)
-*/
-function context2AnalyticalMembership (pubkey, context, done) {
-  var ctx = context || { currentMembership: null, nextMembership: null };
-  var isMember = ctx.currentMembership && ctx.currentMembership.membership == 'IN';
-  var ms = [
-    isMember ? 1 : 0,
-    !isMember ? 1 : 0,
-  ];
-  var hasInvalidKey = (pubkey.nbVerifiedSigs || 0) < 1;
-  var hasNextIn = ctx.nextMembership && ctx.nextMembership.membership == 'IN';
-  var hasNextOut = ctx.nextMembership && ctx.nextMembership.membership == 'OUT';
-  var p = [
-    hasInvalidKey ? 1 : 0,
-    hasNextIn ? 1 : 0,
-    hasNextOut ? 1 : 0,
-  ];
-  done(null, ms, p);
-}
-
-/**
-* Converts voter context vars to analytical expression parameters (for computing functions' namespace)
-*/
-function context2AnalyticalVoting (context, amNext, memberLeaving, done) {
-  var ctx = context || { voterOn: null, nextVoting: null };
-  var isVoter = ctx.voterOn > 0;
-  var isTooOldVT = isVoter && ctx.voterOn + VTExpires < amNext.generated;
-  var vt = [
-    !isTooOldVT && !isVoter ? 1 : 0,
-    !isTooOldVT && isVoter ? 1 : 0,
-    isTooOldVT ? 1 : 0
-  ];
-  var hasNextVoting = ctx.nextVoting;
-  var p = [
-    1,
-    hasNextVoting ? 1 : 0,
-    memberLeaving == 1 ? 1 : 0
-  ];
-  done(null, vt, p);
-}
diff --git a/app/lib/algos/community/AnyKey.js b/app/lib/algos/community/AnyKey.js
deleted file mode 100644
index 7a73dc736124bfe354b2dc98c3364ab53228cb51..0000000000000000000000000000000000000000
--- a/app/lib/algos/community/AnyKey.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var common = require('./common');
-
-module.exports = function (pubkey, ctx, amNext, done) {
-  common.computeIndicators(pubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, done);
-}
-
-var VTExpires = 3600*24*14; // Every 14 days
-
-
-/**
-* Converts member context vars to analytical expression parameters (for computing functions' namespace)
-*/
-function context2AnalyticalMembership (pubkey, context, done) {
-  var ctx = context || { currentMembership: null, nextMembership: null };
-  var isMember = ctx.currentMembership && ctx.currentMembership.membership == 'IN';
-  var ms = [
-    isMember ? 1 : 0,
-    !isMember ? 1 : 0,
-  ];
-  var hasInvalidKey = false; // Key never expires in such algorithm
-  var hasNextIn = ctx.nextMembership && ctx.nextMembership.membership == 'IN';
-  var hasNextOut = ctx.nextMembership && ctx.nextMembership.membership == 'OUT';
-  var p = [
-    hasInvalidKey ? 1 : 0,
-    hasNextIn ? 1 : 0,
-    hasNextOut ? 1 : 0,
-  ];
-  done(null, ms, p);
-}
-
-/**
-* Converts voter context vars to analytical expression parameters (for computing functions' namespace)
-*/
-function context2AnalyticalVoting (context, amNext, memberLeaving, done) {
-  var ctx = context || { voterOn: null, nextVoting: null };
-  var isVoter = ctx.voterOn > 0;
-  var isTooOldVT = isVoter && ctx.voterOn + VTExpires < amNext.generated;
-  var vt = [
-    !isTooOldVT && !isVoter ? 1 : 0,
-    !isTooOldVT && isVoter ? 1 : 0,
-    isTooOldVT ? 1 : 0
-  ];
-  var hasNextVoting = ctx.nextVoting;
-  var p = [
-    1,
-    hasNextVoting ? 1 : 0,
-    memberLeaving == 1 ? 1 : 0
-  ];
-  done(null, vt, p);
-}
diff --git a/app/lib/algos/community/common.js b/app/lib/algos/community/common.js
deleted file mode 100644
index b67f9b3df314f8bc2727648177c8dc6713a4223c..0000000000000000000000000000000000000000
--- a/app/lib/algos/community/common.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var async     = require('async');
-var computing = require('./computing');
-
-module.exports = { computeIndicators: computeIndicators };
-
-/**
-* Compute member's indicators according to a given context.
-*/
-function computeIndicators (pubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, done) {
-  var res = {};
-  async.waterfall([
-    async.apply(context2AnalyticalMembership, pubkey, ctx),
-    async.apply(computing.Membership.Delta),
-    function (msIndicator, next){
-      res.membership = Math.max(-1, Math.min(1, msIndicator));
-      context2AnalyticalVoting(ctx, amNext, res.membership == -1, next);
-    },
-    async.apply(computing.Voting),
-    function (vtIndicator, next) {
-      res.key = vtIndicator;
-      next();
-    }
-  ], function (err) {
-    // Mark out indicators to -1 and 1
-    res.key = Math.max(-1, Math.min(1, res.key));
-    done(err, res);
-  });
-}
diff --git a/app/lib/algos/community/computing.js b/app/lib/algos/community/computing.js
deleted file mode 100644
index 0eb4e1dd553a004c984a077fec572b28875f6055..0000000000000000000000000000000000000000
--- a/app/lib/algos/community/computing.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var Computing = { Membership: {}, Voting: {} };
-
-/**
-* Computes changes for a key, given its current state + changes.
-* @parameter ms Array of 4 Integers: [currentNone, currentIn, currentOut, currentInTooOld].
-*   Each integer is either 1 or 0:
-*   * currentNone: 1 if current membership of a key doesn't exist, 0 otherwise
-*   * currentIn: 1 if current membership of a key is a valid IN, 0 otherwise
-*   * currentOut: 1 if current membership of a key is OUT, 0 otherwise
-*   * currentInTooOld: 1 if current membership of a key is a too old IN, 0 otherwise
-*   __Sum of those 4 integers MUST always be 1.__
-*
-* @parameter p Array of 4 Integers: [newNone, newIn, newOut, newInCancelled, newOutCancelled].
-*   Each integer is either 1 or 0:
-*   * newNone: 1 if new membership of a key doesn't exist, 0 otherwise
-*   * newIn: 1 if new membership of a key is IN, 0 otherwise
-*   * newOut: 1 if new membership of a key is OUT, 0 otherwise
-*   * newInCancelled: 1 if new membership of a key is IN, which has been cancelled, 0 otherwise
-*   * newOutCancelled: 1 if new membership of a key is OUT, which has been cancelled, 0 otherwise
-*/
-Computing.Membership.Delta = function (ms, p, done) {
-
-  if (ms.reduce(function(a,b){ return a + b; }) !== 1) {
-    done('Wrong membership state array: should be either in, out, in too old or no membership at all.');
-  }
-
-  /**
-  * Computes changes for a key given changes with and initial state
-  * @param m 1 if initial state is no membership, 0 otherwise
-  * @param p array of changes
-  */
-  function IsMember (p) {
-    return - p[0] - p[2];
-  }
-
-  /**
-  * Computes changes for a key given changes with and initial state
-  * @param m 1 if initial state is no membership, 0 otherwise
-  * @param p array of changes
-  */
-  function IsNotMember (p) {
-    return - p[0] + p[1];
-  }
-
-  done(null, ms[0]*IsMember(p) + ms[1]*IsNotMember(p));
-}
-
-/**
-* Computes changes for a voter, using given voting & membership events.
-* @parameter vt Array of 2 Integers: [wasNotVoter, wasVoter].
-*   Each integer is either 1 or 0:
-*   * wasNotVoter: 1 if key was not voter, 0 otherwise
-*   * wasVoter: 1 if key was voter, 0 otherwise
-*   __Sum of those 2 integers MUST always be 1.__
-
-* @parameter p Array of 4 Integers: [hasNotVoted, hasVoted, hasNewVoting, isLeavingMember].
-*   Each integer is either 1 or 0:
-*   * hasNotVoted: 1 if voter has voted current amendment, 0 otherwise
-*   * hasVoted: 1 if voter has voted current amendment, 0 otherwise
-*   * hasNewVoting: 1 if member submitted new voting key, 0 otherwise
-*   * isLeavingMember: 1 if member is leaving, 0 otherwise
-*/
-Computing.Voting = function (vt, p, done) {
-
-  done(null, vt[0]*IsNotVoter(p) + vt[1]*IsVoter(p) + vt[2]*IsVoterTooOld(p));
-}
-
-function IsNotVoter (p) {
-  return 2*p[1] - 3*p[2];
-}
-
-function IsVoter (p) {
-  return 2*p[1] - 3*p[2];
-}
-
-function IsVoterTooOld (p) {
-  return - p[0] + 2*p[1] - 3*p[2];
-}
-
-module.exports = Computing;
diff --git a/app/lib/daemon.js b/app/lib/daemon.js
deleted file mode 100644
index 8ac0571a307dde6849eaf6a7fccf2487771e273e..0000000000000000000000000000000000000000
--- a/app/lib/daemon.js
+++ /dev/null
@@ -1,162 +0,0 @@
-var express    = require('express');
-var request    = require('request');
-var http       = require('http');
-var fs         = require('fs');
-var async      = require('async');
-var path       = require('path');
-var connectPgp = require('connect-pgp');
-var _          = require('underscore');
-var jpgp       = require('./jpgp');
-var sha1       = require('sha1');
-var vucoin     = require('vucoin');
-var logger     = require('./logger')('daemon');
-
-module.exports = function (regServer) {
-  return new Daemon(regServer);
-};
-
-function Daemon (regServer) {
-
-  var conn            = regServer.conn;
-  var PeeringService  = regServer.PeeringService;
-  var ContractService = regServer.ContractService;
-  var SyncService     = regServer.SyncService;
-  var Amendment       = conn.model('Amendment');
-  var Key             = conn.model('Key');
-
-  // self reference, private scope
-  var daemon = this;
-
-  var AMStart, AMFreq, Algorithm, enabled;
-  var timeoutID, frequency;
-  var asked = -1;
-  var processing = false;
-  var defaultTimeout = 10*60*1000;
-  var selfFingerprint = "";
-
-  // 20 seconds minimal waiting before asking for vote
-  var voteMargin = 1*1000;
-
-  this.init = function (conf, fingerprint) {
-    AMStart = conf.sync.AMStart;
-    AMFreq = conf.sync.AMFreq;
-    Algorithm = conf.sync.Algorithm;
-    enabled = conf.sync.AMDaemon == "ON";
-    selfFingerprint = fingerprint;
-  };
-
-  this.nextIn = function (timeout) {
-    if (enabled) {
-      timeout = Math.max(0, timeout);
-      logger.debug("Daemon is asked to process in %ss", timeout/1000);
-      if (!processing) {
-        process(timeout, process);
-      } else {
-        asked = timeout;
-      }
-    }
-  };
-
-  this.start = function () {
-    if (enabled) {
-      if (!AMStart || !AMFreq) {
-        throw new Error("Daemon not initialized.");
-      }
-      logger.debug("Daemon started.");
-      daemon.nextIn(0);
-    }
-  };
-
-  function process (timeout, done) {
-    logger.debug("Daemon will process in %ss", timeout/1000);
-    clearTimeout(timeoutID);
-    processing = false;
-    timeoutID = setTimeout(function () {
-      processing = true;
-      doStuff(function (err, wouldWait) {
-        if (err)
-          logger.error(err);
-        var delay = wouldWait;
-        if (asked >= 0) {
-          delay = Math.min(delay, asked);
-          asked = -1;
-        }
-        done(delay, process);
-      });
-    }, timeout);
-  }
-
-  var lastTried = 0;
-
-  function doStuff (done) {
-    var now = new Date().timestamp();
-    var current = ContractService.current();
-    async.waterfall([
-      function (next){
-        // Asking votes for next
-        if (current && now > current.generated + AMFreq) {
-          var amNext = new Amendment({ generated: current.generated + AMFreq });
-          async.auto({
-            triggerSelfCFlow: function(callback){
-              // Case 1: just triggers self-vote
-              if (daemon.judges.timeForVote(amNext) && lastTried != amNext.generated) {
-                lastTried = amNext.generated;
-                // Must be a voter to vote!
-                Key.wasVoter(selfFingerprint, current.number, function (err, wasVoter) {
-                  if (!err && wasVoter) {
-                    logger.debug("Asking Statement for SELF peer");
-                    async.forEach(Algorithm, function(algo, callback){
-                      async.waterfall([
-                        function (next){
-                          SyncService.getStatement(current.number + 1, algo, next);
-                        },
-                        function (statement, next){
-                          regServer.submit(statement, false, next);
-                        },
-                      ], callback);
-                    }, function(err){
-                      next(err);
-                    });
-                    return;
-                  }
-                  callback(err);
-                });
-                return;
-              }
-              callback();
-            },
-          }, function (err) {
-            next(err);
-          });
-        }
-        else {
-          if (current) {
-            var nextTime = new Date();
-            nextTime.setTime((current.generated + AMFreq)*1000);
-            logger.debug("Next amendment on " + nextTime.toLocaleString());
-            next(null, (nextTime.timestamp() + voteMargin/1000 - now)*1000);
-            return;
-          }
-          next();
-        }
-      },
-    ], function (err, waiting) {
-      done(err, waiting || defaultTimeout);
-    });
-  }
-
-  this.stop = function () {
-    clearTimeout(timeoutID);
-  };
-
-  this.judges = {
-
-    timeForVote: function (amNext) {
-      return new Date().utc().timestamp() >= amNext.generated;
-    },
-
-    timeForAskingVotes: function (amNext) {
-      return new Date().utc().timestamp() >= amNext.generated + 60; // 1min later
-    }
-  };
-}
\ No newline at end of file
diff --git a/app/lib/rawer.js b/app/lib/rawer.js
index 36e183037ceec46466c66cdb915c8ff056221a52..6f268ef0d9ec9e22445bde215a0e0d03622b96a4 100644
--- a/app/lib/rawer.js
+++ b/app/lib/rawer.js
@@ -16,7 +16,6 @@ module.exports = new function() {
       raw += "CoinBase: " + json.coinBase + "\n";
       raw += "CoinList: " + json.coinList.join(' ') + "\n";
     }
-    raw += "NextRequiredVotes: " + json.nextVotes + "\n";
     if(json.previousHash){
       raw += "PreviousHash: " + json.previousHash + "\n";
     }
@@ -28,19 +27,9 @@ module.exports = new function() {
         raw += json.membersChanges[i] + "\n";
       }
     }
-    raw += "VotersRoot: " + json.votersRoot + "\n";
-    raw += "VotersCount: " + json.votersCount + "\n";
-    raw += "VotersChanges:\n";
-    for(var j = 0; j < json.votersChanges.length; j++){
-      raw += json.votersChanges[j] + "\n";
-    }
     return unix2dos(raw);
   };
 
-  this.getVote = function (json) {
-    return unix2dos(signed(that.getAmendment(json.amendment), json));
-  };
-
   this.getPubkey = function (json) {
     return unix2dos(json.raw);
   };
@@ -170,33 +159,6 @@ module.exports = new function() {
     return unix2dos(raw);
   };
 
-  this.getVoting = function (json) {
-    return unix2dos(signed(that.getVotingWithoutSignature(json), json));
-  };
-
-  this.getStatementWithoutSignature = function (json) {
-    var raw = "";
-    raw += "Version: " + json.version + "\n";
-    raw += "Currency: " + json.currency + "\n";
-    raw += "Amendment: " + [json.amendmentNumber, json.amendmentHash].join('-') + "\n";
-    raw += "Issuer: " + json.issuer + "\n";
-    raw += "Date: " + json.date.timestamp() + "\n";
-    raw += "Algorithm: " + json.algorithm + "\n";
-    if (json.membersJoiningRoot)
-      raw += "MembersJoining: " + [json.membersJoiningCount, json.membersJoiningRoot].join('-') + "\n";
-    if (json.membersLeavingRoot)
-      raw += "MembersLeaving: " + [json.membersLeavingCount, json.membersLeavingRoot].join('-') + "\n";
-    if (json.votersJoiningRoot)
-      raw += "VotersJoining: " + [json.votersJoiningCount, json.votersJoiningRoot].join('-') + "\n";
-    if (json.votersLeavingRoot)
-      raw += "VotersLeaving: " + [json.votersLeavingCount, json.votersLeavingRoot].join('-') + "\n";
-    return unix2dos(raw);
-  };
-
-  this.getStatement = function (json) {
-    return unix2dos(signed(that.getStatementWithoutSignature(json), json));
-  };
-
   function signed (raw, json) {
     if (json.signature)
       raw += json.signature;
diff --git a/app/lib/streams/multicaster.js b/app/lib/streams/multicaster.js
index 66be1f18b5c134a1b16e86319eeaf826f40dea7b..37110b609c00c7d8b81d3c9b312ad475beeb77d9 100644
--- a/app/lib/streams/multicaster.js
+++ b/app/lib/streams/multicaster.js
@@ -34,17 +34,6 @@ function Multicaster () {
     });
   });
   
-  that.on('vote', function(vote, peers) {
-    logger.debug('--> new Vote to be sent to %s peer(s)', peers.length);
-    peers.forEach(function(peer){
-      fifo.push(function (sent) {
-        sendVote(peer, vote, success(function (err) {
-          sent();
-        }));
-      });
-    });
-  });
-  
   that.on('transaction', function(transaction, peers) {
     logger.debug('--> new Transaction to be sent to %s peer(s)', peers.length);
     peers.forEach(function(peer){
@@ -115,30 +104,6 @@ function Multicaster () {
     });
   });
   
-  that.on('voting', function(voting, peers) {
-    logger.debug('--> new Voting to be sent to %s peer(s)', peers.length);
-    peers.forEach(function(peer){
-      fifo.push(function (sent) {
-        sendVoting(peer, voting, success(function (err) {
-          sent();
-        }));
-      });
-    });
-  });
-  
-  that.on('statement', function(statement, peers) {
-    logger.debug('--> new Statement to be sent to %s peer(s)', peers.length);
-    peers.forEach(function(peer){
-      fifo.push(function (sent) {
-        // Do propagating
-        logger.debug('sending %s\'s statement to peer %s', statement.keyID(), peer.keyID());
-        sendStatement(peer, statement, success(function (err) {
-          sent();
-        }));
-      });
-    });
-  });
-  
   that.on('forward', function(forward, peers, done) {
     logger.debug('--> new Forward to be sent to %s peer(s)', peers.length);
     fifo.push(function (sent) {
@@ -178,14 +143,6 @@ function sendPubkey(peer, pubkey, done) {
   }, done);
 }
 
-function sendVote(peer, vote, done) {
-  logger.info('POST vote to %s', peer.keyID());
-  post(peer, '/hdc/amendments/votes', {
-    "amendment": vote.getRaw(),
-    "signature": vote.signature
-  }, done);
-}
-
 function sendTransaction(peer, transaction, done) {
   logger.info('POST transaction to %s', peer.keyID());
   post(peer, '/hdc/transactions/process', {
@@ -226,22 +183,6 @@ function sendMembership(peer, membership, done) {
   }, done);
 }
 
-function sendVoting(peer, voting, done) {
-  logger.info('POST voting to %s', peer.keyID());
-  post(peer, '/registry/community/voters', {
-    "voting": voting.getRaw(),
-    "signature": voting.signature
-  }, done);
-}
-
-function sendStatement(peer, statement, done) {
-  logger.info('POST statement to %s', peer.keyID());
-  post(peer, '/registry/amendment/statement', {
-    "statement": statement.getRaw(),
-    "signature": statement.signature
-  }, done);
-}
-
 function success (done) {
   return function (err, res, body) {
     if (err) {
diff --git a/app/lib/streams/parsers/doc/amendment.js b/app/lib/streams/parsers/doc/amendment.js
deleted file mode 100644
index d7b0681a72e6d2bc23fb82654544722ae5b1e342..0000000000000000000000000000000000000000
--- a/app/lib/streams/parsers/doc/amendment.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var VoteParser = require('./vote');
-var util       = require('util');
-var split      = require('../../../split');
-var rawer      = require('../../../rawer');
-var _          = require('underscore');
-
-module.exports = AmendmentParser;
-
-function AmendmentParser (onError) {
-
-  VoteParser.call(this, onError);
-
-  this.rawerFunc = rawer.getAmendment;
-
-  var parentVerify = this._verify;
-
-  this._clean = function (obj) {
-    this.cleanAmendment(obj);
-  }
-
-  this._verify = function (obj) {
-    parentVerify({ amendment: obj });
-  }
-}
-
-util.inherits(AmendmentParser, VoteParser);
diff --git a/app/lib/streams/parsers/doc/index.js b/app/lib/streams/parsers/doc/index.js
index ac3bf252f2b9490be8df19453b11b625092fdf56..4d7b173d9b134544510dbcf127ab9288cb5c1d28 100644
--- a/app/lib/streams/parsers/doc/index.js
+++ b/app/lib/streams/parsers/doc/index.js
@@ -1,6 +1,4 @@
 module.exports = {
-  parseAmendment:   instanciate.bind(instanciate, require('./amendment')),
-  parseVote:        instanciate.bind(instanciate, require('./vote')),
   parsePubkey:      instanciate.bind(instanciate, require('./pubkey')),
   parseTransaction: instanciate.bind(instanciate, require('./transaction')),
   parsePeer:        instanciate.bind(instanciate, require('./peer')),
@@ -8,8 +6,6 @@ module.exports = {
   parseStatus:      instanciate.bind(instanciate, require('./status')),
   parseWallet:      instanciate.bind(instanciate, require('./wallet')),
   parseMembership:  instanciate.bind(instanciate, require('./membership')),
-  parseVoting:      instanciate.bind(instanciate, require('./voting')),
-  parseStatement: instanciate.bind(instanciate, require('./statement')),
 };
 
 function instanciate (constructorFunc, onError) {
diff --git a/app/lib/streams/parsers/doc/statement.js b/app/lib/streams/parsers/doc/statement.js
deleted file mode 100644
index 6929c16984e0ac29cda9712a5eaf576a21bdb0e0..0000000000000000000000000000000000000000
--- a/app/lib/streams/parsers/doc/statement.js
+++ /dev/null
@@ -1,102 +0,0 @@
-var GenericParser = require('./GenericParser');
-var rawer         = require('../../../rawer');
-var util          = require('util');
-var sha1          = require('sha1');
-var split         = require('../../../split');
-var unix2dos      = require('../../../unix2dos');
-var _             = require('underscore');
-
-module.exports = StatementParser;
-
-function StatementParser (onError) {
-  
-  var captures = [
-    {prop: "version",             regexp: /Version: (.*)/},
-    {prop: "currency",            regexp: /Currency: (.*)/},
-    {prop: "amendmentNumber",     regexp: /Amendment: (.*)/, parser: parseAmendmentNumber},
-    {prop: "amendmentHash",       regexp: /Amendment: (.*)/, parser: parseAmendmentHash},
-    {prop: "algorithm",           regexp: /Algorithm: (.*)/},
-    {prop: "membersJoiningCount", regexp: /MembersJoining: (.*)/, parser: parseMerkleNumber},
-    {prop: "membersJoiningRoot",  regexp: /MembersJoining: (.*)/, parser: parseMerkleRoot},
-    {prop: "membersLeavingCount", regexp: /MembersLeaving: (.*)/, parser: parseMerkleNumber},
-    {prop: "membersLeavingRoot",  regexp: /MembersLeaving: (.*)/, parser: parseMerkleRoot},
-    {prop: "votersJoiningCount",  regexp: /VotersJoining: (.*)/, parser: parseMerkleNumber},
-    {prop: "votersJoiningRoot",   regexp: /VotersJoining: (.*)/, parser: parseMerkleRoot},
-    {prop: "votersLeavingCount",  regexp: /VotersLeaving: (.*)/, parser: parseMerkleNumber},
-    {prop: "votersLeavingRoot",   regexp: /VotersLeaving: (.*)/, parser: parseMerkleRoot},
-    {prop: "issuer",              regexp: /Issuer: (.*)/},
-    {prop: "date",                regexp: /Date: (.*)/, parser: parseDateFromTimestamp}
-  ];
-  var multilineFields = [];
-  GenericParser.call(this, captures, multilineFields, rawer.getStatement, onError);
-
-  this._clean = function (obj) {
-  };
-
-  this._verify = function(obj){
-    var err = null;
-    var code = 150;
-    var codes = {
-      'BAD_VERSION': 150,
-      'BAD_CURRENCY': 151,
-      'BAD_FINGERPRINT': 152,
-      'BAD_THRESHOLD': 153,
-      'BAD_AM_NUMBER': 154,
-      'BAD_AM_HASH': 155,
-      'BAD_MERKLE_SUMMARY': 156,
-    }
-    if(!err){
-      // Version
-      if(!obj.version || !obj.version.match(/^1$/))
-        err = {code: codes['BAD_VERSION'], message: "Version unknown"};
-    }
-    if(!err){
-      // Fingerprint
-      if(obj.issuer && !obj.issuer.match(/^[A-Z\d]+$/))
-        err = {code: codes['BAD_FINGERPRINT'], message: "Incorrect issuer field"};
-    }
-    if(!err){
-      // Date
-      if(obj.date && (typeof obj == 'string' ? !obj.date.match(/^\d+$/) : obj.date.timestamp() <= 0))
-        err = {code: codes['BAD_DATE'], message: "Incorrect Date field: must be a positive or zero integer"};
-    }
-    if(!err){
-      // Amendment
-      if(!err && !obj.amendmentHash.match(/^[A-Z\d]+$/))
-        err = {code: codes['BAD_FIELD'], message: "Incorrect amendment field: must be contain an amendment"};
-    }
-    ['membersJoiningRoot', 'membersLeavingRoot', 'votersJoiningRoot', 'votersLeavingRoot'].forEach(function(field){
-      if(!err && obj[field] && !obj[field].match(/^[A-Z\d]+$/))
-        err = {code: codes['BAD_MERKLE_SUMMARY'], message: "Incorrect " + field + " field: must be a SHA-1 uppercased hash"};
-    });
-    return err && err.message;
-  };
-}
-
-function parseDateFromTimestamp (value) {
-  if (value && value.match(/^\d+$/))
-    return new Date(parseInt(value)*1000);
-  else
-    return new Date();
-}
-
-function parseAmendmentNumber (value) {
-  var m = value.match(/^(\d+)-([A-Z\d]+)$/);
-  if (m)
-    return m[1];
-  else
-    return 0;
-}
-
-function parseAmendmentHash (value) {
-  var m = value.match(/^(\d+)-([A-Z\d]+)$/);
-  if (m)
-    return m[2];
-  else
-    return "";
-}
-
-var parseMerkleNumber = parseAmendmentNumber;
-var parseMerkleRoot = parseAmendmentHash;
-
-util.inherits(StatementParser, GenericParser);
diff --git a/app/lib/streams/parsers/doc/vote.js b/app/lib/streams/parsers/doc/vote.js
deleted file mode 100644
index 43d61cc7bdd6e0e8c64d82b1fc8aed2e108f94b8..0000000000000000000000000000000000000000
--- a/app/lib/streams/parsers/doc/vote.js
+++ /dev/null
@@ -1,163 +0,0 @@
-var GenericParser = require('./GenericParser');
-var rawer         = require('../../../rawer');
-var util          = require('util');
-var sha1          = require('sha1');
-var split         = require('../../../split');
-var unix2dos      = require('../../../unix2dos');
-var _             = require('underscore');
-
-module.exports = VoteParser;
-
-function VoteParser (onError) {
-  
-  var captures = [
-    {prop: "version",           regexp: /Version: (.*)/},
-    {prop: "currency",          regexp: /Currency: (.*)/},
-    {prop: "number",            regexp: /Number: (.*)/},
-    {prop: "generated",         regexp: /GeneratedOn: (.*)/},
-    {prop: "dividend",          regexp: /UniversalDividend: (.*)/},
-    {prop: "coinBase",          regexp: /CoinBase: (.*)/},
-    {prop: "coinList",          regexp: /CoinList: (.*)/},
-    {prop: "coinAlgo",          regexp: /CoinAlgo: (.*)/},
-    {prop: "nextVotes",         regexp: /NextRequiredVotes: (.*)/},
-    {prop: "previousHash",      regexp: /PreviousHash: (.*)/},
-    {prop: "membersRoot",       regexp: /MembersRoot: (.*)/},
-    {prop: "membersCount",      regexp: /MembersCount: (.*)/},
-    {prop: "membersChanges",    regexp: /MembersChanges:\n([\s\S]*)VotersRoot/, parser: split("\n")},
-    {prop: "votersRoot",        regexp: /VotersRoot: (.*)/},
-    {prop: "votersCount",       regexp: /VotersCount: (.*)/},
-    {prop: "votersChanges",     regexp: /VotersChanges:\n([\s\S]*)/, parser: split("\n")},
-  ];
-  var multilineFields = ["membersChanges", "votersChanges"];
-  GenericParser.call(this, captures, multilineFields, rawer.getVote, onError);
-
-  this._clean = function (obj) {
-    this.cleanAmendment(obj);
-    restructurate(obj);
-  };
-
-  this.cleanAmendment = function (am) {
-    am.membersChanges = am.membersChanges || [];
-    if (am.membersChanges.length > 0)
-      am.membersChanges.splice(am.membersChanges.length - 1, 1);
-    am.votersChanges = am.votersChanges || [];
-    if (am.votersChanges.length > 0)
-      am.votersChanges.splice(am.votersChanges.length - 1, 1);
-    if (am.coinList) {
-      am.coinList = am.coinList.split(' ');
-      am.coinList.forEach(function(cs, index){
-        am.coinList[index] = parseInt(cs);
-      });
-    }
-  }
-
-  function restructurate (obj) {
-    // Move structure into obj.amendment, BUT the signature & hash
-    obj.amendment = {};
-    _(_(obj).keys()).without('amendment', 'signature', 'hash', 'raw', 'version', 'currency').forEach(function(k){
-      obj.amendment[k] = obj[k];
-      delete obj[k];
-    });
-    obj.amendment.version = obj.version;
-    obj.amendment.currency = obj.currency;
-    obj.amendment.raw = obj.raw;
-    obj.amendment.hash = sha1(rawer.getAmendment(obj.amendment)).toUpperCase();
-    obj.amendmentHash = obj.amendment.hash;
-    obj.basis = obj.amendment.number;
-  }
-
-  this._verify = function(obj){
-    var am = obj.amendment;
-    var err = null;
-    var codes = {
-      'VERSION': 150,
-      'CURRENCY': 151,
-      'NUMBER': 152,
-      'GENERATEDON': 153,
-      'UD': 154,
-      'NEXT_VOTES': 156,
-      'PREV_HASH': 157,
-      'MEMBERS_ROOT': 160,
-      'MEMBERS_COUNT': 161,
-      'MEMBERS_CHANGES': 162,
-      'VOTERS_ROOT': 160,
-      'VOTERS_COUNT': 161,
-      'VOTERS_CHANGES': 162,
-      'COIN_BASE': 173,
-      'COIN_LIST': 174,
-      'COIN_SUM': 175
-    };
-    if(!err){
-      // Version
-      if(!am.version || !am.version.match(/^1$/))
-        err = {code: codes['VERSION'], message: "Version unknown"};
-    }
-    if(!err){
-      // Number
-      if(!am.number || !am.number.match(/^\d+$/))
-        err = {code: codes['NUMBER'], message: "Incorrect Number field"};
-    }
-    if(!err){
-      // GeneratedOn
-      if(!am.generated || !am.generated.match(/^\d+$/))
-        err = {code: codes['GENERATEDON'], message: "GeneratedOn field must be a positive or zero integer"};
-    }
-    if(!err){
-      // Universal Dividend
-      if(am.dividend && !am.dividend.match(/^\d+$/))
-        err = {code: codes['UD'], message: "UniversalDividend must be a positive or zero integer"};
-      // Coin Base
-      if(am.dividend && (!am.coinBase || !am.coinBase.match(/^\d+$/)))
-        err = {code: codes['COIN_BASE'], message: "CoinBase must be a positive or zero integer"};
-      // Coin List
-      if(am.dividend && (!am.coinList || !am.coinList.join(' ').match(/^(\d+ )*\d+$/)))
-        err = {code: codes['COIN_LIST'], message: "CoinList must be a space separated list of positive or zero integers"};
-      else if(am.dividend) {
-        var dividendSum = 0;
-        var power = parseInt(am.coinBase);
-        am.coinList.forEach(function(c){
-          dividendSum += parseInt(c) * Math.pow(2, power++);
-        });
-        if (parseInt(am.dividend) != dividendSum) {
-          err = {code: codes['COIN_SUM'], message: "CoinList sum '" + dividendSum + "' does not match UniversalDividend '" + am.dividend + "'"};
-        }
-      }
-    }
-    if(!err){
-      // NextRequiredVotes
-      if(am.nextVotes && !am.nextVotes.match(/^\d+$/))
-        err = {code: codes['NEXT_VOTES'], message: "NextRequiredVotes must be a positive or zero integer"};
-    }
-    if(!err){
-      // Previous hash
-      var isRoot = parseInt(am.number, 10) === 0;
-      if(!isRoot && (!am.previousHash || !am.previousHash.match(/^[A-Z\d]{40}$/)))
-        err = {code: codes['PREV_HASH'], message: "PreviousHash must be provided for non-root amendment and match an uppercase SHA1 hash"};
-      else if(isRoot && am.previousHash)
-        err = {code: codes['PREV_HASH'], message: "PreviousHash must not be provided for root amendment"};
-    }
-    if(!err){
-      // VotersRoot
-      if(am.previousHash && (!am.votersRoot || !am.votersRoot.match(/^[A-Z\d]{40}$/)))
-        err = {code: codes['VOTERS_ROOT'], message: "VotersRoot must be provided and match an uppercase SHA1 hash"};
-    }
-    if(!err){
-      // VotersCount
-      if(am.previousHash && (!am.votersCount || !am.votersCount.match(/^\d+$/)))
-        err = {code: codes['VOTERS_COUNT'], message: "VotersCount must be a positive or zero integer"};
-    }
-    if(!err){
-      // MembersRoot
-      if(!am.membersRoot || !am.membersRoot.match(/^[A-Z\d]{40}$/))
-        err = {code: codes['MEMBERS_ROOT'], message: "MembersRoot must be provided and match an uppercase SHA1 hash"};
-    }
-    if(!err){
-      // MembersCount
-      if(!am.membersCount || !am.membersCount.match(/^\d+$/))
-        err = {code: codes['MEMBERS_COUNT'], message: "MembersCount must be a positive or zero integer"};
-    }
-    return err && err.message;
-  };
-}
-
-util.inherits(VoteParser, GenericParser);
diff --git a/app/lib/streams/parsers/doc/voting.js b/app/lib/streams/parsers/doc/voting.js
deleted file mode 100644
index 7f6829c1e87ac79580df625572184bcc6eadd2b5..0000000000000000000000000000000000000000
--- a/app/lib/streams/parsers/doc/voting.js
+++ /dev/null
@@ -1,79 +0,0 @@
-var GenericParser = require('./GenericParser');
-var rawer         = require('../../../rawer');
-var util          = require('util');
-var sha1          = require('sha1');
-var split         = require('../../../split');
-var unix2dos      = require('../../../unix2dos');
-var _             = require('underscore');
-
-module.exports = VotingParser;
-
-function VotingParser (onError) {
-  
-  var captures = [
-    {prop: "version",           regexp: /Version: (.*)/},
-    {prop: "currency",          regexp: /Currency: (.*)/},
-    {prop: "type",              regexp: /Registry: (.*)/},
-    {prop: "issuer",            regexp: /Issuer: (.*)/},
-    {prop: "amNumber",          regexp: /AmendmentNumber: (.*)/},
-    {prop: "amHash",            regexp: /AmendmentHash: (.*)/},
-    {prop: "date",              regexp: /Date: (.*)/, parser: parseDateFromTimestamp}
-  ];
-  var multilineFields = [];
-  GenericParser.call(this, captures, multilineFields, rawer.getVoting, onError);
-
-  this._clean = function (obj) {
-  };
-
-  this._verify = function(obj){
-    var err = null;
-    var code = 150;
-    var codes = {
-      'BAD_VERSION': 150,
-      'BAD_CURRENCY': 151,
-      'BAD_ISSUER': 152,
-      'BAD_KEY': 153,
-      'BAD_REGISTRY_TYPE': 154,
-      'BAD_DATE': 155,
-      'BAD_AM_NUMBER': 156,
-      'BAD_AM_HASH': 157,
-    }
-    if(!err){
-      // Version
-      if(!obj.version || !obj.version.match(/^1$/))
-        err = {code: codes['BAD_VERSION'], message: "Version unknown"};
-    }
-    if(!err){
-      // Registry document type
-      if(!obj.type || !obj.type.match("^VOTING$"))
-        err = {code: codes['BAD_REGISTRY_TYPE'], message: "Incorrect Registry field: must be VOTING"};
-    }
-    if(!err){
-      // Issuer
-      if(obj.issuer && !obj.issuer.isSha1())
-        err = {code: codes['BAD_ISSUER'], message: "Incorrect issuer field"};
-    }
-    if(!err){
-      // AmendmentNumber
-      if(!obj.amNumber || !obj.amNumber.match(/^\d+$/))
-        err = {code: codes['BAD_AM_NUMBER'], message: "Incorrect AmendmentNumber field"};
-    }
-    if(!err){
-      // AmendmentHash
-      if(obj.amHash && !obj.amHash.match(/^[A-Z\d]+$/))
-        err = {code: codes['BAD_AM_HASH'], message: "Incorrect AmendmentHash field"};
-    }
-    if(!err){
-      // Date
-      if(obj.date && (typeof obj == 'string' ? !obj.date.match(/^\d+$/) : obj.date.timestamp() <= 0))
-        err = {code: codes['BAD_DATE'], message: "Incorrect Date field: must be a positive or zero integer"};
-    }
-    return err && err.message;
-  };
-}
-
-function parseDateFromTimestamp (value) {
-  return new Date(parseInt(value)*1000);
-}
-
-util.inherits(VotingParser, GenericParser);
diff --git a/app/lib/streams/parsers/http2raw.js b/app/lib/streams/parsers/http2raw.js
index e5bc32cf33c41b8f898e7ad94e8928adf84138b1..78bd6e754aab6eadad5ffed9ba54b1583b59733b 100644
--- a/app/lib/streams/parsers/http2raw.js
+++ b/app/lib/streams/parsers/http2raw.js
@@ -2,7 +2,6 @@ var stream = require('stream');
 var util   = require('util');
 
 module.exports = {
-  vote:          instanciate.bind(null, Http2RawVote),
   pubkey:        instanciate.bind(null, Http2RawPubkey),
   transaction:   instanciate.bind(null, Http2RawTransaction),
   peer:          instanciate.bind(null, Http2RawPeer),
@@ -10,8 +9,6 @@ module.exports = {
   status:        instanciate.bind(null, Http2RawStatus),
   wallet:        instanciate.bind(null, Http2RawWallet),
   membership:    instanciate.bind(null, Http2RawMembership),
-  voting:        instanciate.bind(null, Http2RawVoting),
-  communityFlow: instanciate.bind(null, Http2RawStatement),
 };
 
 function instanciate (constructorFunc, req, onError) {
@@ -36,21 +33,6 @@ function Http2RawPubkey (req, onError) {
   }
 }
 
-function Http2RawVote (req, onError) {
-  
-  stream.Readable.call(this);
-
-  this._read = function () {
-    if(!(req.body && req.body.amendment && req.body.signature)){
-      onError('Requires an amendment + signature');
-    }
-    else {
-      this.push(req.body.amendment + req.body.signature);
-    }
-    this.push(null);
-  }
-}
-
 function Http2RawTransaction (req, onError) {
   
   stream.Readable.call(this);
@@ -141,43 +123,10 @@ function Http2RawMembership (req, onError) {
   }
 }
 
-function Http2RawVoting (req, onError) {
-  
-  stream.Readable.call(this);
-
-  this._read = function () {
-    if(!(req.body && req.body.voting && req.body.signature)){
-      onError('Requires a voting + signature');
-    }
-    else {
-      this.push(req.body.voting + req.body.signature);
-    }
-    this.push(null);
-  }
-}
-
-function Http2RawStatement (req, onError) {
-  
-  stream.Readable.call(this);
-
-  this._read = function () {
-    if(!(req.body && req.body.statement && req.body.signature)){
-      onError('Requires a statement + signature');
-    }
-    else {
-      this.push(req.body.statement + req.body.signature);
-    }
-    this.push(null);
-  }
-}
-
 util.inherits(Http2RawPubkey,      stream.Readable);
-util.inherits(Http2RawVote,        stream.Readable);
 util.inherits(Http2RawTransaction, stream.Readable);
 util.inherits(Http2RawPeer,        stream.Readable);
 util.inherits(Http2RawForward,     stream.Readable);
 util.inherits(Http2RawStatus,      stream.Readable);
 util.inherits(Http2RawWallet,      stream.Readable);
 util.inherits(Http2RawMembership,  stream.Readable);
-util.inherits(Http2RawVoting,      stream.Readable);
-util.inherits(Http2RawStatement, stream.Readable);
diff --git a/app/lib/streams/router.js b/app/lib/streams/router.js
index 56bfeb1baf3a85ed194b9c821416d8d843582a3c..e77d47ee9b8c82b4e28a1892fd06b2633d55f8b9 100644
--- a/app/lib/streams/router.js
+++ b/app/lib/streams/router.js
@@ -13,7 +13,6 @@ function Router (serverFPR, conn) {
   var Key         = conn.model('Key');
   var PublicKey   = conn.model('PublicKey');
   var Amendment   = conn.model('Amendment');
-  var Vote        = conn.model('Vote');
   var Transaction = conn.model('Transaction');
   var Peer        = conn.model('Peer');
   var Forward     = conn.model('Forward');
@@ -25,15 +24,12 @@ function Router (serverFPR, conn) {
 
   this._write = function (obj, enc, done) {
     if (typeof obj.email != 'undefined') {                           route('pubkey',      obj, getRandomInUPPeers,                          done); }
-    else if (obj.amendment ? true : false) {                         route('vote',        obj, getRandomInUPPeers,                          done); }
     else if (obj.recipient ? true : false) {                         route('transaction', obj, getTargetedButSelf(obj.recipient),           done); }
     else if (obj.endpoints ? true : false) {                         route('peer',        obj, getRandomInAllPeersButPeer(obj.fingerprint), done); }
     else if (obj.forward ? true : false) {                           route('forward',     obj, getTargetedButSelf(obj.to),                  done); }
     else if (obj.status ? true : false) {                            route('status',      obj, getTargetedButSelf(obj.to),                  done); }
     else if (obj.requiredTrusts ? true : false) {                    route('wallet',      obj, getRandomInUPPeers,                          done); }
     else if (obj.type && obj.type == "MEMBERSHIP" ? true : false) {  route('membership',  obj, getRandomInUPPeers,                          done); }
-    else if (obj.type && obj.type == "VOTING" ? true : false) {      route('voting',      obj, getRandomInUPPeers,                          done); }
-    else if (obj.algorithm ? true : false) {                         route('statement',   obj, getRandomInUPPeers,                          done); }
     else {
       done();
     }
diff --git a/app/lib/sync.js b/app/lib/sync.js
index dca02e84e5ff970884f05e2904110b4eed3d95b5..5c9c8d754f1a5d4dd9540702eefe2ed3b38e4d92 100644
--- a/app/lib/sync.js
+++ b/app/lib/sync.js
@@ -18,13 +18,10 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf)
   // Services
             var PublicKeyService         = server.PublicKeyService;
             var KeyService         = server.KeyService;
-            var VoteService        = server.VoteService;
             var TransactionService = server.TransactionsService;
             var WalletService      = server.WalletService;
             var PeeringService     = server.PeeringService;
-            var StrategyService    = server.StrategyService;
             var ParametersService  = server.ParametersService;
-            var SyncService        = server.SyncService;
 
   // Models
   var Amendment     = server.conn.model('Amendment');
@@ -351,93 +348,6 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf)
             else next();
           });
         },
-
-        //===========
-        // Registry
-        //===========
-        function (next){
-          Amendment.current(function (err, am) {
-            if (!am) {
-              next();
-              return;
-            }
-            async.waterfall([
-              function (next){
-                Key.getMembers(next);
-              },
-              function (keys, next) {
-                async.forEach(keys, function(member, callback){
-                  async.waterfall([
-                    function (next){
-                      node.registry.community.members.current(member.fingerprint, next);
-                    },
-                    function (jsonMS, next){
-                      logger.info('Membership of %s', member.fingerprint);
-                      var ms = new Membership({
-                        "version": jsonMS.membership.version,
-                        "currency": jsonMS.membership.currency,
-                        "issuer": jsonMS.membership.issuer,
-                        "membership": jsonMS.membership.membership,
-                        "date": new Date(jsonMS.membership.date*1000),
-                        "type": "MEMBERSHIP"
-                      });
-                      ms.signature = jsonMS.signature;
-                      ParametersService.getMembership({
-                        body: {
-                          membership: ms.getRaw(),
-                          signature: jsonMS.signature
-                        }
-                      }, next);
-                    },
-                    function (ms, next){
-                      ms.amNumber = am.number - 1;
-                      ms.current = true;
-                      ms.save(function (err) {
-                        next(err);
-                      });
-                    },
-                  ], callback);
-                }, next);
-              },
-              function (next){
-                Key.getVoters(next);
-              },
-              function (keys, next) {
-                async.forEach(keys, function(member, callback){
-                  async.waterfall([
-                    function (next){
-                      node.registry.community.voters.current(member.fingerprint, next);
-                    },
-                    function (jsonVT, next){
-                      logger.info('Voting of %s', member.fingerprint);
-                      var vt = new Voting({
-                        "version": jsonVT.voting.version,
-                        "currency": jsonVT.voting.currency,
-                        "issuer": jsonVT.voting.issuer,
-                        "date": new Date(jsonVT.voting.date*1000),
-                        "type": "VOTING"
-                      });
-                      vt.signature = jsonVT.signature;
-                      ParametersService.getVoting({
-                        body: {
-                          voting: vt.getRaw(),
-                          signature: jsonVT.signature
-                        }
-                      }, next);
-                    },
-                    function (voting, next){
-                      voting.amNumber = am.number - 1;
-                      voting.current = true;
-                      voting.save(function (err) {
-                        next(err);
-                      });
-                    },
-                  ], callback);
-                }, next);
-              },
-            ], next);
-          })
-        },
       ], function (err, result) {
         logger.info('Sync finished.');
         done(err);
@@ -579,37 +489,6 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf)
       }
     ], onceSyncFinished);
   }
-
-  function applyVotes(amendments, amNumber, number, json, node, cb) {
-    logger.info('Applying votes for amendment #%s', amNumber);
-    logger.info("Signatures: %s", _(json.leaves).size());
-    async.forEachSeries(json.leaves, function(leaf, callback){
-      async.waterfall([
-        function (next){
-          var hash = sha1(amendments[amNumber]).toUpperCase();
-          node.hdc.amendments.view.signatures(amNumber, hash, { "leaf": leaf }, next);
-        },
-        function (json, next){
-          var parser = parsers.parseVote(next);
-          parser.pipe(extractSignature(next)).pipe(eventStream.map(function (obj, callback) {
-            next(null, obj);
-            callback();
-          }));
-          parser.end(amendments[amNumber] + json.leaf.value.signature);
-        },
-        function (vote, next){
-          vote.pubkey = { fingerprint: leaf };
-          VoteService.submit(vote, function (err, am) {
-            if(!err)
-              number++;
-            next(err);
-          });
-        }
-      ], callback);
-    }, function(err, result){
-      cb(err, number);
-    });
-  }
 }
 
 function NodesMerkle (json) {
diff --git a/app/lib/wizard.js b/app/lib/wizard.js
index a46d6abba87897528eaf257558505872eeb8963c..7d84a3dab31193abe6524f83c8bc836d3e454eba 100644
--- a/app/lib/wizard.js
+++ b/app/lib/wizard.js
@@ -16,7 +16,7 @@ var IPV6_REGEXP = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}
 function Wizard () {
 
   this.configAll = function (conf, done) {
-    doTasks(['currency', 'openpgp', 'network', 'key', 'autovote'], conf, done);
+    doTasks(['currency', 'openpgp', 'network', 'key'], conf, done);
   };
 
   this.configCurrency = function (conf, done) {
@@ -34,10 +34,6 @@ function Wizard () {
   this.configKey = function (conf, done) {
     doTasks(['key'], conf, done);
   };
-
-  this.configAutovote = function (conf, done) {
-    doTasks(['autovote'], conf, done);
-  };
 }
 
 function doTasks (todos, conf, done) {
@@ -283,37 +279,6 @@ var tasks = {
         }
       }
     ], done);
-  },
-
-  autovote: function (conf, done) {
-    choose("Autovoting", conf.sync.AMDaemon ? conf.sync.AMDaemon == "ON" : false,
-      function enabled () {
-        conf.sync.AMDaemon = "ON";
-        async.waterfall([
-          async.apply(simpleInteger, "Amendment start",                  "AMStart",   conf.sync),
-          async.apply(simpleInteger, "Amendment frequency",              "AMFreq",    conf.sync),
-          async.apply(simpleInteger, "Dividend frequency",               "UDFreq",    conf.sync),
-          async.apply(simpleFloat,   "Consensus %required",              "Consensus", conf.sync),
-          async.apply(simpleInteger, "Initial dividend",                 "UD0",       conf.sync),
-          async.apply(simpleFloat,   "Universal Dividend %growth",       "UDPercent", conf.sync),
-          function (next) {
-            inquirer.prompt([{
-              type: "checkbox",
-              name: "Algorithm",
-              message: "Community you want to vote for",
-              choices: ["AnyKey", "1Sig"],
-              default: conf.sync.Algorithm,
-            }], function (answers) {
-              conf.sync.Algorithm = answers.Algorithm;
-              done();
-            });
-          }
-        ], done);
-      },
-      function disabled () {
-        conf.sync.AMDaemon = "OFF";
-        done();
-      });
   }
 };
 
diff --git a/app/models/amendment.js b/app/models/amendment.js
index 236df9ae6d6849cb8f704b3426c36789b408d53d..2e76d287d2e3aa8f0001003b5ed0a059effeeafb 100644
--- a/app/models/amendment.js
+++ b/app/models/amendment.js
@@ -16,11 +16,7 @@ var AmendmentSchema = new Schema({
   coinAlgo: String,
   coinBase: Number,
   coinList: [Number],
-  nextVotes: {"type": Number, "default": 0},
   previousHash: String,
-  votersRoot: String,
-  votersCount: {"type": Number, "default": 0},
-  votersChanges: Array,
   membersRoot: String,
   membersCount: {"type": Number, "default": 0},
   membersChanges: Array,
@@ -51,11 +47,7 @@ AmendmentSchema.methods = {
       "coinAlgo",
       "coinBase",
       "coinList",
-      "nextVotes",
       "previousHash",
-      "votersRoot",
-      "votersCount",
-      "votersChanges",
       "membersRoot",
       "membersCount",
       "membersChanges",
@@ -78,17 +70,14 @@ AmendmentSchema.methods = {
       "version",
       "number",
       "generated",
-      "nextVotes",
       "dividend",
       "coinBase",
-      "votersCount",
       "membersCount",
     ].forEach(function(field){
       json[field] = parseInt(that[field], 10);
     });
     [
       "currency",
-      "votersRoot",
       "membersRoot",
       "coinAlgo",
     ].forEach(function(field){
@@ -101,7 +90,6 @@ AmendmentSchema.methods = {
     });
     [
       "coinList",
-      "votersChanges",
       "membersChanges"
     ].forEach(function(field){
       json[field] = that[field] || [];
@@ -131,28 +119,6 @@ AmendmentSchema.methods = {
     return members;
   },
 
-  getNewVoters: function() {
-    var voters = [];
-    for (var i = 0; i < this.votersChanges.length; i++) {
-      var matches = this.votersChanges[i].match(/^\+([\w\d]{40})$/);
-      if(matches){
-        voters.push(matches[1]);
-      }
-    }
-    return voters;
-  },
-
-  getLeavingVoters: function() {
-    var voters = [];
-    for (var i = 0; i < this.votersChanges.length; i++) {
-      var matches = this.votersChanges[i].match(/^\-([\w\d]{40})$/);
-      if(matches){
-        voters.push(matches[1]);
-      }
-    }
-    return voters;
-  },
-
   getHash: function() {
     if (!this.hash) {
       this.hash = sha1(this.getRaw()).toUpperCase();
@@ -319,46 +285,6 @@ AmendmentSchema.statics.getLastStatusOfMember = function (member, amNumberLimit,
   ], done);
 };
 
-AmendmentSchema.statics.getLastStatusOfVoter = function (voter, amNumberLimit, proposedToo, done) {
-
-  if (arguments.length == 3) {
-    done = proposedToo;
-    proposedToo = undefined;
-  }
-
-  var criterias = { number: { $lte: amNumberLimit }, votersChanges: new RegExp("^(\\+|-)" + voter + "$")};
-  if (proposedToo) {
-    criterias.$or = [{ promoted: true }, { selfGenerated: true }];
-  } else {
-    criterias.promoted = true;
-  }
-
-  var that = this;
-  async.waterfall([
-    function (next){
-      that
-        .find(criterias)
-        .sort({ 'number': -1 })
-        .limit(1)
-        .exec(next);
-    },
-    function (ams, next){
-      if (ams.length == 1) {
-        if (~ams[0].votersChanges.indexOf("+" + voter)) {
-          // Last time, voter was joining
-          next(null, 1);
-        } else {
-          // Last time, voter was leaving
-          next(null, -1);
-        }
-      } else {
-        // Voter has never been seen
-        next(null, 0);
-      }
-    },
-  ], done);
-};
-
 AmendmentSchema.statics.isMember = function (member, amNumber, done) {
 
   var that = this;
@@ -372,29 +298,11 @@ AmendmentSchema.statics.isMember = function (member, amNumber, done) {
   ], done);
 };
 
-AmendmentSchema.statics.isVoter = function (voter, amNumber, done) {
-  var that = this;
-  async.waterfall([
-    function (next){
-      that.getLastStatusOfVoter(voter, amNumber, next);
-    },
-    function (status, next){
-      logger.debug('isVoter ? %s for AM#%s = %s', voter, amNumber, status);
-      next(null, status > 0);
-    },
-  ], done);
-};
-
 AmendmentSchema.statics.isMemberForAM = function (member, amNumber, amHash, done) {
 
   this.searchPresence(member, amNumber, amHash, checkIsJoiningMember, checkIsLeavingMember, this.searchPresence.bind(this), done);
 };
 
-AmendmentSchema.statics.isVoterForAM = function (voter, amNumber, amHash, done) {
-
-  this.searchPresence(voter, amNumber, amHash, checkIsJoiningVoter, checkIsLeavingVoter, this.searchPresence.bind(this), done);
-};
-
 AmendmentSchema.statics.searchPresence = function (member, amNumber, amHash, isJoining, isLeaving, searchCallBack, done) {
   var that = this;
   async.waterfall([
@@ -422,21 +330,6 @@ AmendmentSchema.statics.searchPresence = function (member, amNumber, amHash, isJ
 
 function checkIsJoiningMember (am, key) { return ~am.membersChanges.indexOf('+' + key); }
 function checkIsLeavingMember (am, key) { return ~am.membersChanges.indexOf('-' + key); }
-function checkIsJoiningVoter (am, key) { return ~am.votersChanges.indexOf('+' + key); }
-function checkIsLeavingVoter (am, key) { return ~am.votersChanges.indexOf('-' + key); }
-
-AmendmentSchema.statics.isVoter = function (voter, amNumber, done) {
-  var that = this;
-  async.waterfall([
-    function (next){
-      that.getLastStatusOfVoter(voter, amNumber, next);
-    },
-    function (status, next){
-      logger.debug('isVoter ? %s for AM#%s = %s', voter, amNumber, status);
-      next(null, status > 0);
-    },
-  ], done);
-};
 
 AmendmentSchema.statics.isProposedMember = function (member, amNumber, done) {
 
@@ -451,19 +344,6 @@ AmendmentSchema.statics.isProposedMember = function (member, amNumber, done) {
   ], done);
 };
 
-AmendmentSchema.statics.isProposedVoter = function (voter, amNumber, done) {
-
-  var that = this;
-  async.waterfall([
-    function (next){
-      that.getLastStatusOfVoter(voter, amNumber, true, next);
-    },
-    function (status, next){
-      next(null, status > 0);
-    },
-  ], done);
-};
-
 module.exports = AmendmentSchema;
 
 function fill (am1, am2) {
@@ -472,15 +352,11 @@ function fill (am1, am2) {
     "currency",
     "number",
     "generated",
-    "nextVotes",
     "dividend",
     "coinAlgo",
     "coinBase",
     "coinList",
     "previousHash",
-    "votersRoot",
-    "votersCount",
-    "votersChanges",
     "membersRoot",
     "membersCount",
     "membersChanges",
diff --git a/app/models/configuration.js b/app/models/configuration.js
index 5bda0bce1022846b2e1a3d77f5dbc394b79211d1..1d92b3ca3a751ba9c5db1880c1955a181e8b3609 100644
--- a/app/models/configuration.js
+++ b/app/models/configuration.js
@@ -18,15 +18,6 @@ var ConfigurationSchema = new Schema({
   kmanagement: {"type": String, "default": "ALL"},
   kaccept:     {"type": String, "default": "ALL"},
   upInterval:  {"type": Number, "default": 3600*1000},
-  sync:        {"type": Object, "default": {
-    AMDaemon:  "OFF", // No deamon by default
-    AMFreq:    3600*24, // every day
-    UDFreq:    3600*24*30.4375, // every month
-    UD0:       100,
-    UDPercent: 0.007376575, // 0.73%
-    Consensus: 2/3,
-    Algorithm: ['AnyKey', '1Sig'],
-  }}
 });
 
 ConfigurationSchema.virtual('createNext').get(function () {
diff --git a/app/models/key.js b/app/models/key.js
index 3eafd4ecebd8eb638020f5bf2fceaa89a9b33a7b..d3a33d56c8bf3d44e8ad0e828256a48844674553 100644
--- a/app/models/key.js
+++ b/app/models/key.js
@@ -7,135 +7,16 @@ var logger   = require('../../app/lib/logger')('key model');
 var KeySchema = new Schema({
   fingerprint: { type: String, unique: true },
   managed: { type: Boolean, default: false },
-  asMember: Schema.Types.Mixed,
-  asVoter: Schema.Types.Mixed,
   member: { type: Boolean, default: false },
-  voter: { type: Boolean, default: false },
-  proposedMember: { type: Boolean, default: false },
-  proposedVoter: { type: Boolean, default: false },
-  lastMemberState: { type: Number, default: 0 },
-  lastVotingState: { type: Number, default: 0 },
   created: { type: Date, default: Date.now },
   updated: { type: Date, default: Date.now }
 });
 
 KeySchema.pre('save', function (next) {
   this.updated = Date.now();
-  this.asMember = this.asMember || {};
-  this.asMember.joins = this.asMember.joins || [];
-  this.asMember.leaves = this.asMember.leaves || [];
-  this.asVoter = this.asVoter || {};
-  this.asVoter.joins = this.asVoter.joins || [];
-  this.asVoter.leaves = this.asVoter.leaves || [];
   next();
 });
 
-KeySchema.statics.memberJoin = function(amNumber, fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { $push: { "asMember.joins": amNumber }}, done);
-}
-
-KeySchema.statics.memberLeave = function(amNumber, fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { $push: { "asMember.leaves": amNumber }}, done);
-}
-
-KeySchema.statics.wasMember = function(fingerprint, amNumber, done){
-  var Key = this.model('Key');
-  Key.find({ fingerprint: fingerprint }, function (err, keys) {
-    if (err || !keys || keys.length == 0) {
-      done("Unknown key!");
-    } else {
-      var k = keys[0];
-      var previousJoins = _(k.asMember.joins).filter(function(n) { return n <= amNumber; });
-      if (previousJoins.length > 0) {
-        var max = _(previousJoins).max();
-        var previousLeaves = _(k.asMember.leaves).filter(function(n) { return n <= amNumber; });
-        if (previousLeaves.length == 0 || _(previousLeaves).max() < max) {
-          // Last operation at amNumber was joining
-          done(null, true);
-        } else {
-          // Last operation at amNumber was leaving
-          done(null, false);
-        }
-      } else {
-        // Has not joined yet
-        done(null, false);
-      }
-    }
-  });
-}
-
-KeySchema.statics.getMembersOn = function(amNumber, done){
-  var Key = this.model('Key');
-  Key.find({ "asMember.joins": { $lte: amNumber }, $where: memberHasNotLeftSince }, done);
-}
-
-KeySchema.statics.getVotersOn = function(amNumber, done){
-  var Key = this.model('Key');
-  Key.find({ "asVoter.joins": { $lte: amNumber }, $where: voterHasNotLeftSince }, done);
-}
-
-KeySchema.statics.getLastVotingAmNumber = function(fpr, done){
-  var Key = this.model('Key');
-  async.waterfall([
-    function (next){
-      Key.find({ fingerprint: fpr }, next);
-    },
-    function (keys, next){
-      if (keys.length == 0) {
-        next('Key not found');
-        return;
-      }
-      next(null, keys[0].asVoter.joins.length == 0 ? null : _(keys[0].asVoter.joins).max());
-    },
-  ], done);
-}
-
-function memberHasNotLeftSince() {
-  return this.asMember.leaves.length == 0 || _(this.asMember.leaves).max() < _(this.asMember.joins).max();
-}
-
-function voterHasNotLeftSince() {
-  return this.asVoter.leaves.length == 0 || _(this.asVoter.leaves).max() < _(this.asVoter.joins).max();
-}
-
-KeySchema.statics.voterJoin = function(amNumber, fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { $push: { "asVoter.joins": amNumber }}, done);
-}
-
-KeySchema.statics.voterLeave = function(amNumber, fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { $push: { "asVoter.leaves": amNumber }}, done);
-}
-
-KeySchema.statics.wasVoter = function(fingerprint, amNumber, done){
-  var Key = this.model('Key');
-  Key.find({ fingerprint: fingerprint }, function (err, keys) {
-    if (err || !keys || keys.length == 0) {
-      done("Unknown key!");
-    } else {
-      var k = keys[0];
-      var previousJoins = _(k.asVoter.joins).filter(function(n) { return n <= amNumber; });
-      if (previousJoins.length > 0) {
-        var max = _(previousJoins).max();
-        var previousLeaves = _(k.asVoter.leaves).filter(function(n) { return n <= amNumber; });
-        if (previousLeaves.length == 0 || _(previousLeaves).max() < max) {
-          // Last operation at amNumber was joining
-          done(null, true);
-        } else {
-          // Last operation at amNumber was leaving
-          done(null, false);
-        }
-      } else {
-        // Has not joined yet
-        done(null, false);
-      }
-    }
-  });
-}
-
 KeySchema.statics.setKnown = function(fingerprint, done){
   var Key = this.model('Key');
   Key.findOne({ fingerprint: fingerprint }, function (err, key) {
@@ -194,21 +75,6 @@ KeySchema.statics.getMembers = function(done){
   Key.find({ member: true }, done);
 };
 
-KeySchema.statics.getVoters = function(done){
-  var Key = this.model('Key');
-  Key.find({ voter: true }, done);
-};
-
-KeySchema.statics.getProposedMembers = function(done){
-  var Key = this.model('Key');
-  Key.find({ proposedMember: true }, done);
-};
-
-KeySchema.statics.getProposedVoters = function(done){
-  var Key = this.model('Key');
-  Key.find({ proposedVoter: true }, done);
-};
-
 KeySchema.statics.addMember = function(fingerprint, done){
   var Key = this.model('Key');
   Key.update({ fingerprint: fingerprint }, { member: true }, function (err) {
@@ -216,27 +82,6 @@ KeySchema.statics.addMember = function(fingerprint, done){
   });
 };
 
-KeySchema.statics.addVoter = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { voter: true }, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.addProposedMember = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { proposedMember: true }, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.addProposedVoter = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { proposedVoter: true }, function (err) {
-    done(err);
-  });
-};
-
 KeySchema.statics.removeMember = function(fingerprint, done){
   var Key = this.model('Key');
   Key.update({ fingerprint: fingerprint }, { member: false }, function (err) {
@@ -244,53 +89,4 @@ KeySchema.statics.removeMember = function(fingerprint, done){
   });
 };
 
-KeySchema.statics.removeVoter = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { voter: false }, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.removeProposedMember = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { proposedMember: false }, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.removeProposedVoter = function(fingerprint, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: fingerprint }, { proposedVoter: false }, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.getLastState = function(key, done){
-  var Key = this.model('Key');
-  Key.find({ fingerprint: key }, function (err, keys) {
-    done(err, (err || keys.length == 0) ? 0 : keys[0].lastVotingState);
-  });
-};
-
-KeySchema.statics.getLastMSState = function(key, done){
-  var Key = this.model('Key');
-  Key.find({ fingerprint: key }, function (err, keys) {
-    done(err, (err || keys.length == 0) ? 0 : keys[0].lastMemberState);
-  });
-};
-
-KeySchema.statics.setLastState = function(key, state, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: key }, { $set: { lastVotingState: state }}, function (err) {
-    done(err);
-  });
-};
-
-KeySchema.statics.setLastMSState = function(key, state, done){
-  var Key = this.model('Key');
-  Key.update({ fingerprint: key }, { $set: { lastMemberState: state }}, function (err) {
-    done(err);
-  });
-};
-
 module.exports = KeySchema;
diff --git a/app/models/merkle.js b/app/models/merkle.js
index 1de1561960c9dff3a09145a86396a3c9d4610b77..1ee867f25c159221eb36d60036328d1e1b46c573 100644
--- a/app/models/merkle.js
+++ b/app/models/merkle.js
@@ -127,10 +127,6 @@ MerkleSchema.statics.forPublicKeys = function (done) {
   this.retrieve({ type: 'pubkeys' }, done);
 };
 
-MerkleSchema.statics.signaturesOfAmendment = function (number, hash, done) {
-  this.retrieve({ type: 'amendment', criteria: '{"number":'+number+',"hash": "'+hash+'"}' }, done);
-};
-
 MerkleSchema.statics.txOfSender = function (fingerprint, done) {
   this.retrieve({ type: 'txOfSender', criteria: '{"fpr":'+fingerprint+'"}' }, done);
 };
@@ -147,14 +143,6 @@ MerkleSchema.statics.WalletEntries = function (done) {
   this.retrieve({ type: 'thtentries', criteria: '{}' }, done);
 };
 
-MerkleSchema.statics.proposedMembers = function (done) {
-  this.retrieve({ type: 'proposedMembers', criteria: '{}' }, done);
-};
-
-MerkleSchema.statics.proposedVoters = function (done) {
-  this.retrieve({ type: 'proposedVoters', criteria: '{}' }, done);
-};
-
 MerkleSchema.statics.membersIn = function (number, algo, done) {
   this.retrieve({ type: 'membersIn', criteria: '{"number":'+number+',algo:'+algo+'}' }, done);
 };
@@ -163,14 +151,6 @@ MerkleSchema.statics.membersOut = function (number, algo, done) {
   this.retrieve({ type: 'membersOut', criteria: '{"number":'+number+',algo:'+algo+'}' }, done);
 };
 
-MerkleSchema.statics.votersIn = function (number, algo, done) {
-  this.retrieve({ type: 'votersIn', criteria: '{"number":'+number+',algo:'+algo+'}' }, done);
-};
-
-MerkleSchema.statics.votersOut = function (number, algo, done) {
-  this.retrieve({ type: 'votersOut', criteria: '{"number":'+number+',algo:'+algo+'}' }, done);
-};
-
 MerkleSchema.statics.updatePeers = function (peer, previousHash, done) {
   var Merkle = this.model('Merkle');
   async.waterfall([
@@ -299,21 +279,6 @@ MerkleSchema.statics.mapForPublicKeys = function (hashes, done) {
   });
 }
 
-MerkleSchema.statics.mapForSignatures = function (amNumber, hashes, done) {
-  this.model('Vote')
-  .find({ basis: amNumber, issuer: { $in: hashes } })
-  .exec(function (err, votes) {
-    var map = {};
-    votes.forEach(function (vote){
-      map[vote.issuer] = {
-        issuer: vote.issuer,
-        signature: vote.signature
-      };
-    });
-    done(null, map);
-  });
-};
-
 MerkleSchema.statics.mapForWalletEntries = function (hashes, done) {
   this.model('Wallet')
   .find({ fingerprint: { $in: hashes } })
@@ -340,17 +305,4 @@ MerkleSchema.statics.mapForMemberships = function (hashes, done) {
   });
 };
 
-MerkleSchema.statics.mapForVotings = function (hashes, done) {
-  this.model('Voting')
-  .find({ issuer: { $in: hashes } })
-  .sort('issuer')
-  .exec(function (err, entries) {
-    var map = {};
-    entries.forEach(function (entry){
-      map[entry.issuer] = entry.json();
-    });
-    done(null, map);
-  });
-};
-
 module.exports = MerkleSchema;
diff --git a/app/models/statement.js b/app/models/statement.js
deleted file mode 100644
index 0a11c414048a5f4a95124cd05f6812de16cec5fa..0000000000000000000000000000000000000000
--- a/app/models/statement.js
+++ /dev/null
@@ -1,139 +0,0 @@
-var mongoose = require('mongoose');
-var async    = require('async');
-var sha1     = require('sha1');
-var jpgp     = require('../lib/jpgp');
-var _        = require('underscore');
-var rawer    = require('../lib/rawer');
-var Schema   = mongoose.Schema;
-
-var StatementSchema = new Schema({
-  version: String,
-  currency: String,
-  issuer: { type: String },
-  date: { type: Date },
-  amendmentNumber: Number,
-  amendmentHash: String,
-  algorithm: String,
-  membersJoiningCount: Number,
-  membersJoiningRoot: String,
-  membersLeavingCount: Number,
-  membersLeavingRoot: String,
-  votersJoiningCount: Number,
-  votersJoiningRoot: String,
-  votersLeavingCount: Number,
-  votersLeavingRoot: String,
-  signature: String,
-  propagated: { type: Boolean, default: false },
-  selfGenerated: { type: Boolean, default: false },
-  hash: String,
-  sigDate: { type: Date, default: function(){ return new Date(0); } },
-  created: { type: Date, default: Date.now },
-  updated: { type: Date, default: Date.now }
-});
-
-StatementSchema.pre('save', function (next) {
-  this.updated = Date.now();
-  next();
-});
-
-StatementSchema.virtual('pubkey').get(function () {
-  return this._pubkey;
-});
-
-StatementSchema.virtual('pubkey').set(function (am) {
-  this._pubkey = am;
-});
-
-StatementSchema.methods = {
-
-  keyID: function () {
-    return this.issuer && this.issuer.length > 24 ? "0x" + this.issuer.substring(24) : "0x?";
-  },
-  
-  json: function() {
-    var that = this;
-    var json = { raw: this.getRaw() };
-    [
-      "version",
-      "amendmentNumber",
-      "membersJoiningCount",
-      "membersLeavingCount",
-      "votersJoiningCount",
-      "votersLeavingCount",
-    ].forEach(function(field){
-      json[field] = parseInt(that[field], 10);
-    });
-    [
-      "currency",
-      "amendmentHash",
-      "algorithm",
-      "membersJoiningRoot",
-      "membersLeavingRoot",
-      "votersJoiningRoot",
-      "votersLeavingRoot",
-      "issuer",
-    ].forEach(function(field){
-      json[field] = that[field] || "";
-    });
-    json.date = this.date && this.date.timestamp();
-    return json;
-  },
-
-  verifySignature: function (publicKey, done) {
-    jpgp()
-      .publicKey(publicKey)
-      .data(this.getRaw())
-      .signature(this.signature)
-      .verify(publicKey, done);
-  },
-
-  getRaw: function() {
-    return rawer.getStatementWithoutSignature(this);
-  },
-
-  getRawSigned: function() {
-    return rawer.getStatement(this);
-  }
-}
-
-StatementSchema.statics.getTheOne = function (amNumber, issuer, algo, done) {
-  this.find({ amendmentNumber: amNumber, issuer: issuer, algorithm: algo }, function (err, entries) {
-    if(entries && entries.length == 1){
-      done(err, entries[0]);
-      return;
-    }
-    if(!entries || entries.length == 0){
-      done('No Statement entry found');
-      return;
-    }
-    if(entries || entries.length > 1){
-      done('More than one Statement entry found');
-    }
-  });
-}
-
-StatementSchema.statics.getSelf = function (amNumber, algo, done) {
-  this.find({ amendmentNumber: amNumber, algorithm: algo, selfGenerated: true }, function (err, entries) {
-    if(entries && entries.length == 1){
-      done(err, entries[0]);
-      return;
-    }
-    if(!entries || entries.length == 0){
-      done('No Statement entry found');
-      return;
-    }
-    if(entries || entries.length > 1){
-      done('More than one Statement entry found');
-    }
-  });
-}
-
-StatementSchema.statics.getForAmendmentAndAlgo = function (amNumber, algo, done) {
-  this.find({ amendmentNumber: amNumber, algorithm: algo }, done);
-}
-
-StatementSchema.statics.getByIssuerAlgoAmendmentHashAndNumber = function (issuer, algo, amHash, amNumber, done) {
-  this.find({ amendmentNumber: amNumber, amendmentHash: amHash, issuer: issuer, algorithm: algo }, done);
-}
-
-module.exports = StatementSchema;
diff --git a/app/models/vote.js b/app/models/vote.js
deleted file mode 100644
index d17703ded135edc5d8838e762af55bf16ad5f932..0000000000000000000000000000000000000000
--- a/app/models/vote.js
+++ /dev/null
@@ -1,219 +0,0 @@
-var sha1     = require('sha1');
-var async    = require('async');
-var jpgp     = require('../lib/jpgp');
-var fs       = require('fs');
-var mongoose = require('mongoose');
-var Schema   = mongoose.Schema;
-var parsers  = require('../lib/streams/parsers/doc');
-
-var VoteSchema = new Schema({
-  issuer: String,
-  basis: {"type": Number, "default": 0},
-  signature: String,
-  hash: String,
-  amendmentHash: String,
-  propagated: { type: Boolean, default: false },
-  selfGenerated: { type: Boolean, default: false },
-  sigDate: { type: Date, default: function(){ return new Date(0); } },
-  created: { type: Date, default: Date.now },
-  updated: { type: Date, default: Date.now }
-});
-
-VoteSchema.pre('save', function (next) {
-  this.updated = Date.now();
-  next();
-});
-
-VoteSchema.virtual('amendment').get(function () {
-  return this._amendment;
-});
-
-VoteSchema.virtual('amendment').set(function (am) {
-  this._amendment = am;
-});
-
-VoteSchema.virtual('pubkey').get(function () {
-  return this._pubkey;
-});
-
-VoteSchema.virtual('pubkey').set(function (am) {
-  this._pubkey = am;
-});
-
-VoteSchema.methods = {
-
-  verify: function (currency, done) {
-    var that = this;
-    async.waterfall([
-      function (next){
-        jpgp()
-          .publicKey(that.pubkey.raw)
-          .data(that.amendment.getRaw())
-          .signature(that.signature)
-          .verify(next);
-      },
-      function (verified, next) {
-        if(!verified){
-          next('Bad signature for amendment');
-          return;
-        }
-        next(null, true);
-      }
-    ], done);
-    return this;
-  },
-
-  json: function () {
-    var that = this;
-    return {
-      signature: that.signature,
-      amendment: that.amendment.json()
-    };
-  },
-
-  issuerIsVoter: function(done) {
-    var Key       = this.model('Key');
-    Key.wasVoter(this.issuer, this.amendment.number - 1, done);
-  },
-
-  getAmendment: function (done) {
-    var Amendment = this.model('Amendment');
-    var that = this;
-    if(!this.amendment){
-      Amendment.findByNumberAndHash(this.basis, this.amendmentHash, function (err, am) {
-        that.amendment = am;
-        done(err, that.amendment);
-      });
-    }
-    else done(null, this.amendment);
-  },
-
-  saveAmendment: function (signaturesLeaves, done) {
-    var Merkle    = this.model('Merkle');
-    var that = this;
-    var am;
-    async.waterfall([
-      function (next){
-        that.getAmendment(next);
-      },
-      function (amendment, next){
-        am = amendment;
-        next();
-      },
-      function (next){
-        // Donne le Merkle des signatures (hdc/amendments/[AMENDMENT_ID]/signatures)
-        Merkle.signaturesOfAmendment(am.number, am.hash, next);
-      },
-      function (merkle, next){
-        // Met à jour le Merkle
-        merkle.initialize(signaturesLeaves);
-        merkle.save(function (err){
-          next(err);
-        });
-      },
-      function (next){
-        // Met à jour la Masse Monétaire
-        am.getPrevious(function (err, previous) {
-          next(null, previous);
-        });
-      },
-      function (previous, next){
-        var prevM = (previous && previous.monetaryMass) || 0;
-        var prevUD = (previous && previous.dividend) || 0;
-        var prevN = (previous && previous.membersCount) || 0;
-        am.monetaryMass = prevM + prevUD*prevN;
-        next();
-      },
-      function (next){
-        // Termine la sauvegarde
-        am.save(function (err) {
-          that.amendmentHash = am.hash;
-          that.basis = am.number;
-          next(err);
-        });
-      },
-    ], done);
-  },
-
-  copyValues: function (to) {
-    to.issuer = this.issuer;
-    to.hash = this.hash;
-    to.signature = this.signature;
-    to.amendmentHash = this.amendmentHash;
-    to.basis = this.basis;
-  },
-
-  getRaw: function() {
-    return this.amendment.getRaw();
-  },
-
-  getRawSigned: function() {
-    return (this.amendment.getRaw() + this.signature).unix2dos();
-  }
-};
-
-VoteSchema.statics.getForAmendment = function (number, hash, maxDate, done) {
-
-  this.find({ amendmentHash: hash, basis: number, sigDate: { $lte: maxDate } }, done);
-};
-
-VoteSchema.statics.findByHashAndBasis = function (hash, basis, done) {
-
-  this.find({ hash: hash, basis: basis }, function (err, votes) {
-    if(votes && votes.length == 1){
-      done(err, votes[0]);
-      return;
-    }
-    if(!votes || votes.length == 0){
-      done('No amendment found');
-      return;
-    }
-    if(votes || votes.length > 1){
-      done('More than one amendment found');
-    }
-  });
-};
-
-VoteSchema.statics.getSelf = function (amNumber, done) {
-  
-  this
-    .find({ selfGenerated: true, basis: amNumber })
-    .sort({ 'sigDate': -1 })
-    .limit(1)
-    .exec(function (err, votes) {
-      done(null, votes.length == 1 ? votes[0] : null);
-  });
-};
-
-VoteSchema.statics.getSelfForAlgo = function (amNumber, algo, done) {
-  
-  this
-    .find({ selfGenerated: true, algo: algo, basis: amNumber })
-    .sort({ 'sigDate': -1 })
-    .limit(1)
-    .exec(function (err, votes) {
-      done(null, votes.length == 1 ? votes[0] : null);
-  });
-};
-
-VoteSchema.statics.getByIssuerHashAndBasis = function (issuer, hash, amNumber, done) {
-  
-  this
-    .find({ issuer: issuer, hash: hash, basis: amNumber })
-    .limit(1)
-    .exec(function (err, votes) {
-      done(null, votes.length == 1 ? votes[0] : null);
-  });
-};
-
-VoteSchema.statics.getByIssuerAmendmentHashAndBasis = function (issuer, hash, amNumber, done) {
-  
-  this
-    .find({ issuer: issuer, amendmentHash: hash, basis: amNumber })
-    .limit(1)
-    .exec(function (err, votes) {
-      done(null, votes.length == 1 ? votes[0] : null);
-  });
-};
-
-module.exports = VoteSchema;
diff --git a/app/models/voting.js b/app/models/voting.js
deleted file mode 100644
index 07a848094b2d1ed83eea3f7c49087c1b5bbe98fd..0000000000000000000000000000000000000000
--- a/app/models/voting.js
+++ /dev/null
@@ -1,138 +0,0 @@
-var mongoose = require('mongoose');
-var async    = require('async');
-var sha1     = require('sha1');
-var jpgp     = require('../lib/jpgp');
-var _        = require('underscore');
-var rawer    = require('../lib/rawer');
-var Schema   = mongoose.Schema;
-
-var VotingSchema = new Schema({
-  version: String,
-  currency: String,
-  issuer: { type: String },
-  amNumber: Number,
-  eligible: { type: Boolean, default: true },
-  current: { type: Boolean, default: false },
-  signature: String,
-  type: String,
-  date: { type: Date },
-  propagated: { type: Boolean, default: false },
-  hash: String,
-  sigDate: { type: Date, default: function(){ return new Date(0); } },
-  created: { type: Date, default: Date.now },
-  updated: { type: Date, default: Date.now }
-});
-
-VotingSchema.pre('save', function (next) {
-  this.updated = Date.now();
-  next();
-});
-
-VotingSchema.virtual('pubkey').get(function () {
-  return this._pubkey;
-});
-
-VotingSchema.virtual('pubkey').set(function (am) {
-  this._pubkey = am;
-});
-
-VotingSchema.virtual('amHash').get(function () {
-  return this._amHash;
-});
-
-VotingSchema.virtual('amHash').set(function (am) {
-  this._amHash = am;
-});
-
-VotingSchema.methods = {
-
-  keyID: function () {
-    return this.issuer && this.issuer.length > 24 ? "0x" + this.issuer.substring(24) : "0x?";
-  },
-  
-  copyValues: function(to) {
-    var obj = this;
-    ["version", "currency", "issuer", "hash", "signature", "sigDate"].forEach(function (key) {
-      to[key] = obj[key];
-    });
-  },
-  
-  json: function() {
-    var obj = this;
-    var json = {};
-    ["version", "currency", "issuer", "amNumber", "amHash"].forEach(function (key) {
-      json[key] = obj[key];
-    });
-    json.date = this.date.timestamp();
-    json.sigDate = this.sigDate.timestamp();
-    json.registry = obj.type;
-    json.raw = this.getRaw();
-    return { signature: this.signature, voting: json };
-  },
-
-  verifySignature: function (publicKey, done) {
-    jpgp()
-      .publicKey(publicKey)
-      .data(this.getRaw())
-      .signature(this.signature)
-      .verify(publicKey, done);
-  },
-
-  getRaw: function() {
-    return rawer.getVotingWithoutSignature(this);
-  },
-
-  getRawSigned: function() {
-    return rawer.getVoting(this);
-  }
-}
-
-VotingSchema.statics.getForAmendmentAndIssuer = function (amNumber, issuer, done) {
-  
-  this.find({ issuer: issuer, amNumber: amNumber }, done);
-}
-
-VotingSchema.statics.getEligibleForAmendment = function (amNumber, done) {
-  
-  this.find({ eligible: true, amNumber: amNumber }, done);
-}
-
-VotingSchema.statics.getCurrent = function (issuer, done) {
-  
-  this
-    .find({ current: true, issuer: issuer })
-    .sort({ 'sigDate': -1 })
-    .limit(1)
-    .exec(function (err, votings) {
-      done(null, votings.length == 1 ? votings[0] : null);
-  });
-}
-
-VotingSchema.statics.getCurrentForIssuerAndAmendment = function (issuer, amendmentNumber, done) {
-  
-  this
-    .find({ current: true, issuer: issuer, amNumber: { $lt: amendmentNumber } })
-    .sort({ 'sigDate': -1 })
-    .limit(1)
-    .exec(function (err, votings) {
-      done(null, votings.length == 1 ? votings[0] : null);
-  });
-}
-
-VotingSchema.statics.getHistory = function (issuer, done) {
-  
-  this
-    .find({ issuer: issuer })
-    .sort({ 'sigDate': -1 })
-    .exec(done);
-}
-
-VotingSchema.statics.removeCurrents = function (issuer, done) {
-  
-  this
-    .update({ issuer: issuer }, { $set: { current: false }}, { multi: true }, function (err) {
-      done(err);
-    });
-}
-
-module.exports = VotingSchema;
diff --git a/app/service/ContractService.js b/app/service/ContractService.js
index 4f9937f762b8df288fefc2fc9c17c41c13818a51..f1191c904403413e656fda849152fb9d85842133 100644
--- a/app/service/ContractService.js
+++ b/app/service/ContractService.js
@@ -37,12 +37,6 @@ function ContractService (conn, conf) {
           next();
         });
       },
-      function (next){
-        Amendment.getTheOneToBeVoted(current ? current.number + 1 : 0, conf.sync.Algorithm, function (err, am) {
-          proposed = am;
-          next();
-        });
-      },
     ], done);
   };
 }
diff --git a/app/service/KeychainService.js b/app/service/KeychainService.js
new file mode 100644
index 0000000000000000000000000000000000000000..e22e0d7ce966b634ee128b4b309a5f5f4a410656
--- /dev/null
+++ b/app/service/KeychainService.js
@@ -0,0 +1,14 @@
+var jpgp       = require('../lib/jpgp');
+var async      = require('async');
+var _          = require('underscore');
+
+module.exports.get = function (conn, conf) {
+  return new KeyService(conn, conf);
+};
+
+function KeyService (conn, conf) {
+
+  this.load = function (done) {
+    done();
+  };
+}
diff --git a/app/service/ParametersService.js b/app/service/ParametersService.js
index 747e33ded42f9a64a94c2273cc8ca0ac7893b74d..93487e5400acc687350b141c6590e3a7cb6f4c33 100644
--- a/app/service/ParametersService.js
+++ b/app/service/ParametersService.js
@@ -12,8 +12,6 @@ function ParameterNamespace (conn, currency) {
   var that = this;
   var PublicKey   = conn.model('PublicKey');
   var Membership  = conn.model('Membership');
-  var Voting      = conn.model('Voting');
-  var Vote        = conn.model('Vote');
   var Peer        = conn.model('Peer');
   var Transaction = conn.model('Transaction');
   var Forward     = conn.model('Forward');
@@ -227,65 +225,6 @@ function ParameterNamespace (conn, currency) {
     ], callback);
   };
 
-  this.getVoting = function (req, callback) {
-    if(!(req.body && req.body.voting && req.body.signature)){
-      callback('Requires a voting + signature');
-      return;
-    }
-    async.waterfall([
-
-      function (callback) {
-        if(req.body.signature.indexOf('-----BEGIN') == -1){
-          callback('Signature does not seem to be valid');
-          return;
-        }
-        callback();
-      },
-
-      // Check signature's key ID
-      function(callback){
-        var sig = req.body.signature;
-        var keyID = jpgp().signature(sig).issuer();
-        if(!(keyID && keyID.length == 16)){
-          callback('Cannot identify signature issuer`s keyID');
-          return;
-        }
-        callback(null, keyID);
-      },
-
-      // Looking for corresponding public key
-      function(keyID, callback){
-        PublicKey.getTheOne(keyID, function (err, pubkey) {
-          callback(err, pubkey);
-        });
-      },
-
-      function (pubkey, next){
-        var entry = new Voting();
-        async.waterfall([
-          function (next){
-            parsers.parseVoting(next).asyncWrite(req.body.voting + req.body.signature, next);
-          },
-          function (obj, next){
-            entry = new Voting(obj);
-            entry.verifySignature(pubkey.raw, next);
-          },
-          function (verified, next){
-            if(!verified){
-              next('Bad signature');
-              return;
-            }
-            if(pubkey.fingerprint != entry.issuer){
-              next('Fingerprint in Voting (' + entry.issuer + ') does not match signatory (' + pubkey.fingerprint + ')');
-              return;
-            }
-            next(null, entry);
-          },
-        ], next);
-      },
-    ], callback);
-  };
-
   this.getWallet = function (req, callback) {
     if(!(req.body && req.body.entry && req.body.signature)){
       callback('Requires a Wallet entry + signature');
diff --git a/app/service/PeeringService.js b/app/service/PeeringService.js
index 82fd731c3c2c9708d9381b85af56a2f2f986aa8f..3903b1906d10929b16c27db5961a96a53df0926b 100644
--- a/app/service/PeeringService.js
+++ b/app/service/PeeringService.js
@@ -17,7 +17,6 @@ function PeeringService(conn, conf, PublicKeyService, ParametersService) {
   var PublicKey   = conn.model('PublicKey');
   var Transaction = conn.model('Transaction');
   var Merkle      = conn.model('Merkle');
-  var Vote        = conn.model('Vote');
   var Peer        = conn.model('Peer');
   var Key         = conn.model('Key');
   var Forward     = conn.model('Forward');
@@ -526,24 +525,12 @@ function PeeringService(conn, conf, PublicKeyService, ParametersService) {
     that.emit('forward', forward, [peer], done);
   };
 
-  this.propagateVote = function (amendment, vote) {
-    getVotingPeers(function (err, peers) {
-      that.emit('vote', vote, peers || []);
-    });
-  };
-
   this.propagateMembership = function (membership, done) {
     getRandomInAllPeers(function (err, peers) {
       that.emit('membership', membership, peers || []);
     });
   };
 
-  this.propagateVoting = function (voting, done) {
-    getRandomInAllPeers(function (err, peers) {
-      that.emit('voting', voting, peers || []);
-    });
-  };
-
   this.coinIsOwned = function (owner, coin, tx, wallet, done) {
     var nbConfirmations = 0;
     async.forEach(wallet.trusts, function(trust, callback){
diff --git a/app/service/StrategyService.js b/app/service/StrategyService.js
deleted file mode 100644
index c7c6c57fd7e5c0a6b8ee0fee6d9b1304910e6835..0000000000000000000000000000000000000000
--- a/app/service/StrategyService.js
+++ /dev/null
@@ -1,260 +0,0 @@
-var jpgp       = require('../lib/jpgp');
-var async      = require('async');
-var _          = require('underscore');
-var logger     = require('../lib/logger')('amendment');
-
-module.exports.get = function (conn, conf, ContractService, SyncService) {
-  return new StrategyService(conn, conf, ContractService, SyncService);
-};
-
-function StrategyService (conn, conf, ContractService, SyncService) {
-
-  var Amendment  = conn.model('Amendment');
-  var Membership = conn.model('Membership');
-  var Voting     = conn.model('Voting');
-  var PublicKey  = conn.model('PublicKey');
-  var Merkle     = conn.model('Merkle');
-  var Vote       = conn.model('Vote');
-  var CKey       = conn.model('CKey');
-  var Coin       = conn.model('Coin');
-  var Key        = conn.model('Key');
-  
-  var fifo = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-
-  this.tryToPromote = function (am, done) {
-    fifo.push(function (cb) {
-      async.waterfall([
-        function (next){
-          defaultPromotion(am, next);
-        },
-        function (decision, next){
-          if(decision){
-            am.promoted = true;
-            am.save(function (err) {
-              if(!err){
-                // Sets the promoted am as current in memory
-                ContractService.current(am);
-                logger.info("Promoted Amendment #" + am.number + " with hash " + am.hash);
-                next(null);
-              }
-              else next(err);
-            })
-          }
-          else next(null)
-        },
-        function (next){
-          async.parallel({
-            memberJoins:    async.apply(async.forEach, am.getNewMembers(),      async.apply(Key.memberJoin.bind(Key), am.number)),
-            memberLeaves:   async.apply(async.forEach, am.getLeavingMembers(),  async.apply(Key.memberLeave.bind(Key), am.number)),
-            voterJoins:     async.apply(async.forEach, am.getNewVoters(),       async.apply(Key.voterJoin.bind(Key), am.number)),
-            voterLeaves:    async.apply(async.forEach, am.getLeavingVoters(),   async.apply(Key.voterLeave.bind(Key), am.number)),
-            knownMembers:   async.apply(async.forEach, am.getNewMembers(),      Key.setKnown.bind(Key)),
-            knownVoters:    async.apply(async.forEach, am.getNewVoters(),       Key.setKnown.bind(Key)),
-            addMembers:     async.apply(async.forEach, am.getNewMembers(),      Key.addMember.bind(Key)),
-            addVoters:      async.apply(async.forEach, am.getNewVoters(),       Key.addVoter.bind(Key)),
-            removeMembers:  async.apply(async.forEach, am.getLeavingMembers(),  Key.removeMember.bind(Key)),
-            removeVoters:   async.apply(async.forEach, am.getLeavingVoters(),   Key.removeVoter.bind(Key)),
-            removeCKeys:    async.apply(CKey.remove.bind(CKey), {}),
-
-            // Leaving voters have no more current voting document
-            currentVoting:  async.apply(async.forEach, am.getLeavingVoters(),   async.apply(Voting.removeCurrents.bind(Voting))),
-          }, function (err) {
-            next(err);
-          });
-        },
-        function (next){
-          // Proposed member/voter => Actual member/voter
-          async.parallel([
-            async.apply(Key.update.bind(Key), { member: true  }, { $set: { proposedMember: true  }}, { multi: true }),
-            async.apply(Key.update.bind(Key), { member: false }, { $set: { proposedMember: false }}, { multi: true }),
-            async.apply(Key.update.bind(Key), { voter:  true  }, { $set: { proposedVoter:  true  }}, { multi: true }),
-            async.apply(Key.update.bind(Key), { voter:  false }, { $set: { proposedVoter:  false }}, { multi: true }),
-            async.apply(Key.update.bind(Key), {}, { $set: { lastVotingState: 0 }}, { multi: true }),
-            async.apply(Key.update.bind(Key), {}, { $set: { lastMemberState: 0 }}, { multi: true }),
-          ], function(err, results) {
-            next(err);
-          });
-        },
-        function (next){
-          // Set eligible memberships as current
-          Membership.getEligibleForAmendment(am.number - 1, next);
-        },
-        function (memberships, next) {
-          async.forEach(memberships, function(ms, callback){
-            ms.current = true;
-            ms.save(function (err) {
-              callback(err);
-            });
-          }, next);
-        },
-        function (next){
-          // Set eligible memberships as current
-          Voting.getEligibleForAmendment(am.number - 1, next);
-        },
-        function (votings, next) {
-          async.forEach(votings, function(voting, callback){
-            voting.current = true;
-            voting.save(function (err) {
-              callback(err);
-            });
-          }, next);
-        },
-        function (next){
-          Key.getMembers(next);
-        },
-        function (members, next){
-          // Update Merkle of proposed members
-          async.waterfall([
-            function (next){
-              Merkle.proposedMembers(next);
-            },
-            function (merkle, next){
-              var fingerprints = [];
-              members.forEach(function(m){
-                fingerprints.push(m.fingerprint);
-              });
-              fingerprints.sort();
-              merkle.initialize(fingerprints);
-              merkle.save(function (err) {
-                next(err);
-              });
-            },
-          ], next);
-        },
-        function (next){
-          Key.getVoters(next);
-        },
-        function (voters, next){
-          // Update Merkle of proposed voters
-          async.waterfall([
-            function (next){
-              Merkle.proposedVoters(next);
-            },
-            function (merkle, next){
-              var fingerprints = [];
-              voters.forEach(function(v){
-                fingerprints.push(v.fingerprint);
-              });
-              fingerprints.sort();
-              merkle.initialize(fingerprints);
-              merkle.save(function (err) {
-                next(err);
-              });
-            },
-          ], next);
-        },
-        // Create coins
-        function (next){
-          Key.getManaged(next);
-        },
-        function (keys, next){
-          if (!am.dividend) {
-            next();
-            return;
-          }
-          async.forEachSeries(keys, function(key, callback){
-            var coins = [];
-            var power = am.coinBase;
-            var cNumber = 0;
-            am.coinList.forEach(function(quantity){
-              for (var i = cNumber; i < cNumber + quantity; i++) {
-                var c = new Coin();
-                c.owner = key.fingerprint;
-                c.issuer = key.fingerprint;
-                c.amNumber = am.number;
-                c.coinNumber = i;
-                c.power = power;
-                coins.push(c);
-              }
-              cNumber += quantity;
-              power++;
-            });
-            async.forEach(coins, function(c, saved){
-              c.save(function (err) {
-                saved(err);
-              });
-            }, function (err) {
-              if (err)
-                logger.error(err);
-              callback(err);
-            });
-          }, next);
-        },
-        function (next){
-          // Say amendment was promoted
-          next(null, true);
-        },
-      ], cb);
-    }, done);
-  }
-
-  function defaultPromotion (followingAm, decision) {
-    async.waterfall([
-      function (next) {
-        if(!followingAm){
-          next('No new amendment for promotion');
-          return;
-        }
-        next();
-      },
-      function (next){
-        Amendment.current(function (err, am) {
-          next(null, am);
-        });
-      },
-      function (currentAm, next){
-        if(!next){
-          next = currentAm;
-          currentAm = null;
-        }
-        // Root amendment does not require votes
-        if(!currentAm && followingAm.number == 0){
-          next(null, true);
-          return;
-        }
-        if(!currentAm && followingAm.number != 0){
-          next('Not promoted: need root amendment first');
-          return;
-        }
-        // Vote for currently promoted: does not require promotion anymore
-        if(currentAm && currentAm.number == followingAm.number && currentAm.hash == followingAm.hash){
-          next('Stacked vote of currently promoted');
-          return;
-        }
-        // The amendment may be promoted
-        async.waterfall([
-          function (pass){
-            if(followingAm.number != currentAm.number + 1){
-              pass('Not promoted: bad number: not a follower of current amendment (#' + followingAm.number + ' does not follow #' + currentAm.number + ')');
-              return;
-            }
-            pass();
-          },
-          function (pass){
-            if(currentAm.hash != followingAm.previousHash){
-              pass('Not promoted: bad previous hash: this amendment does not have current amendment as previous');
-              return;
-            }
-            pass();
-          },
-          function (pass){
-            Merkle.signaturesOfAmendment(followingAm.number, followingAm.hash, function (err, merkle) {
-              pass(err, merkle);
-            });
-          },
-          function (votesMerkle, pass) {
-            if(votesMerkle.leaves().length < currentAm.nextVotes){
-              pass('Not promoted: not enough votes (requires at least ' + currentAm.nextVotes + ', currently have '+votesMerkle.leaves().length+')');
-              return;
-            }
-            pass();
-          }
-        ], next);
-      }
-    ], function (err) {
-      decision(err, err ? false : true);
-    });
-  }
-}
diff --git a/app/service/SyncService.js b/app/service/SyncService.js
deleted file mode 100644
index ca4ac76c19a933b9504225173c82c8edbd9f0b43..0000000000000000000000000000000000000000
--- a/app/service/SyncService.js
+++ /dev/null
@@ -1,875 +0,0 @@
-var jpgp     = require('../lib/jpgp');
-var async    = require('async');
-var moment   = require('moment');
-var request  = require('request');
-var vucoin   = require('vucoin');
-var merkle   = require('merkle');
-var _        = require('underscore');
-var openpgp  = require('openpgp');
-var Status   = require('../models/statusMessage');
-var coiner   = require('../lib/algos/coins/coiner');
-var log4js   = require('log4js');
-var logger   = require('../lib/logger')('sync');
-var mlogger  = require('../lib/logger')('membership');
-var vlogger  = require('../lib/logger')('voting');
-var mathlog  = require('../lib/logger')('registryp');
-
-mathlog.setLevel('INFO');
-
-// Constants
-var NO_CHANGES = "NO_CHANGES";
-
-module.exports.get = function (conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote) {
-  return new SyncService(conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote);
-};
-
-function SyncService (conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote) {
-
-  var that = this;
-  var currency = conf.currency;
-
-  var Amendment     = conn.model('Amendment');
-  var PublicKey     = conn.model('PublicKey');
-  var Membership    = conn.model('Membership');
-  var Voting        = conn.model('Voting');
-  var Merkle        = conn.model('Merkle');
-  var Vote          = conn.model('Vote');
-  var CKey          = conn.model('CKey');
-  var Statement = conn.model('Statement');
-  var Peer          = conn.model('Peer');
-  var Key           = conn.model('Key');
-  var Forward       = conn.model('Forward');
-  
-  var fifoMembershipOrVoting = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-  
-  var fifoStatement = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-  
-  var fifoSelfVote = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-  
-  var fifoSelfStatement = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-
-  this.submit = function (obj, done) {
-    var entry = new Membership(obj);
-    fifoMembershipOrVoting.push(function (cb) {
-      async.waterfall([
-
-        function (next){
-          PublicKey.getTheOne(entry.issuer, next);
-        },
-
-        // Verify signature
-        function(pubkey, callback){
-          var previous;
-          var current = null;
-          var nowIsIgnored = false;
-          var merkleOfNextMembers;
-          var amNext;
-          var currentContext, newContext;
-          async.waterfall([
-            function (next){
-              mlogger.debug('⬇ %s %s', entry.issuer, entry.membership);
-              if (ContractService.current().number != entry.amNumber) {
-                next('Wrong amendment number: should be \'' + ContractService.current().number + '\' but was \'' + entry.amNumber + '\'');
-                return;
-              }
-              if (ContractService.current().hash != entry.amHash) {
-                next('Wrong amendment hash: should be \'' + ContractService.current().hash + '\' but was \'' + entry.amHash + '\'');
-                return;
-              }
-              dependingInterval(entry,
-                function isTooLate (entryTS, minimalTS) {
-                  next('Too late for this membership (' + toDateString(entryTS) + '): your membership must be at least ' + toDateString(minimalTS) + ', time of current amendment. Retry.');
-                },
-                function isTooEarly (entryTS, nextTS) {
-                  next('Too early for this membership (' + toDateString(entryTS) + '): your membership must be max ' + toDateString(nextTS - 1) + ' (next AM date)');
-                },
-                function isGood () {
-                  Key.wasMember(entry.issuer, entry.amNumber, next);
-                }
-              );
-            },
-            function (isMember, next){
-              if (!isMember && entry.membership == 'OUT') {
-                next('You can only opt-in right now');
-              } else if (isMember && entry.membership == 'IN') {
-                next('You can only opt-out right now');
-              } else {
-                next();
-              }
-            },
-            function (next){
-              // Get already existing Membership for same amendment
-              Membership.getForAmendmentAndIssuer(entry.amNumber, entry.issuer, next);
-            },
-            function (entries, next){
-              if (entries.length > 0) {
-                next('Already received membership');
-              }
-              else next();
-            },
-            function (next){
-              // Saves entry
-              entry.propagated = false;
-              entry.save(function (err) {
-                next(err);
-              });
-            },
-            function (next){
-              mlogger.debug('✔ %s %s', entry.issuer, entry.membership);
-              next(null, entry);
-            }
-          ], callback);
-        }
-      ], cb);
-    }, done);
-  };
-
-  this.submitVoting = function (obj, done) {
-    var entry = new Voting(obj);
-    fifoMembershipOrVoting.push(function (cb) {
-      async.waterfall([
-
-        function (next){
-          PublicKey.getTheOne(entry.issuer, next);
-        },
-
-        function(pubkey, callback){
-          var current = null;
-          async.waterfall([
-            function (next){
-              if (ContractService.current().number != entry.amNumber) {
-                next('Wrong amendment number: should be \'' + ContractService.current().number + '\' but was \'' + entry.amNumber + '\'');
-                return;
-              }
-              if (ContractService.current().hash != entry.amHash) {
-                next('Wrong amendment hash: should be \'' + ContractService.current().hash + '\' but was \'' + entry.amHash + '\'');
-                return;
-              }
-              dependingInterval(entry,
-                function isTooLate (entryTS, minimalTS) {
-                  next('Too late for this voting(' + toDateString(entryTS) + '): amendment already voted. Retry.');
-                },
-                function isTooEarly () {
-                  next('Too early for this voting: retry when next amendment is voted.');
-                },
-                function isGood () {
-                  async.waterfall([
-                    function (next) {
-                      // Get already existing Membership for same amendment
-                      Voting.getForAmendmentAndIssuer(entry.amNumber, entry.issuer, next);
-                    },
-                    function (entries, next){
-                      if (entries.length > 0) {
-                        next('Refused: already received.');
-                        return;
-                      } else next();
-                    },
-                    function (next){
-                      // Saves entry
-                      entry.propagated = false;
-                      entry.save(function (err) {
-                        next(err);
-                      });
-                    },
-                    function (next) {
-                      // Returns the entry
-                      next(null, entry);
-                    },
-                  ], next);
-                }
-              );
-            },
-          ], callback);
-        }
-      ], cb);
-    }, done);
-  };
-
-  this.submitStatement = function (obj, done) {
-    var entry = new Statement(obj);
-    fifoStatement.push(function (cb) {
-      async.waterfall([
-        function (next) {
-          if (conf.sync.Algorithm.indexOf(entry.algorithm) == -1) {
-            next('Algorithm not managed by this node');
-            return;
-          }
-          Statement.getByIssuerAlgoAmendmentHashAndNumber(entry.issuer, entry.algorithm, entry.amendmentHash, entry.amendmentNumber, next);
-        },
-        function (cf, next) {
-          if (cf && cf.length > 0) {
-            next('Already received');
-            return;
-          }
-          Amendment.findPromotedByNumber(entry.amendmentNumber, next);
-        },
-        function (promoted, next) {
-          if (promoted.hash != entry.amendmentHash) {
-            next('Statement rejected: based on a non-promoted amendment');
-            return;
-          }
-          entry.save(function (err) {
-            next(err);
-          });
-        },
-        function (next) {
-          // OK
-          if (false && entry.selfGenerated) {
-            // Check Merkles & create ckeys
-            async.parallel({
-              membersJoining: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.membersIn.bind(Merkle),  entry.amendmentNumber, entry.algorithm), '+', entry.algorithm, true),
-              membersLeaving: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.membersOut.bind(Merkle), entry.amendmentNumber, entry.algorithm), '-', entry.algorithm, true),
-              votersJoining:  async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.votersIn.bind(Merkle),   entry.amendmentNumber, entry.algorithm), '+', entry.algorithm, false),
-              votersLeaving:  async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.votersOut.bind(Merkle),  entry.amendmentNumber, entry.algorithm), '-', entry.algorithm, false),
-            }, next);
-          } else {
-            // Increment count of witnesses
-            async.parallel({
-              membersJoining: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.membersIn',  '+', entry.algorithm, true),
-              membersLeaving: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.membersOut', '-', entry.algorithm, true),
-              votersJoining:  async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.votersIn',   '+', entry.algorithm, false),
-              votersLeaving:  async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.votersOut',  '-', entry.algorithm, false),
-            }, next);
-          }
-        },
-        function (res, next){
-          that.tryToVote(entry.amendmentNumber + 1, entry.algorithm, function (err) {
-            if (err) logger.warn(err);
-            next(null, entry);
-          });
-        },
-      ], cb);
-    }, done);
-  };
-
-  that.tryToVote = function (amNumber, algo, done) {
-    // Tries to vote
-    var now = new Date();
-    var amCurrent = null;
-    async.waterfall([
-      function (next){
-        Amendment.current(next);
-      },
-      function (current, next) {
-        amCurrent = current;
-        Statement.getForAmendmentAndAlgo(amNumber -1, algo, next);
-      },
-      function (cfs, next){
-        logger.debug("%s statements / %s voters = %s%", cfs.length, amCurrent.votersCount, cfs.length/amCurrent.votersCount*100)
-        if (cfs.length/amCurrent.votersCount < 0.6) {
-          next('Not voting yet, waiting for >= 60% voters');
-          return;
-        } else {
-          next();
-        }
-      },
-      function (next){
-        getOrCreateAmendment(amNumber, algo, next);
-      },
-      function (amNext, next){
-        if (daemonJudgesTimeForVote(amNext)) {
-
-          var raw = "";
-          async.waterfall([
-            function (next){
-              // Prepare AM
-              async.waterfall([
-                function (next){
-                  async.parallel({
-                    membersJoining: async.apply(lookForCKeys, '+', algo, true),
-                    membersLeaving: async.apply(lookForCKeys, '-', algo, true),
-                    votersJoining:  async.apply(lookForCKeys, '+', algo, false),
-                    votersLeaving:  async.apply(lookForCKeys, '-', algo, false),
-                    members:        async.apply(Key.getMembers.bind(Key)),
-                    voters:         async.apply(Key.getVoters.bind(Key))
-                  }, next);
-                },
-                function (res, next){
-                  // Update Merkle of proposed members
-                  var members = [];
-                  var voters = [];
-                  if (~res.membersJoining.indexOf(NO_CHANGES)) res.membersJoining = [];
-                  if (~res.membersLeaving.indexOf(NO_CHANGES)) res.membersLeaving = [];
-                  if (~res.votersJoining.indexOf(NO_CHANGES)) res.votersJoining = [];
-                  if (~res.votersLeaving.indexOf(NO_CHANGES)) res.votersLeaving = [];
-                  res.members.forEach(function(m){
-                    members.push(m.fingerprint);
-                  });
-                  res.voters.forEach(function(m){
-                    voters.push(m.fingerprint);
-                  });
-                  amNext.membersChanges = [];
-                  amNext.votersChanges = [];
-                  res.membersJoining.forEach(function(fpr){
-                    amNext.membersChanges.push('+' + fpr);
-                    if (members.indexOf(fpr) == -1)
-                      members.push(fpr);
-                  });
-                  res.membersLeaving.forEach(function(fpr){
-                    amNext.membersChanges.push('-' + fpr);
-                    var index = members.indexOf(fpr);
-                    if (~index) {
-                      members.splice(index, 1);
-                    }
-                  });
-                  res.votersJoining.forEach(function(fpr){
-                    amNext.votersChanges.push('+' + fpr);
-                    if (voters.indexOf(fpr) == -1)
-                      voters.push(fpr);
-                  });
-                  res.votersLeaving.forEach(function(fpr){
-                    amNext.votersChanges.push('-' + fpr);
-                    var index = voters.indexOf(fpr);
-                    if (~index) {
-                      voters.splice(index, 1);
-                    }
-                  });
-                  var merkleMembers = new Merkle();
-                  var merkleVoters = new Merkle();
-                  members.sort();
-                  voters.sort();
-                  merkleMembers.initialize(members);
-                  merkleVoters.initialize(voters);
-                  amNext.membersChanges.sort();
-                  amNext.membersCount = members.length;
-                  amNext.membersRoot = merkleMembers.root();
-                  amNext.votersChanges.sort();
-                  amNext.votersCount = voters.length;
-                  amNext.votersRoot = merkleVoters.root();
-                  // Update UniversalDividend
-                  updateUniversalDividend(amNext, next);
-                },
-                function (next) {
-                  amNext.save(function (err) {
-                    raw = amNext.getRaw();
-                    next(err);
-                  });
-                }
-              ], next);
-            },
-            function (next){
-              signsDetached(raw, next);
-            },
-            function (signature, next){
-              // TODO: à remplacer par _write
-              var signedAm = raw + signature;
-              vucoin(conf.ipv6 || conf.ipv4 || conf.dns, conf.port, false, false, function (err, node) {
-                next(null, signedAm, node);
-              });
-            },
-            function (vote, node, next){
-              node.hdc.amendments.votes.post(vote, next);
-            },
-            function (json, next){
-              var am = new Amendment(json.amendment);
-              var issuer = PeeringService.cert.fingerprint;
-              var hash = (am.getRaw() + json.signature).unix2dos().hash();
-              var basis = json.amendment.number;
-              Vote.getByIssuerHashAndBasis(issuer, hash, basis, function (err, vote) {
-                next(err, vote, hash, basis);
-              });
-            },
-            function (vote, hash, basis, next){
-              if (!vote) {
-                next('Strange! self vote was not found for #' + basis + '-' + hash + '... not recorded?');
-                return;
-              }
-              vote.selfGenerated = true;
-              vote.save(function  (err) {
-                next(err, vote);
-              });
-            },
-          ], next);
-          return;
-        }
-        next('Not yet');
-      },
-    ], done);
-  };
-
-  function updateCKeysFromRemoteMerkle (peerFPR, amNumber, method, op, algo, isMember, done) {
-    async.waterfall([
-      function (next){
-        Peer.getTheOne(peerFPR, next);
-      },
-      function (peer, next){
-        peer.connect(next);
-      },
-      function (node, next){
-        var f = eval(method);
-        f(amNumber, algo, { leaves: true }, next);
-      },
-      function (json, next){
-        incrementForKeys(json.leaves, op, algo, isMember, done);
-      },
-    ], function (err) {
-      if (err) logger.warn(err);
-      done(err);
-    });
-  }
-
-  function updateCKeysFromLocalMerkle (merkleGet, op, algo, isMember, done) {
-    async.waterfall([
-      function (next){
-        merkleGet(next);
-      },
-      function (merkle, next){
-        incrementForKeys(merkle.leaves(), op, algo, isMember, done);
-      },
-    ], done);
-  }
-
-  function incrementForKeys (keys, op, algo, isMember, done) {
-    if (keys.length == 0) {
-      CKey.increment(NO_CHANGES, op, algo, isMember, function (err) {
-        done(err);
-      });
-    }
-    else {
-      async.forEach(keys, function(leaf, callback){
-        CKey.increment(leaf, op, algo, isMember, callback);
-      }, done);
-    }
-  }
-
-  this.getVote = function (amNumber, algo, done) {
-    fifoSelfVote.push(function (cb) {
-      async.waterfall([
-        function (next){
-          Vote.getSelfForAlgo(amNumber, algo, next);
-        },
-        function (vote, next){
-          if (vote){
-            next(null, vote);
-            return;
-          }
-          next('Vote unavailable for now');
-        },
-      ], cb);
-    }, done);
-  };
-
-  function lookForCKeys (op, algo, areMembers, done) {
-    async.waterfall([
-      function (next){
-        CKey.findThose(op, algo, areMembers, next);
-      },
-      function (ckeys, next){
-        // Take all keys between AVG and +/- STDVAR
-        var total = 0;
-        ckeys.forEach(function(ck){
-          total += ck.count;
-        });
-        if (total > 0) {
-          var avg = total / ckeys.length;
-          var variance = 0;
-          ckeys.forEach(function(ck){
-            variance += (ck.count - avg)*(ck.count - avg);
-          });
-          variance /= ckeys.length;
-          var stdvar = Math.sqrt(variance);
-          var min = avg - stdvar;
-          var max = avg + stdvar;
-          var keys = [];
-          ckeys.forEach(function(ck){
-            if (ck.count >= min || ck.count <= max)
-              keys.push(ck.fingerprint);
-          });
-          next(null, keys);
-        } else {
-          // No keys
-          next(null, []);
-        }
-      },
-    ], done);
-  }
-
-  this.getStatement = function (amNumber, algo, done) {
-    if (amNumber == 0) {
-      done('Not available for AM#0');
-      return;
-    }
-    var basis = amNumber - 1;
-    fifoSelfStatement.push(function (cb) {
-      async.waterfall([
-        function (next){
-          Statement.getSelf(basis, algo, function (err, statement) {
-            next(null, statement);
-          });
-        },
-        function (st, next){
-          if (st){
-            next(null, st);
-            return;
-          }
-          // Tries to create Statement
-          var now = new Date();
-          async.waterfall([
-            function (next){
-              Amendment.findPromotedByNumber(basis, next);
-            },
-            function (amPrevious, next){
-              if (daemonJudgesTimeForVote({ generated: amPrevious.generated + conf.sync.AMFreq })) {
-
-                var cert = PeeringService.cert;
-                var st = new Statement();
-                st.version = "1";
-                st.currency = currency;
-                st.algorithm = algo;
-                st.date = new Date().utc();
-                st.issuer = cert.fingerprint;
-                st.amendmentNumber = amPrevious.number;
-                st.amendmentHash = amPrevious.hash;
-                async.waterfall([
-                  function (next) {
-                    computeLocalMSandVTChanges(basis, algo, next);
-                  },
-                  function (membersJoining, membersLeaving, votersJoining, votersLeaving, members, voters, next){
-                    async.parallel({
-                      membersJoining: function(cb) {
-                        async.waterfall([
-                          async.apply(Merkle.membersIn.bind(Merkle), basis, algo),
-                          function (merkle, next) {
-                            merkle.initialize(membersJoining);
-                            merkle.save(function(err){
-                              next(err, merkle);
-                            });
-                          },
-                          function (merkle, next) {
-                            st.membersJoiningRoot = merkle.root();
-                            st.membersJoiningCount = membersJoining.length;
-                            next();
-                          }
-                        ], cb);
-                      },
-                      membersLeaving: function(cb) {
-                        async.waterfall([
-                          async.apply(Merkle.membersOut.bind(Merkle), basis, algo),
-                          function (merkle, next) {
-                            merkle.initialize(membersLeaving);
-                            merkle.save(function(err){
-                              next(err, merkle);
-                            });
-                          },
-                          function (merkle, next) {
-                            st.membersLeavingRoot = merkle.root();
-                            st.membersLeavingCount = membersLeaving.length;
-                            next();
-                          }
-                        ], cb);
-                      },
-                      votersJoining:  function(cb) {
-                        async.waterfall([
-                          async.apply(Merkle.votersIn.bind(Merkle), basis, algo),
-                          function (merkle, next) {
-                            merkle.initialize(votersJoining);
-                            merkle.save(function(err){
-                              next(err, merkle);
-                            });
-                          },
-                          function (merkle, next) {
-                            st.votersJoiningRoot = merkle.root();
-                            st.votersJoiningCount = votersJoining.length;
-                            next();
-                          }
-                        ], cb);
-                      },
-                      votersLeaving:  function(cb) {
-                        async.waterfall([
-                          async.apply(Merkle.votersOut.bind(Merkle), basis, algo),
-                          function (merkle, next) {
-                            merkle.initialize(votersLeaving);
-                            merkle.save(function(err){
-                              next(err, merkle);
-                            });
-                          },
-                          function (merkle, next) {
-                            st.votersLeavingRoot = merkle.root();
-                            st.votersLeavingCount = votersLeaving.length;
-                            next();
-                          }
-                        ], cb);
-                      },
-                    }, function (err) {
-                      next(err);
-                    });
-                  },
-                  function (next) {
-                    signsDetached(st.getRaw(), next);
-                  },
-                  function (signature, next){
-                    st.signature = signature;
-                    st.selfGenerated = true;
-                    next(null, st);
-                  },
-                ], next);
-                return;
-              }
-              next('Not yet');
-            },
-          ], next);
-        },
-      ], cb);
-    }, done);
-  };
-
-  this.createSelfVoting = function (promoted, done) {
-    var vt = new Voting({
-      version: 1,
-      currency: currency,
-      type: "VOTING",
-      issuer: PeeringService.cert.fingerprint,
-      date: new Date(promoted.generated*1000),
-      amNumber: promoted.number,
-      amHash: promoted.hash
-    });
-    async.waterfall([
-      function (next){
-        signsDetached(vt.getRaw(), next);
-      },
-      function (signature, next){
-        vt.signature = signature;
-        PublicKey.getTheOne(PeeringService.cert.fingerprint, next);
-      },
-      function (pubkey, next) {
-        next(null, vt, pubkey);
-      },
-    ], done);
-  }
-
-  this.getLastVoterOn = function (fpr, done) {
-    // Get last presence timestamp as a voter
-    async.waterfall([
-      function (next){
-        Key.getLastVotingAmNumber(fpr, next);
-      },
-      function (amNumber, next){
-        if (amNumber == null) {
-          next('Key has never been a voter', null);
-          return;
-        } else {
-          Amendment.findPromotedByNumber(amNumber, next);
-        }
-      },
-      function (am, next){
-        next(null, am.generated);
-      },
-    ], function (err, voterOn) {
-      done(null, voterOn);
-    });
-  }
-
-  function dependingInterval (entry, isTooLate, isTooEarly, isGood) {
-    Amendment.current(function (err, am) {
-      var currentGenerated = am ? am.generated : conf.sync.AMStart;
-      var entryTimestamp = parseInt(entry.date.getTime()/1000, 10);
-      if (currentGenerated > entryTimestamp) {
-        isTooLate(entryTimestamp, currentGenerated);
-      } else if(entryTimestamp >= currentGenerated + conf.sync.AMFreq) {
-        isTooEarly(entryTimestamp, currentGenerated + conf.sync.AMFreq);
-      } else {
-        isGood(am);
-      }
-    });
-  }
-
-  function getOrCreateAmendment (amNumber, algo, done) {
-    Amendment.getTheOneToBeVoted(amNumber, algo, function (err, am) {
-      if (am) done(null, am);
-      else createAmendment(amNumber - 1, algo, function (err, amCreated) {
-        done(err, amCreated);
-      });
-    });
-  }
-
-  /**
-  * Create next amendment following the one with `basis` amendment number, taking in account memberships,
-  * votings and pubkeys locally received.
-  **/
-  function createAmendment (basis, algo, done) {
-    var amNext = new Amendment();
-    async.waterfall([
-      function (next){
-        Amendment.findPromotedByNumber(basis, function (err, am) {
-          next(null, am);
-        });
-      },
-      function (am, next){
-        amNext.selfGenerated = true;
-        amNext.algo = algo;
-        amNext.version = 1;
-        amNext.currency = currency;
-        amNext.coinAlgo = "Base2Draft";
-        amNext.membersChanges = [];
-        amNext.votersChanges = [];
-        // amNext.nextVotes = Math.ceil(((am && am.votersCount) || 0) * conf.sync.Consensus);
-        if (am) {
-          amNext.number = am.number + 1;
-          amNext.monetaryMass = am.monetaryMass;
-          amNext.generated = am.generated + conf.sync.AMFreq;
-          amNext.previousHash = am.hash;
-        } else {
-          amNext.number = 0;
-          amNext.monetaryMass = 0;
-          amNext.generated = conf.sync.AMStart;
-        }
-        amNext.save(function (err) {
-          next(err);
-        });
-      },
-    ], function (err) {
-      done(err, amNext);
-    });
-  }
-
-  function computeLocalMSandVTChanges (basis, algo, done) {
-    var isMember = function (fpr, done) {
-      if (basis == -1)
-        done(null, true);
-      else
-        Key.wasMember(fpr, basis, done);
-    };
-    var getPubkey = PublicKey.getTheOne.bind(PublicKey);
-    var algos = {
-      "1Sig": require('../lib/algos/community/1Sig')(isMember, getPubkey),
-      "AnyKey": require('../lib/algos/community/AnyKey')
-    };
-    var algoFunc = algos[algo];
-    if (!algoFunc) {
-      var err = "Unsupported algo '" + algo + "'";
-      done(new Error(err));
-      return;
-    }
-    var members = [];
-    var voters = [];
-    var membersJoining = [];
-    var membersLeaving = [];
-    var votersJoining = [];
-    var votersLeaving = [];
-    async.waterfall([
-      function (next){
-        async.parallel({
-          members:     async.apply(Key.getMembersOn.bind(Key), basis),
-          voters:      async.apply(Key.getVotersOn.bind(Key), basis),
-          memberships: async.apply(Membership.getEligibleForAmendment.bind(Membership), basis),
-          votings:     async.apply(Voting.getEligibleForAmendment.bind(Voting), basis),
-        }, next);
-      },
-      function (result, next){
-        result.members.forEach(function(k) { members.push(k.fingerprint); });
-        result.voters.forEach(function(k) { voters.push(k.fingerprint); });
-        var changingKeys = members.slice().concat(voters);
-        result.memberships.forEach(function(ms){ changingKeys.push(ms.issuer); });
-        result.votings.forEach(function(ms){ changingKeys.push(ms.issuer); });
-        // Duplicate free array
-        changingKeys = _(changingKeys).uniq();
-        async.forEach(changingKeys, function (fpr, cb) {
-          async.waterfall([
-            function (next){
-              memberContext(fpr, basis, next);
-            },
-            function (context, next){
-              if (~members.indexOf(fpr))
-                context.currentMembership = { membership: 'IN' };
-              else
-                context.currentMembership = null;
-              algoFunc(context.pubkey, context, { generated: conf.sync.AMStart + basis*conf.sync.AMFreq }, next);
-            },
-            function (indicators, next){
-              var isMember = ~members.indexOf(fpr);
-              if (indicators.membership == 1)  membersJoining.push(fpr);
-              if (indicators.membership == -1) membersLeaving.push(fpr);
-              if (isMember && indicators.key == 1)  votersJoining.push(fpr);
-              if (isMember && indicators.key == -1) votersLeaving.push(fpr);
-              next();
-            },
-          ], cb);
-        }, next);
-      },
-      function (next){
-        members.sort();
-        voters.sort();
-        membersJoining.sort();
-        membersLeaving.sort();
-        votersJoining.sort();
-        votersLeaving.sort();
-        next(null, membersJoining, membersLeaving, votersJoining, votersLeaving, members, voters);
-      },
-    ], done);
-  }
-
-  /**
-  * Retrieve member's membership & voting context for next promoted amendment.
-  */
-  function memberContext (member, amNumber, done) {
-    async.parallel({
-      voterOn: function (callback){
-        that.getLastVoterOn(member, callback);
-      },
-      nextMembership: function (callback){
-        // Get lastly emitted & valid (not confirmed) membership FOR amNumber
-        Membership.getForAmendmentAndIssuer(amNumber, member, function (err, records) {
-          var res = (err || !records || records.length == 0) ? null : records[0];
-          callback(null, res);
-        });
-      },
-      nextVoting: function (callback){
-        // Get lastly emitted & valid (not confirmed) votings FOR amNumber
-        Voting.getForAmendmentAndIssuer(amNumber, member, function (err, votings) {
-          var res = (err || !votings || votings.length == 0) ? null : votings[0];
-          callback(null, res);
-        });
-      },
-      pubkey: function (callback){
-        // Get lastly emitted & valid (not confirmed) votings FOR amNumber
-        PublicKey.getTheOne(member, callback);
-      }
-    }, function (err, ctx) {
-      // Add amendment number
-      ctx.amNumber = amNumber;
-      done(err, ctx);
-    });
-  }
-
-  function updateUniversalDividend (amNext, done) {
-    // Time for Universal Dividend (and we have members)
-    var delayPassedSinceRootAM = (amNext.generated - conf.sync.AMStart);
-    if (delayPassedSinceRootAM > 0 && delayPassedSinceRootAM % conf.sync.UDFreq == 0 && amNext.membersCount > 0) {
-      async.waterfall([
-        function (next) {
-          Amendment.getPreviouslyPromotedWithDividend(next);
-        },
-        function (previousWithUD, next){
-          var prevM = (previousWithUD && previousWithUD.monetaryMass) || 0;
-          var prevUD = (previousWithUD && previousWithUD.dividend) || conf.sync.UD0;
-          var prevN = (previousWithUD && previousWithUD.membersCount) || 0;
-          amNext.monetaryMass = prevM + prevUD*prevN;
-          var c = conf.sync.UDPercent;
-          var UD = Math.ceil(c*amNext.monetaryMass/amNext.membersCount);
-          amNext.dividend = Math.max(prevUD, UD); // Integer
-          var coinage = coiner.Base2Draft(amNext.dividend, 0, 0);
-          amNext.coinBase = coinage.coinBase;
-          amNext.coinList = coinage.coinList;
-          next();
-        },
-      ], done);
-    }
-    else done(null);
-  }
-};
-/**************** Utils ***********************/
-
-function toDateString (timestamp) {
-  var intTimpestamp = parseInt(timestamp);
-  var d = new Date();
-  d.setTime(timestamp*1000);
-  return moment(d).format("GGGG-MM-DD hh:mm:ss");
-}
diff --git a/app/service/VoteService.js b/app/service/VoteService.js
deleted file mode 100644
index 40336bca8e2a9b266f6e7ff94ad66b177547d3fe..0000000000000000000000000000000000000000
--- a/app/service/VoteService.js
+++ /dev/null
@@ -1,205 +0,0 @@
-var jpgp      = require('../lib/jpgp');
-var async     = require('async');
-var _         = require('underscore');
-var merkle    = require('merkle');
-var logger    = require('../lib/logger')('vote');
-var alogger   = require('../lib/logger')('amendment');
-
-module.exports.get = function (conn, StrategyService) {
-  return new VoteService(conn, StrategyService);
-};
-
-function VoteService (conn, StrategyService) {
-
-  var Amendment = conn.model('Amendment');
-  var PublicKey = conn.model('PublicKey');
-  var Merkle    = conn.model('Merkle');
-  var Vote      = conn.model('Vote');
-  var Key       = conn.model('Key');
-  
-  var fifo = async.queue(function (task, callback) {
-    task(callback);
-  }, 1);
-
-  this.submit = function(jsonVote, callback) {
-    var vote = new Vote(jsonVote);
-    vote.issuer = jsonVote.pubkey.fingerprint;
-    vote.amendment = new Amendment(jsonVote.amendment);
-    var hash = vote.amendment.getHash();
-    var that = this;
-    fifo.push(function (cb) {
-      async.waterfall([
-        function (next){
-          Amendment.current(function (err, am) {
-            var currNumber = am ? parseInt(am.number) : -1;
-            var voteNumber = parseInt(vote.basis)
-            if(voteNumber > currNumber + 1){
-              next('Previous amendment not found, cannot record vote for amendment #' + vote.basis);
-              return;
-            }
-            next();
-          });
-        },
-        function (next){
-          if (vote.amendment.generated > vote.sigDate.timestamp()) {
-            next('Cannot vote for future amendment');
-            return;
-          }
-          next();
-        },
-        // Issuer is a voter
-        function (next){
-          Key.wasVoter(vote.pubkey.fingerprint, vote.amendment.number - 1, next);
-        },
-        function (isVoter, next){
-          if(!isVoter && vote.amendment.number != 0){
-            next('Only voters may vote for amendments');
-            return;
-          }
-          next();
-        },
-        function (next){
-          if(parseInt(vote.basis) > 0){
-            // Check if previous votes tree matches
-            var pendingAm;
-            async.waterfall([
-              function (next){
-                vote.getAmendment(next);
-              },
-              function (am, next){
-                pendingAm = am;
-                Merkle.signaturesOfAmendment(pendingAm.number - 1, pendingAm.previousHash, function (err, merkle) {
-                  next(err, merkle);
-                });
-              },
-              function (signaturesMerkle, next){
-                next(null, signaturesMerkle.leaves());
-              }
-            ], next);
-          } else {
-            // No previous votes exists for AM0, no need to check signatures
-            next(null, []);
-          }
-        },
-        function (signaturesMerkle, next) {
-          /* Update URLs:
-              - hdc/amendments/[AMENDMENT_ID]/self
-              - hdc/amendments/[AMENDMENT_ID]/signatures */
-          that.saveAmendmentOfVote(vote, vote.amendment, signaturesMerkle, next);
-        },
-        function (am, next){
-          vote.amendment = am;
-          // Find preceding vote of the issuer, for this amendment
-          Vote.find({ issuer: vote.pubkey.fingerprint, basis: vote.basis, amendmentHash: am.hash }, next);
-        },
-        function (votes, next){
-          // Save vote
-          if(votes.length > 0){
-            next('Vote already received');
-            return;
-          }
-          vote.save(function (err) {
-            next(err);
-          });
-        },
-        function ( next){
-          // Update signatures (hdc/amendments/votes/[AMENDMENT_ID])
-          Merkle.updateSignaturesOfAmendment(vote.amendment, jsonVote.pubkey.fingerprint, function (err) {
-            next(err, vote.amendment, vote);
-          });
-        },
-        function (am, recordedVote, next) {
-          // Promotion time
-          StrategyService.tryToPromote(am, function (err, wasPromoted) {
-            if (err) logger.warn(err);
-            next(null, am, recordedVote, wasPromoted ? true : false);
-          });
-        }
-      ], cb);
-    }, callback);
-  };
-
-  this.saveAmendmentOfVote = function (vote, amendment, signaturesLeaves, done) {
-    var am;
-    async.waterfall([
-      function (next) {
-        Amendment.find({ number: amendment.number, hash: amendment.hash }, next);
-      },
-      function (ams, next){
-        am = (ams && ams[0]) || amendment;
-        // Donne le Merkle des signatures (hdc/amendments/[AMENDMENT_ID]/signatures)
-        Merkle.signaturesOfAmendment(am.number, am.hash, next);
-      },
-      function (merkle, next){
-        // Met à jour le Merkle
-        merkle.initialize(signaturesLeaves);
-        merkle.save(function (err){
-          next(err);
-        });
-      },
-      function (next){
-        // Met à jour la Masse Monétaire
-        am.getPrevious(function (err, previous) {
-          next(null, previous);
-        });
-      },
-      function (previous, next){
-        var prevM = (previous && previous.monetaryMass) || 0;
-        var prevUD = (previous && previous.dividend) || 0;
-        var prevN = (previous && previous.membersCount) || 0;
-        am.monetaryMass = prevM + prevUD*prevN;
-        next();
-      },
-      function (next){
-        // Termine la sauvegarde
-        am.save(function (err) {
-          next(err, am);
-        });
-      },
-    ], done);
-  };
-
-  this.votesIndex = function (onceDone) {
-    async.waterfall([
-      function (next){
-        Vote.find(next);
-      },
-      function (votes, next){
-        var map = {};
-        votes.forEach(function (v) {
-          var id = [v.basis, v.amendmentHash].join('-');
-          map[id] = map[id] ? map[id] + 1 : 1;
-        });
-        var tab = [];
-        for(var id in map){
-          var sp = id.split('-');
-          tab.push({ number: sp[0], hash: sp[1], count: map[id] });
-        }
-        next(null, tab);
-      },
-      function (stats, next) {
-        var result = {};
-        async.forEach(stats, function(item, callback){
-            if(!result[item.number]) result[item.number] = {};
-            result[item.number][item.hash] = item.count;
-            callback();
-          }, function(err){
-            if(err){
-              next(err);
-              return;
-            }
-            var json = { amendments: {} };
-            for(var number in result){
-              var hashes = {};
-              for(var hash in result[number]){
-                hashes[hash] = result[number][hash];
-              }
-              json.amendments[number] = hashes;
-            }
-            next(null, json);
-          }
-        );
-      }
-    ], onceDone);
-  }
-}
diff --git a/app/service/WalletService.js b/app/service/WalletService.js
index 1f1fc37e00fcc56d3d0791989d60499071815aea..dd2901fb6e0dc60256c95ab31e99efc798720b24 100644
--- a/app/service/WalletService.js
+++ b/app/service/WalletService.js
@@ -12,7 +12,6 @@ function WalletService (conn) {
   var Amendment = conn.model('Amendment');
   var PublicKey = conn.model('PublicKey');
   var Merkle    = conn.model('Merkle');
-  var Vote      = conn.model('Vote');
 
   this.submit = function (obj, done) {
 
diff --git a/bin/ucoind b/bin/ucoind
index afdf73e2dc991165702d049fec97b7542b98c80c..8271ee81223ddab6023bd7fc24e5f14364bd423d 100755
--- a/bin/ucoind
+++ b/bin/ucoind
@@ -41,17 +41,7 @@ program
   .option('--remotep <port>', 'Remote port others may use to contact this node')
   .option('--kmanagement <ALL|KEYS>', 'Define key management policy')
   .option('--kaccept <ALL|KEYS>', 'Define key acceptance policy')
-  .option('--amdaemon <ON|OFF>', 'ucoin is launched with a specific daemon helping to get other peers\' votes')
-  .option('--amstart <timestamp>', 'First amendment generated date', parseMoment)
-  .option('--amfreq <timestamp>', 'Amendments frequency, in seconds', parseInt)
-  .option('--udfreq <timestamp>', 'Universal Dividend frequency, in seconds', parseInt)
-  .option('--ud0 <integer>', 'First Universal Dividend value (a.k.a \'UD0\')', parseInt)
-  .option('--udpercent <float>', 'Percent of monetary mass growth per UD', parseFloat)
-  .option('--consensus <float>', 'Percent of voters required to accept an amendment', parseFloat)
-  .option('--msvalidity <timestamp>', 'Duration of a valid membership, in seconds', parseInt)
-  .option('--vtvalidity <timestamp>', 'Duration of a valid voter, in seconds', parseInt)
   .option('--openpgpjs', 'Prefer using embedded Openpgpjs implementation for signing requests')
-  .option('--algorithm <AnyKey:1Sig>', 'Algorithms to use for community changes. Use \':\' to give multiple values', splitColon)
   ;
 
 program
@@ -112,8 +102,7 @@ program
         'currency': wiz.configCurrency,
         'openpgp': wiz.configOpenpgp,
         'network': wiz.configNetwork,
-        'key': wiz.configKey,
-        'autovote': wiz.configAutovote
+        'key': wiz.configKey
       };
       var wizDo = task[step] || wiz.configAll;
       async.waterfall([
@@ -128,7 +117,7 @@ program
         },
         function (next) {
           // Check config
-          service(DO_NOT_LISTEN_HTTP, ucoin.createRegistryServer, function (key, server, conf) {
+          service(DO_NOT_LISTEN_HTTP, ucoin.createPeerServer, function (key, server, conf) {
             next();
           })(null, null);
         }
@@ -297,11 +286,11 @@ program
 program
   .command('start')
   .description('Start uCoin server using given --currency')
-  .action(service(LISTEN_HTTP, ucoin.createRegistryServer, function (server, conf) {
+  .action(service(LISTEN_HTTP, ucoin.createPKSServer, function (server, conf) {
 
-    server
-      .pipe(router(server.PeeringService.cert.fingerprint, server.conn))
-      .pipe(multicaster());
+    // server
+    //   .pipe(router(server.PeeringService.cert.fingerprint, server.conn))
+    //   .pipe(multicaster());
 
     // Launching server
     server.on('BMALoaded', function (err, app) {
@@ -344,16 +333,6 @@ function overrideConf(conf) {
     policy: {
       keys: program.kmanagement,
       pubkeys: program.kaccept
-    },
-    sync: {
-      AMDaemon: program.amdaemon,
-      AMStart: program.amstart,
-      AMFreq: program.amfreq,
-      UDFreq: program.udfreq,
-      UD0: program.ud0,
-      UDPercent: program.udpercent,
-      Consensus: program.consensus,
-      Algorithm: program.algorithm
     }
   };
 
@@ -373,14 +352,6 @@ function overrideConf(conf) {
   if (cli.server.remote.port != undefined)  conf.remoteport     = cli.server.remote.port;
   if (cli.policy.keys)                      conf.kmanagement    = cli.policy.keys;
   if (cli.policy.pubkeys)                   conf.kaccept        = cli.policy.pubkeys;
-  if (cli.sync.AMDaemon)                    conf.sync.AMDaemon  = cli.sync.AMDaemon;
-  if (cli.sync.AMStart)                     conf.sync.AMStart   = cli.sync.AMStart;
-  if (cli.sync.AMFreq)                      conf.sync.AMFreq    = cli.sync.AMFreq;
-  if (cli.sync.UDFreq)                      conf.sync.UDFreq    = cli.sync.UDFreq;
-  if (cli.sync.UD0)                         conf.sync.UD0       = cli.sync.UD0;
-  if (cli.sync.UDPercent)                   conf.sync.UDPercent = cli.sync.UDPercent;
-  if (cli.sync.Consensus)                   conf.sync.Consensus = cli.sync.Consensus;
-  if (cli.sync.Algorithm)                   conf.sync.Algorithm = cli.sync.Algorithm;
 
   // Specific internal settings
   conf.createNext = true;
@@ -416,7 +387,7 @@ function service(listenHTTP, serverFactory, callback) {
   if (arguments.length == 1) {
     callback = listenHTTP;
     listenHTTP = false;
-    serverFactory = ucoin.createHDCServer;
+    serverFactory = ucoin.createWOTServer;
   } else if (arguments.length == 2) {
     callback = serverFactory;
     serverFactory = ucoin.createHDCServer;
diff --git a/doc/HTTP_API.md b/doc/HTTP_API.md
index 718577df4db91205bf56f6d1f0c9af2679b2779d..680d57d9c8290ef3ea1c4362be209acb54322932 100644
--- a/doc/HTTP_API.md
+++ b/doc/HTTP_API.md
@@ -790,7 +790,7 @@ Consensus         | Percent of voters required to valid an Amendment
 #### `am/[AMENDMENT_NUMBER]`
 **Goal**
 
-GET the promoted amendment with number `AMENDMENT_NUMBER` (amendment which received enough votes to be accepted).
+GET the promoted amendment with number `AMENDMENT_NUMBER`.
 
 **Parameters**
 
@@ -809,11 +809,6 @@ The promoted amendment if it exists (otherwise return HTTP 404).
   "generated": 1400588975,
   "previousHash": "0F45DFDA214005250D4D2CBE4C7B91E60227B0E5",
   "dividend": "100",
-  "votersRoot": "DC7A9229DFDABFB9769789B7BFAE08048BCB856F",
-  "votersCount": "2",
-  "votersChanges": [
-    "-C73882B64B7E72237A2F460CE9CAB76D19A8651E"
-  ],
   "membersRoot": "F92B6F81C85200250EE51783F5F9F6ACA57A9AFF",
   "membersCount": "4",
   "membersChanges": [
diff --git a/doc/Protocol.md b/doc/Protocol.md
index 25da8712c16679b771f3f771bf988b928fea2585..8b098d0795d900ab67583a96781d1e6867e63daf 100644
--- a/doc/Protocol.md
+++ b/doc/Protocol.md
@@ -36,7 +36,7 @@ Word | Description
 ---- | -------------
 Universal Dividend | Money issuance **directly** and **exclusively** on community members.
 Community | A groupment of individuals linked together trought a Monetary Contract.
-Monetary Contract | A document gathering the informations defining the community members, voters and monetary mass inside it.
+Monetary Contract | A document gathering the informations defining the community members and monetary mass inside it.
 
 ## Introduction
 
diff --git a/hdcserver.js b/hdcserver.js
deleted file mode 100644
index 86d0b06eb9f1eb6ed7e464b9541930ffb8d9959a..0000000000000000000000000000000000000000
--- a/hdcserver.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var async   = require('async');
-var util    = require('util');
-var parsers = require('./app/lib/streams/parsers/doc');
-var PKSServer  = require('./pksserver');
-
-function HDCServer (dbConf, overrideConf, interceptors, onInit) {
-
-  var logger  = require('./app/lib/logger')(dbConf.name);
-
-  var selfInterceptors = [
-    {
-      // Vote
-      matches: function (obj) {
-        return obj.amendment ? true : false;
-      },
-      treatment: function (server, obj, next) {
-        logger.debug('⬇ VOTE of %s for %s-%s', "0x" + obj.keyID, obj.amendment.number, obj.amendment.hash);
-        async.waterfall([
-          function (next){
-            server.VoteService.submit(obj, next);
-          },
-          function (am, vote, wasPromoted, next){
-            logger.debug('✔ VOTE of %s for %s-%s', "0x" + obj.keyID, obj.amendment.number, obj.amendment.hash);
-            server.emit('vote', vote);
-            if (wasPromoted) {
-              server.emit('promoted', vote.amendment);
-            }
-            next(null, vote);
-          },
-        ], next);
-      }
-    },{
-      // Transaction
-      matches: function (obj) {
-        return obj.recipient ? true : false;
-      },
-      treatment: function (server, obj, next) {
-        async.waterfall([
-          function (next){
-            server.TransactionsService.processTx(obj, next);
-          },
-          function (tx, next){
-            server.emit('transaction', tx);
-            next(null, tx);
-          },
-        ], next);
-      }
-    }
-  ];
-
-  PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []);
-
-  var that = this;
-
-  this._read = function (size) {
-  };
-
-  this._initServices = function(conn, done) {
-    this.KeyService         = require('./app/service/KeyService').get(conn);
-    this.PublicKeyService   = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
-    this.ContractService    = require('./app/service/ContractService').get(conn, that.conf);
-    this.StrategyService    = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService);
-    this.VoteService        = require('./app/service/VoteService').get(conn, that.StrategyService);
-    // this.PeeringService     = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService);
-    this.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService);
-    async.parallel({
-      contract: function(callback){
-        that.ContractService.load(callback);
-      },
-      peering: function(callback){
-        // that.PeeringService.load(callback);
-        callback();
-      },
-    }, function (err) {
-      done(err);
-    });
-  };
-
-  this._listenBMA = function (app) {
-    this.listenPKS(app);
-    this.listenHDC(app);
-  };
-
-  this.listenHDC = function (app) {
-    var hdc = require('./app/controllers/hdc')(that);
-    app.get(    '/hdc/amendments/promoted',                        hdc.amendments.promoted);
-    app.get(    '/hdc/amendments/promoted/:am_number',             hdc.amendments.promotedNumber);
-    app.get(    '/hdc/amendments/view/:amendment_id/self',         hdc.amendments.viewAM.self);
-    app.get(    '/hdc/amendments/view/:amendment_id/signatures',   hdc.amendments.votes.sigs);
-    app.get(    '/hdc/amendments/votes',                           hdc.amendments.votes.get);
-    app.post(   '/hdc/amendments/votes',                           hdc.amendments.votes.post);
-    app.post(   '/hdc/transactions/process',                       hdc.transactions.processTx);
-    app.get(    '/hdc/transactions/last/:count',                   hdc.transactions.lastNAll);
-    app.get(    '/hdc/transactions/sender/:fpr',                   hdc.transactions.sender.get);
-    app.get(    '/hdc/transactions/sender/:fpr/view/:number',      hdc.transactions.viewtx);
-    app.get(    '/hdc/transactions/sender/:fpr/last/:count',       hdc.transactions.sender.lastNofSender);
-    app.get(    '/hdc/transactions/sender/:fpr/last/:count/:from', hdc.transactions.sender.lastNofSender);
-    app.get(    '/hdc/transactions/recipient/:fpr',                hdc.transactions.recipient);
-    app.get(    '/hdc/transactions/refering/:fpr/:number',         hdc.transactions.refering);
-    app.get(    '/hdc/coins/list/:fpr',                            hdc.coins.list);
-    app.get(    '/hdc/coins/view/:coin_id/owner',                  hdc.coins.view);
-    app.get(    '/hdc/coins/view/:coin_id/history',                hdc.coins.history);
-  };
-}
-
-util.inherits(HDCServer, PKSServer);
-
-module.exports = HDCServer;
diff --git a/index.js b/index.js
index 386cd1d2150e1ef62003b1ade8ac61d9d2fd7f1f..a5fb799541f0470e2b46d590cdbffdf60452e0de 100644
--- a/index.js
+++ b/index.js
@@ -1,9 +1,9 @@
 
-var Server         = require('./server');
-var PKSServer      = require('./pksserver');
-var HDCServer      = require('./hdcserver');
-var PeerServer     = require('./peerserver');
-var RegistryServer = require('./regserver');
+var Server     = require('./server');
+var PKSServer  = require('./pksserver');
+var WOTServer  = require('./wotserver');
+var PeerServer = require('./peerserver');
+var TxServer   = require('./txserver');
 
 module.exports = {
   connect: function (dbConf, overConf) {
@@ -12,13 +12,13 @@ module.exports = {
   createPKSServer: function (dbConf, overConf) {
     return new PKSServer(dbConf, overConf);
   },
-  createHDCServer: function (dbConf, overConf) {
-    return new HDCServer(dbConf, overConf);
+  createWOTServer: function (dbConf, overConf) {
+    return new WOTServer(dbConf, overConf);
   },
   createPeerServer: function (dbConf, overConf) {
     return new PeerServer(dbConf, overConf);
   },
-  createRegistryServer: function (dbConf, overConf) {
-    return new RegistryServer(dbConf, overConf);
+  createTxServer: function (dbConf, overConf) {
+    return new TxServer(dbConf, overConf);
   }
 }
diff --git a/peerserver.js b/peerserver.js
index 250564e0b3b6218e5c119271f56e4fc41f3f7848..0b755b3cb56e9322bd5bc448cf6929c42531f7e5 100644
--- a/peerserver.js
+++ b/peerserver.js
@@ -8,7 +8,7 @@ var plogger   = require('./app/lib/logger')('peer');
 var flogger   = require('./app/lib/logger')('forward');
 var slogger   = require('./app/lib/logger')('status');
 var wlogger   = require('./app/lib/logger')('wallet');
-var HDCServer = require('./hdcserver');
+var WOT = require('./wotserver');
 var parsers   = require('./app/lib/streams/parsers/doc');
 
 function PeerServer (dbConf, overrideConf, interceptors, onInit) {
@@ -99,7 +99,7 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) {
     }
   ].concat(onInit || []);
 
-  HDCServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions);
+  WOT.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions);
 
   var that = this;
 
@@ -114,8 +114,6 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) {
         that.KeyService          = require('./app/service/KeyService').get(conn);
         that.PublicKeyService    = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
         that.ContractService     = require('./app/service/ContractService').get(conn, that.conf);
-        that.StrategyService     = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService);
-        that.VoteService         = require('./app/service/VoteService').get(conn, that.StrategyService);
         that.PeeringService      = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService);
         that.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService, that.PeeringService);
         that.WalletService       = require('./app/service/WalletService').get(conn);
@@ -356,6 +354,6 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) {
   }
 }
 
-util.inherits(PeerServer, HDCServer);
+util.inherits(PeerServer, WOT);
 
 module.exports = PeerServer;
diff --git a/pksserver.js b/pksserver.js
index 9e141cf693fe4fb90461304da5f0ee21de409389..fa86e930c52e7442e53e8f5b2bb24853460d9b07 100644
--- a/pksserver.js
+++ b/pksserver.js
@@ -3,7 +3,7 @@ var util    = require('util');
 var parsers = require('./app/lib/streams/parsers/doc');
 var Server  = require('./server');
 
-function HDCServer (dbConf, overrideConf, interceptors, onInit) {
+function PKSServer (dbConf, overrideConf, interceptors, onInit) {
 
   var logger  = require('./app/lib/logger')(dbConf.name);
 
@@ -46,6 +46,7 @@ function HDCServer (dbConf, overrideConf, interceptors, onInit) {
   this._initServices = function(conn, done) {
     this.KeyService         = require('./app/service/KeyService').get(conn);
     this.PublicKeyService   = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
+    done();
   };
 
   this._listenBMA = function (app) {
@@ -60,6 +61,6 @@ function HDCServer (dbConf, overrideConf, interceptors, onInit) {
   };
 }
 
-util.inherits(HDCServer, Server);
+util.inherits(PKSServer, Server);
 
-module.exports = HDCServer;
+module.exports = PKSServer;
diff --git a/readme.md b/readme.md
index b1ca714044d8759a5511caab14f6ddd37657fd7f..f8bb8ff2778a6737addef4d9ed0e2ed00a2ba36c 100644
--- a/readme.md
+++ b/readme.md
@@ -131,7 +131,7 @@ $ ucoind wizard
 
 ### Target only few wizard's steps
 
-Wizard is composed of 4 steps: `currency`, `openpgp`, `network`, `key`, `autovote`. By adding one of those words to `wizard` command, you will only do the attached steps:
+Wizard is composed of 4 steps: `currency`, `openpgp`, `network`, `key`. By adding one of those words to `wizard` command, you will only do the attached steps:
 
 ```bash
 $ ucoind wizard network
@@ -245,16 +245,6 @@ Options:
   --remotep <port>          Remote port others may use to contact this node
   --kmanagement <ALL|KEYS>  Define key management policy
   --kaccept <ALL|KEYS>      Define key acceptance policy
-  --amdaemon <ON|OFF>       ucoin is launched with a specific daemon helping to get other peers' votes
-  --amstart <timestamp>     First amendment generated date
-  --amfreq <timestamp>      Amendments frequency, in seconds
-  --udfreq <timestamp>      Universal Dividend frequency, in seconds
-  --ud0 <integer>           First Universal Dividend value (a.k.a 'UD0')
-  --udpercent <float>       Percent of monetary mass growth per UD
-  --consensus <float>       Percent of voters required to accept an amendment
-  --msvalidity <timestamp>  Duration of a valid membership, in seconds
-  --vtvalidity <timestamp>  Duration of a valid voter, in seconds
-
 
 ```
 
diff --git a/regserver.js b/regserver.js
deleted file mode 100644
index 3fe6d5ac3f6cd78812a73a93d5cdb1507f6722a3..0000000000000000000000000000000000000000
--- a/regserver.js
+++ /dev/null
@@ -1,236 +0,0 @@
-var async      = require('async');
-var util       = require('util');
-var logger     = require('./app/lib/logger')('regserver');
-var PeerServer = require('./peerserver');
-
-function RegistryServer (dbConf, overrideConf, interceptors) {
-
-  var selfInterceptors = [
-    {
-      // Membership
-      matches: function (obj) {
-        return obj.type && obj.type == "MEMBERSHIP" ? true : false;
-      },
-      treatment: function (server, obj, next) {
-        async.waterfall([
-          function (next){
-            that.SyncService.submit(obj, next);
-          },
-          function (membership, next){
-            that.emit('membership', membership);
-            next(null, membership);
-          },
-        ], next);
-      }
-    },{
-      // Voting
-      matches: function (obj) {
-        return obj.type && obj.type == "VOTING" ? true : false;
-      },
-      treatment: function (server, obj, next) {
-        async.waterfall([
-          function (next){
-            logger.debug('⬇ %s\'s voting', "0x" + obj.issuer.substr(32));
-            that.SyncService.submitVoting(obj, next);
-          },
-          function (voting, next){
-            logger.debug('✔ %s\'s voting', "0x" + obj.issuer.substr(32));
-            that.emit('voting', voting);
-            next(null, voting);
-          },
-        ], next);
-      }
-    },{
-      // Statement
-      matches: function (obj) {
-        return obj.algorithm ? true : false;
-      },
-      treatment: function (server, obj, next) {
-        async.waterfall([
-          function (next){
-            logger.debug('⬇ Statement based on AM#%s from %s', obj.amendmentNumber, obj.issuer);
-            that.SyncService.submitStatement(obj, next);
-          },
-          function (statement, next){
-            logger.debug('✔ Statement based on AM#%s from %s', obj.amendmentNumber, obj.issuer);
-            that.emit('statement', statement);
-            next(null, statement);
-          },
-        ], next);
-      }
-    }
-  ];
-
-  var initFunctions = [
-    function (done) {
-      that.initRegistry(that.conn, that.conf, done);
-    }
-  ];
-
-  PeerServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions);
-
-  var that = this;
-
-  this._read = function (size) {
-  };
-
-  this._initServices = function(conn, done) {
-    async.waterfall([
-      function (next){
-        that.checkConfig(next);
-      },
-      function (next){
-        that.KeyService          = require('./app/service/KeyService').get(conn);
-        that.ContractService     = require('./app/service/ContractService').get(conn, that.conf);
-        that.PublicKeyService    = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
-        that.PeeringService      = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService);
-        next();
-      },
-      function (next){
-        that.createSignFunction(that.conf, next);
-      },
-      function (next){
-        that.SyncService         = require('./app/service/SyncService').get(conn, that.conf, that.sign, that.ContractService, that.PeeringService, that.daemonJudgesTimeForVote);
-        that.StrategyService     = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService, that.SyncService);
-        that.VoteService         = require('./app/service/VoteService').get(conn, that.StrategyService);
-        that.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService, that.PeeringService);
-        that.WalletService       = require('./app/service/WalletService').get(conn);
-        async.parallel({
-          contract: function(callback){
-            that.ContractService.load(callback);
-          },
-          peering: function(callback){
-            that.PeeringService.load(callback);
-          },
-        }, function (err) {
-          next(err);
-        });
-      },
-    ], done);
-  };
-
-  this.checkConfig = function (done) {
-    async.waterfall([
-      function (next){
-        that.checkPeeringConf(that.conf, next);
-      },
-      function (next){
-        that.checkDaemonConf(that.conf, next);
-      }
-    ], done);
-  };
-
-  this.initRegistry = function (conn, conf, done) {
-    async.waterfall([
-      function (next){
-        // Init Daemon
-        that.daemon = require('./app/lib/daemon')(that);
-        that.daemon.init(conf, that.PeeringService.cert.fingerprint);
-        // Start autonomous contract daemon
-        that.daemon.start();
-        next();
-      },
-    ], done);
-  };
-
-  this.daemonJudgesTimeForVote = function (amNext) {
-    return that.daemon.judges.timeForVote(amNext);
-  };
-
-  this.checkDaemonConf = function (conf, done) {
-    var errors = [];
-    if (conf.sync.AMDaemon == "ON") {
-      if (!conf.sync.AMStart) {
-        errors.push('Autovoting enabled but starting date not given');
-      }
-      if (!conf.sync.AMFreq) {
-        errors.push('Autovoting enabled but amendment frequency not given');
-      }
-      if (!conf.sync.UDFreq) {
-        errors.push('Autovoting enabled but dividend frequency not given');
-      }
-      if (conf.sync.UDFreq % conf.sync.AMFreq != 0) {
-        errors.push('UD frequency must be a multiple of Amendment frequency');
-      }
-      if (!conf.sync.UD0) {
-        errors.push('Autovoting enabled but initial dividend not given');
-      }
-      if (!conf.sync.UDPercent) {
-        errors.push('Autovoting enabled but %dividend not given');
-      }
-      if (!conf.sync.Consensus) {
-        errors.push('Autovoting enabled but %required votes not given');
-      }
-    }
-    done(errors[0]);
-  };
-
-  this._listenBMA = function (app) {
-    this.listenPKS(app);
-    this.listenHDC(app);
-    this.listenNET(app);
-    this.listenREG(app);
-  };
-
-  this.listenREG = function (app) {
-    var reg = require('./app/controllers/registry')(that, that.conf);
-    app.get(    '/registry/parameters',                             reg.parameters);
-    app.post(   '/registry/community/members',                      reg.membershipPost);
-    app.get(    '/registry/community/members/:fpr/current',         reg.membershipCurrent);
-    app.get(    '/registry/community/members/:fpr/history',         reg.membershipHistory);
-    app.post(   '/registry/community/voters',                       reg.votingPost);
-    app.get(    '/registry/community/voters/:fpr/current',          reg.votingCurrent);
-    app.get(    '/registry/community/voters/:fpr/history',          reg.votingHistory);
-    app.post(   '/registry/amendment/statement',                    reg.statementPost);
-    app.get(    '/registry/amendment/:am_number/:algo/members/in',  reg.membersIn);
-    app.get(    '/registry/amendment/:am_number/:algo/members/out', reg.membersOut);
-    app.get(    '/registry/amendment/:am_number/:algo/voters/in',   reg.votersIn);
-    app.get(    '/registry/amendment/:am_number/:algo/voters/out',  reg.votersOut);
-    app.get(    '/registry/amendment/:am_number/:algo/self',        reg.askSelf);
-    app.get(    '/registry/amendment/:am_number/:algo/statement',   reg.askStatement);
-    app.get(    '/registry/amendment/:am_number/:algo/vote',        reg.askVote);
-  }
-
-  var SELF_ACTUALIZATION_FREQUENCY = 3600*24*10;
-
-  this.on('promoted', function (amendment) {
-    var nextTimestamp = amendment.generated + that.conf.sync.AMFreq;
-    async.waterfall([
-      function (next){
-        that.SyncService.getLastVoterOn(that.PeeringService.cert.fingerprint, next);
-      },
-      function (voterOn, next){
-        if (!voterOn || (voterOn + SELF_ACTUALIZATION_FREQUENCY - nextTimestamp <= 0)) {
-          actualizeVoting(amendment, next);
-        }
-        else next();
-      },
-    ], function (err, vt) {
-      if (err) logger.error(err);
-      var now = new Date().timestamp();
-      that.daemon.nextIn((nextTimestamp - now)*1000);
-    });
-  });
-
-  function actualizeVoting (amendmentBasis, done) {
-    async.waterfall([
-      function (next){
-        that.SyncService.createSelfVoting(amendmentBasis, next);
-      },
-      function (vt, pubkey, next){
-        var json = vt.json();
-        var obj = json.voting;
-        obj.type = obj.registry;
-        obj.signature = json.signature;
-        obj.pubkey = pubkey;
-        obj.date = new Date(obj.date*1000);
-        obj.sigDate = new Date();
-        that.singleWriteStream(next)._write(obj, null, next);
-      },
-    ], done);
-  }
-}
-
-util.inherits(RegistryServer, PeerServer);
-
-module.exports = RegistryServer;
diff --git a/server.js b/server.js
index 602563051b6242b8dbc23849b4a38d5c977f481b..c6bd1bf97f31dc687b3e0accf6cfd65a2c16cb6c 100644
--- a/server.js
+++ b/server.js
@@ -10,7 +10,7 @@ var http       = require('http');
 var log4js     = require('log4js');
 var connectPgp = require('connect-pgp');
 
-var models = ['Amendment', 'Coin', 'Configuration', 'Forward', 'Key', 'CKey', 'Merkle', 'Peer', 'PublicKey', 'Wallet', 'Transaction', 'Vote', 'TxMemory', 'Membership', 'Voting', 'Statement'];
+var models = ['Amendment', 'Coin', 'Configuration', 'Forward', 'Key', 'CKey', 'Merkle', 'Peer', 'PublicKey', 'Wallet', 'Transaction', 'TxMemory', 'Membership'];
 var INNER_WRITE = true;
 
 function Server (dbConf, overrideConf, interceptors, onInit) {
@@ -138,14 +138,9 @@ function Server (dbConf, overrideConf, interceptors, onInit) {
           var Configuration = conn.model('Configuration');
           that.conf = foundConf[0] || new Configuration();
           if (overrideConf) {
-            _(_(overrideConf).keys()).without('sync').forEach(function(k){
+            _(overrideConf).keys().forEach(function(k){
               that.conf[k] = overrideConf[k];
             });
-            if (overrideConf.sync) {
-              _(overrideConf.sync).keys().forEach(function(k){
-                that.conf.sync[k] = overrideConf.sync[k];
-              });
-            }
           }
           if (reset) {
             that.reset(next);
@@ -177,11 +172,8 @@ function Server (dbConf, overrideConf, interceptors, onInit) {
           'publickeys',
           'wallets',
           'transactions',
-          'votes',
           'txmemories',
-          'memberships',
-          'votings',
-          'statements'];
+          'memberships'];
         async.forEachSeries(deletableCollections, function(collection, next){
           if (that.conn.collections[collection]) {
             that.conn.collections[collection].drop(function (err) {
@@ -235,6 +227,8 @@ function Server (dbConf, overrideConf, interceptors, onInit) {
     // To override in child classes
   };
 
+  this._sign = null;
+
   function listenBMA (overConf, onLoaded) {
     if (arguments.length == 1) {
       onLoaded = overConf;
@@ -253,9 +247,11 @@ function Server (dbConf, overrideConf, interceptors, onInit) {
     async.waterfall([
       function (next){
 
-        // HTTP Signatures
-        app.use(connectPgp(that.sign));
-        logger.debug('Signed requests with PGP: enabled.');
+        if (that._sign) {
+          // HTTP Signatures
+          app.use(connectPgp(that.sign));
+          logger.debug('Signed requests with PGP: enabled.');
+        }
 
         // Routing
         app.use(app.router);
diff --git a/test/data/statements/cat.flow b/test/data/statements/cat.flow
deleted file mode 100644
index f3c18ed9ca73ce3edd515937f6d37045e93c8637..0000000000000000000000000000000000000000
--- a/test/data/statements/cat.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-Version: 1
-Currency: beta_brousouf
-Amendment: 54-7F64036BF4ED24027865F0BC17861E23D9CE4CA8
-Issuer: C73882B64B7E72237A2F460CE9CAB76D19A8651E
-Date: 1401798895
-Algorithm: AnyKey
-MembersJoining: 90-8518C1F053B6F5BB9D27ED37F4061AE5CC083511
-MembersLeaving: 2-5A0CEE18613AEEBBBE39B1CDBE627D879CD357EB
-VotersJoining: 8-B91D119FE7A22013190B89614BC4A409AC51D149
-VotersLeaving: 2-5A0CEE18613AEEBBBE39B1CDBE627D879CD357EB
diff --git a/test/data/statements/cat.flow.asc b/test/data/statements/cat.flow.asc
deleted file mode 100644
index 11f5fc155e50e3942529ffd745340cb9f6d7d1cc..0000000000000000000000000000000000000000
--- a/test/data/statements/cat.flow.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1
-
-iQEcBAABCAAGBQJTjtPgAAoJED0ZtAvOQO31yX4IAIBTOyS26o1IXQ1gT00OSnyC
-hvt5m/nDUV+NjhgursQAl9s/WflJ9in/9EEnycvk1GUZYP5SS8UcJM0ucZVRBOou
-VzsfAGkFPQnrWrB4d/r/l5zGfh77Ef+NUTG74GYoVxsR20WGBEoXL8J4CURgOnr7
-0Smi68pPWowsT8HCpBkCJBCAVkNuV5bf0egol3jdI7MzmDflgqBO4nSyJIWvSFV4
-5i9ZafZ941MAu8g3WPG5EGjvqdYS8LJZ7VTBRmSUL3YtaeBpmB4P0pQby1oDBTpi
-woUR7mW6kanY2i6Ijfa1A92jK1UkFPfzBg3ldJy1e+d5PtnaC206JVGcMtB5sT0=
-=2QXu
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc b/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc
deleted file mode 100644
index 4940aec7bf70ac31c35d158ea4537d45892c462e..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN PGP MESSAGE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-owGbwMvMwMH48tT2XMkVqXKMaxkfJnE6Oek6+hro+nsHvv5mHJZaVJyZn2elYMjl
-XFpUlJqXXGmlkJRakhifVJRfWpxfmsblV5qblFpkpWDAFZZfAlQelJ9fYqXgZuro
-7OZiZu7mbGlg4WJk4WwA5Dq6WFiYGZlYOjobmRmYGpoC5aCanPNL84C6jGHcjMS8
-9NRiKy5tI1czS0NLczdHJwMjSxcLMzNLVzcLU1cLIxNTc0dDUwtzZ0cDVxdLZy5t
-Y2MnJzegNWbmBuYWLuZGjm6GRhZOpk6ORpZmzs6mxgaGRmZuxuZGXNrO5sYWFkZO
-ZiZO5q7mRkbG5o5GbiZmBs6uls6OTuZmLoaWjhZmpoauXL6pIK+R5iNLmC64l2D8
-weGnTkYZFgZGDgY2ViZQBDNwcQrA4r+jk4PhQqro6wc9XyYaqbnYBIsr/t6/cy+7
-2Psy5t/Pdy/I23r50dKzUpcN1XPDZNl+POlI/+63o/34poVcUnkiHIyxMpzvVgoc
-f649Z/7r+5U/I1frKs95tJFN0KWqUXjJ+czHq6xeKMw24yyIFJaT2BI/LS+63X3a
-2fvv4tkfKfAsW6Hdtu794tc2J7ffa+u6W7aj7XdLcN/0da99rrWHftp4U+/hA45X
-a6+GZp2InbPX+VgFp1Xv8lubgmOVr3W8EdgesPtmdP6ip61xs1NiPs1aU+FzgDVz
-2e+oL22Oc9f/Zz7SerKyrHvZ736BljvrtOcwBWq4zWW0fy4QmHk14gPXR845t2xW
-vsnd7nKtunbjIgA=
-=hiy9
------END PGP MESSAGE-----
diff --git a/test/data/votes/BB-AM0/OK-snow.dissident.vote b/test/data/votes/BB-AM0/OK-snow.dissident.vote
deleted file mode 100644
index 41b1efcd4f8179388b03a2b0959fa5a7e412dc07..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM0/OK-snow.dissident.vote
+++ /dev/null
@@ -1,32 +0,0 @@
-Version: 1
-Currency: beta_brousouf
-Number: 0
-GeneratedOn: 1380397288
-UniversalDividend: 100
-NextRequiredVotes: 2
-MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90
-MembersCount: 3
-MembersChanges:
-+2E69197FAB029D8669EF85E82457A1587CA0ED9C
-+33BBFC0C67078D72AF128B5BA296CC530126F372
-+C73882B64B7E72237A2F460CE9CAB76D19A8651E
-VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90
-VotersCount: 3
-VotersChanges:
-+2E69197FAB029D8669EF85E82457A1587CA0ED9C
-+33BBFC0C67078D72AF128B5BA296CC530126F372
-+C73882B64B7E72237A2F460CE9CAB76D19A8651E
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQGcBAABCAAGBQJSTUVEAAoJEKKWzFMBJvNyLsQMAKB0LYPDFtUWZc4uqBfWYxZR
-OEhjQ9+NUUxosyUKcfOmeWk/A4jV5TeVeie8Wcz0uatpGGbOG2Ol+v0G/etr4wBD
-u6BbmzIN1dm999mzx34rUgsZ9xLr+44/YmGlmfXXTmdfj269PLh0+JIo2mxBExQb
-4zNjvC29iH8GGgq/HD2EJkA7D0jyVGfIOiig78BOB2qgHa9qAO3LmiL+LYPf46qB
-wkzLCd9NNInH8GU34i7VMBxwd5gblys0Tk7fmkhS9hiSOvKxgwLEMXpOdI7G1ULp
-4SzV+YRb2lIogZvW+o3rjzJ5VFCS6Y21YbvTtdk9hIvIVJDvPz8Dgv5Q9+JIaAY1
-8t2WCYdU+ipy5gZxw7ppXR2A7bOjixB++7niM4Ldd8G0b1DbCGgX6ukTqncUYIFv
-EJWhPVq8hy5TnHKIitWDpjTyOBSeuBpEBpS3gMYg/RPlZPtj8zbG5tX73FRq0j5/
-jKDn3Kib2/7nPgLx8AkAmd9jgZjcfN6i3fLAmVQDCQ==
-=ZPyq
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM0/cat.asc b/test/data/votes/BB-AM0/cat.asc
deleted file mode 100644
index 0f70492c09a6f162080cec0892faff3e5cf3ac66..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM0/cat.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSRzV7AAoJEOnKt20ZqGUe+zMIAIyWCvpd1BQ4mnJR/BfgQxLL
-2lusxOFViZRo4OcPnXJ67UahGWBeChXswmE8zFNxindlJZqzKbQAHSMcPgDm+4Ls
-cYMRtKnxp/SBggNFa90uUIoCW5V5ZxCLiCNUHJC+8VJu8MhEAnp4XhYnDkEjiHXL
-xwIQlo1S4GvtBcSeLVzU2Qxad59ukbnWwTvnKdGo/cmQudiD9TXrJtfKIKN6bBD9
-dWL+JjJ9p4/1tNE6egUvDFMeKyUxP6wTHnc/XfpUty4dTAZh4SghY7IYwKftMl9L
-kNlP+H1aLntNkCjv6Liy9RDjubxBys6Y0mK6julZqbeN5BtLjXDE6sAPjr1ybfQ=
-=C6z8
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM0/snow.asc b/test/data/votes/BB-AM0/snow.asc
deleted file mode 100644
index 72b23fb0202cc4bb9ea2bede88882d756984cbaa..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM0/snow.asc
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQGcBAABCAAGBQJSRzUzAAoJEKKWzFMBJvNyD1YL/05buY6d76J8ca29RCoj0dqN
-8L/AuSTZ2OsSJk4JnaYvbsfH5iOhOvNC33yRxRJKl9ZccyE6kJ1ZYnFaUJlw2yn1
-BHoVpwCPClTgrbUNyuCJqTYC7IH0bUxgKHVBO0TPZjtsSztCKIgrrA2dvTGoJvH6
-65bghgvHYnT9mrU5jJGcc2dnSWt7VwuZqvftrxXq+3pIvY51jW/Ub5Qv0W/mZwMu
-cQQ6EZCGr2GQ23RrOlztTuVenBhtPvyk+/JCh6N9QpthCEE8wjR5pTojH75tciue
-TIvMAxOhO0yUTcrfwQ7pS/EPq9g+xMIWTyYrFFtB6WQn9qoY67EY7icGA+ZimOXn
-2fAhtWZIY8wR5ScL7y6WkTTqgX93FnymGvj5f3+z0HkIF7eAjdg2hxqkgZmAa6+i
-5NdLxdlCoBSyJ1AT0haYzKueBqbNmVKO0oqhX8w/50wDofgyvyZCuOnALwXDY3QR
-/cqJupkVN3j1tMkKwoqFqRh+gAWE+C7ZrIaYhLQv9g==
-=0pcd
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM0/tobi.asc b/test/data/votes/BB-AM0/tobi.asc
deleted file mode 100644
index 2dc11021e97571adba80866a1c8fb3a678d4f611..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM0/tobi.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSRzVqAAoJECRXoVh8oO2cBlsH+QHmQX5CyX4E7if8eOTfGaWu
-4uibg7pabSdAcwf3GBwvZUwYY9+9T99wQ1/hgYvbk0w+4NuhIwPya5nblhUVoFuQ
-pRPKJKYgt+MPYU1Z/BZXMaeEuRyDBXnfPTxVtAE+S5+rM2/8cWHf5mX0pyk8QSWl
-qnBzfXQMdGPBwOmIaYxTbG+l+ny3sM8LG3KWuphLG7fnZgToU7Tdkx1KZSzOCgCD
-zR3veD4AozGJ26AI8vkyeU9pNddQgrKmOBAS06YA65zvOn0LKPsuaTiH8SobnXLl
-r0RL56qFsf5ELiT/rU4MvSEkhuKZYdHr5mZWA3Ra++vd3LWeZcCx/Jy4mxVILrQ=
-=PeRy
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM1/cat.asc b/test/data/votes/BB-AM1/cat.asc
deleted file mode 100644
index e8ab2ffc3f8f92a3daa4506ecebe0ed96606b569..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM1/cat.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSRz5vAAoJEOnKt20ZqGUecz4IANHtwoCDn2LVPaGStTHxWN0N
-Z2fRm6xehhionVJn5zFaA5qUHeP/us4R90qVuH4gTTUmkzNjBDKz+wszkRnDpMr5
-gzwPV3Uq3eyL/CW/+0bDxg8OHhD7Kd5Xui3t+EKBTn1mmxCpA/rai3y1IqTYLdJ5
-FaubH72Fv+FWGuVy2+NKOAfSd0xvyA0JlEfw2kvyOTW0ZhCiCrhTShFVNSFyXd0b
-PmFFG85UAVKK38ZeMP33zKyCjPIqCDrN82SQe3izw1xbSgOdaK4R6KyxA9H7nTcr
-sOqyZpwm/hX6rSO3Ep1pWJfdSge6Fa6rCjt1lhLUTz5lfEP4vFkdV/cXnuTAT24=
-=1h4A
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM1/snow.asc b/test/data/votes/BB-AM1/snow.asc
deleted file mode 100644
index de96162a35a1ea1244bb3b14e8a86e8f5d0efaad..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM1/snow.asc
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQGcBAABCAAGBQJSRz5iAAoJEKKWzFMBJvNygREL/A+quf/xQiDZJ5NbTsbvq/Y0
-QKhBh4iPOGiDaG3n4tDVja7w91hq+C1/9cBV8TAuLjSvnph+ov13WNpjNraVIX8V
-MG4j4s22nsRfIZqcfBSdAluCJCLfATPONpurhiD8J7fCHhmRCuzeNNNWkkZJQqnR
-fJROWoDZoatHHKQloRt/2oS3P4gebvDBmIXwSWi7kH1Yc0f2AzK2EDJu79A5Sm/b
-BABH2KmVBzlNeLVNjb2LDN70tliumSRtr6xoliIK91o8ZzuM3V0Gu4BRhh/SI40b
-ZBy/3CJ/bp7CaL8g3vDpbPoiwNyQJqU//HXIvvYfoQ9yqwDeFs4y6AkuN1jp9EiU
-Xrnrfu5/O2owenQo+MwVOIa5d7hd1ULY21lDASJuIJU6D5lRw9/Zv7EZhLsoz2q7
-T0b9hDPBjmBkDDORZN0Umk33qB3PzORGc1Hsud99uk7aUG9jcoGOCFfzkjG472m5
-LLCw9x8CuQt5YWxVGsbsHWDnhntPxfECyBCyfs8oxw==
-=TE8y
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM1/tobi.asc b/test/data/votes/BB-AM1/tobi.asc
deleted file mode 100644
index cf081b2596b037e7ae5fdf4c81508efdb19f4c2a..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM1/tobi.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSRz6EAAoJECRXoVh8oO2ccgIIAIrr+08NCgpT44tK1H3BKQc+
-8c1JT/yYFGEYIh51ISW4JoecG/JDgsCVWJ7DzqlMRNDUVxz09g2rkuiDdU+2yxaT
-MN9zgpHWlu5/Z7P25YMlM3hzrVG8i5X+5psfrCTUleQty8eTK3PsXffYRk7wk1lN
-oC3w2ECr8tEzIhJKHOi0JtnC5r9Ck31mi1IvUQtgvcx5q92YSIZ4j/WiXRqW6XDV
-Cd1ug5euRQAR+FpMV7dWI8dKxQhX9XOPI2cXNV/EvbqO36OJ/WF0OMG0XQD5fZlZ
-UchRdA5ZKQ4B5LvVOYD18qtyMoOG6SCVbDwW2K5Xhm9Metkha35wHQyDqICMw5E=
-=iB6l
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM1/white.asc b/test/data/votes/BB-AM1/white.asc
deleted file mode 100644
index 24f97579a29287d0fb99efe3d851adc6e571f8ba..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM1/white.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSTUrZAAoJEHi0lPmQJcd+hgEH+wSoPeUVlFaWQZBxjybL84hY
-4orrF9y7l8MEl2XvkOqai0VC9MMJe2UT/nk5OgSpCjy2dOKyuHEHybqRR/RUHxmV
-/ammSLYM5LoytaK4wveR77O+uXi6k1lc8s3MMRJnKBHOPdJ74MxYCqo2xR1MMCTO
-tGyme92Dl7x7HFnDX6oLW13zvamsyxeKmqgQJFrPjDI8K3ZeKoFPo42Ct6rnN6gG
-Caa4TsJKbCrsStzLFOPfIKA7za4/4OM1t1Dae5TPaPDwq5ySiLcnAdPMJllw8hMB
-SjzRQ2Sb3ue0kgD6yDqIopILJJ32dkbYsT7Mk+Mr4RxR49yEATDSucqyq+Nek2M=
-=ThrK
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM2/cat.asc b/test/data/votes/BB-AM2/cat.asc
deleted file mode 100644
index 8ab1a6323adc7bdb043d02889e27fb3b4f290366..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM2/cat.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSTaS3AAoJEOnKt20ZqGUeCy8IALNR9Cx+gasu80zt2muJNsR+
-7E4+5SxYbsyBcM9/jmxOLf6ajs7qnO6Mi2hC3bd3a+7OhVYnB3jcruTmrL+qpoKZ
-Pjn5o2w4xjJtKGJh49CK2ZxcEmLmD59AlEl0lS/TPY+JG4fi4tf1tAXZkhUo5+3b
-jKvOVUZfw0uXdBAWGelpXvh4uYi7+X8aR/ANAixAozEc9/ps7R80e9oJapyXmQN1
-GdQZwGExL17uJpS1eIXU7CMPq0139ftdD79BzHqP6Aj5tJYuduOhoNl7lHyHb52/
-UDGSKZUGsb2fn1lw8iEKeELKKsAORiIsG5mjXhSsBqpHt90v62/mnVwMJY1qpcU=
-=3F2V
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM2/snow.asc b/test/data/votes/BB-AM2/snow.asc
deleted file mode 100644
index 150bde2568eebf7ba112835adb39413e0062e3b7..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM2/snow.asc
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQGcBAABCAAGBQJSTaTBAAoJEKKWzFMBJvNyX0oL/11DiOqBNfx4oexHhACpRY8+
-soMCj4/42WpdgP5jNJLq5FiU2U9dxysg7zo/QNjYeOuTgpQKtsxUwPwfSdl/iBE6
-pkEr0/xNYP3vbwohjzbz5pEYXBN3yS6J6igwk53V+pGaTS4ZkGzfkh9RhVlH5c/5
-8PG/ALoLaSqlQzvX8ZiU/8+djCOw//MnFYn+PgMgZqjV0fsqYDVEDQYMRQgH2hSQ
-VCNphCcaPbBU/ltT4sPZidkFJaBgMDkr7jRDckFSYSm0LCN9isLLlnpvwO0JxIMh
-wEMpaG6f9DDuMQZAxWpyUnrn6NJ+h7HehJ8bS/+Jp+xKVPr8zj1+/0gBteRatl0k
-WgO85KsZ06KmmD7L3K1b9umJyzr9KgPiXCqMqErt3MICsgSC6rwb3AO0NyEnHJd5
-90i4939cwTQeFQ/PSLvJ7bkg7Pu/MWickkwUaE/jurGGZyhulTB/4DWqmknrYF4L
-fqMOCGQQmc1TPYq2xnPxBrwnLZe7gSqdvWceqyG59Q==
-=yd3U
------END PGP SIGNATURE-----
diff --git a/test/data/votes/BB-AM2/tobi.asc b/test/data/votes/BB-AM2/tobi.asc
deleted file mode 100644
index 875b121e0b1053e50bad819bc80b0c7e7fbbb756..0000000000000000000000000000000000000000
--- a/test/data/votes/BB-AM2/tobi.asc
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.12 (GNU/Linux)
-
-iQEcBAABCAAGBQJSTaS8AAoJECRXoVh8oO2c+QQH/0l2yOO4hoS6+YEYt59xpIu6
-KgQhbvTAXcjSCX/1epjvWz/+f7C61dd4zioIYhLcNRpvG0YD46aSAnu3apz2fU16
-Z0YYHKH3T1FAWuy8GFbiibBdm9Bb+yJO/yUuTNqTQRk5QtL3JgLdB/uOlRDaAJxY
-FiKvDNCDZSQnxO/sK64/o/s6N29QitBM4B165gOVeUslLsVxkP6jaqASuBGMdxad
-qPEM1bo3dkcQrtmVZUa4yUtO2Au6P/rTUdpWzW5Awtihfo3CRKFMTZ/XiqqSexMn
-ZNEcMDW2IIJkHAd31+h8ciGx9yVbsyrq+RhQdr2WYmhblOGXGAkBq2PqWNtFDyU=
-=LM7G
------END PGP SIGNATURE-----
diff --git a/test/exclude/members-voters.js b/test/exclude/members-voters.js
deleted file mode 100644
index c5d3c80568b189033c3b2841625f00cf728930cc..0000000000000000000000000000000000000000
--- a/test/exclude/members-voters.js
+++ /dev/null
@@ -1,639 +0,0 @@
-var should    = require('should');
-var assert    = require('assert');
-var async     = require('async');
-var request   = require('supertest');
-var fs        = require('fs');
-var sha1      = require('sha1');
-var _         = require('underscore');
-var jpgp      = require('../../app/lib/jpgp');
-var server    = require('../../app/lib/server');
-var mongoose  = require('mongoose');
-var signatory = require('./../tool/signatory');
-var test      = require('./../tool/test');
-var ucoin     = require('./../..');
-var parsers   = require('../../app/lib/streams/parsers/doc');
-var logger    = require('../../app/lib/logger')('test');
-
-var server;
-var currency = "testa";
-var now   = new Date().timestamp();
-var conf = {
-  currency: currency,
-  pgpkey: fs.readFileSync(__dirname + "/../data/lolcat.priv"),
-  pgppasswd: 'lolcat',
-  ipv4: '127.0.0.1',
-  port: 9107,
-  remoteipv4: '127.0.0.1',
-  remoteport: 9107,
-  kmanagement: 'ALL',
-  sync: {
-    AMDaemon: "OFF",
-    AMStart: now,
-    AMFreq: 1, // Every second
-    UDFreq: 2, // Dividend every 2 seconds
-    UD0: 145,
-    UDPercent: 0.5, // So it can be tested under 4 UD - this ultra high value of UD growth
-    Consensus: 2/3
-  },
-  createNext: true,
-  isValidPubkey: function (pubkey, am) {
-    // Here we say that a key is no more valid if it is Tobi's & AM9
-    return !(pubkey.fingerprint == '2E69197FAB029D8669EF85E82457A1587CA0ED9C' && am.number == 9);
-  }
-};
-var nb = 100;
-var tester    = is = on = new test.tester(currency);
-
-var PublicKey   = null;
-var Membership  = null;
-var Voting      = null;
-var Vote        = null;
-var Amendment   = null;
-var Transaction = null;
-
-var cat   = signatory(fs.readFileSync(__dirname + "/../data/lolcat.priv", 'utf8'), "lolcat", "Cat");
-var tobi  = signatory(fs.readFileSync(__dirname + "/../data/uchiha.priv", 'utf8'), "tobi", "Tobi");
-var snow  = signatory(fs.readFileSync(__dirname + "/../data/snow.priv", 'utf8'), "snow", "Snow");
-// var white = signatory(fs.readFileSync(__dirname + "/../data/white.priv", 'utf8'), "white");
-
-var pubkeySnow     = fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8');
-var pubkeyCat      = fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8');
-// var pubkeyCat2     = fs.readFileSync(__dirname + '/../data/lolcat.pub2', 'utf8');
-var pubkeyTobi     = fs.readFileSync(__dirname + '/../data/uchiha.pub', 'utf8');
-// var pubkeyWhite    = fs.readFileSync(__dirname + '/../data/white.pub', 'utf8');
-
-var amendments = {
-  AM0: {
-  currency: 'testa',
-    generated: conf.sync.AMStart,
-    number: 0,
-    dividend: null,
-    nextVotes: 2,
-    membersCount: 2,
-    membersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417',
-    votersCount: 2,
-    votersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417',
-    previousHash: null
-  },
-
-  AM0_voters_members: {
-  currency: 'testa',
-    nextVotes: 2,
-    membersCount: 2,
-    membersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417',
-    votersCount: 2,
-    votersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417',
-  },
-
-  AM2: {
-    generated: conf.sync.AMStart + 2,
-    number: 2,
-    dividend: 145,
-    nextVotes: 2,
-    membersCount: 3,
-    membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    membersChanges: [
-      "+33BBFC0C67078D72AF128B5BA296CC530126F372"
-    ],
-    votersCount: 3,
-    votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    votersChanges: [
-      "+33BBFC0C67078D72AF128B5BA296CC530126F372"
-    ]
-  },
-
-  AM3: {
-    generated: conf.sync.AMStart + 3,
-    number: 3,
-    nextVotes: 2,
-    membersCount: 3,
-    membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    membersChanges: [
-    ],
-    votersCount: 3,
-    votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    votersChanges: [
-    ]
-  },
-
-  AM4: {
-    generated: conf.sync.AMStart + 4,
-    number: 4,
-    dividend: 145,
-    nextVotes: 2,
-    membersCount: 3,
-    membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    membersChanges: [
-    ],
-    votersCount: 2,
-    votersRoot: '5DB500A285BD380A68890D09232475A8CA003DC8',
-    votersChanges: [
-      "-2E69197FAB029D8669EF85E82457A1587CA0ED9C"
-    ]
-  }
-};
-
-function pksAdd (raw, sig) {
-  return function (done) {
-    var PubKeyService = server.PublicKeyService;
-    async.waterfall([
-      async.apply(parsers.parsePubkey().asyncWrite, raw),
-      async.apply(PubKeyService.submitPubkey)
-    ], function (err, pubkey) {
-      done(err, { 
-        statusCode: 200,
-        text: JSON.stringify(pubkey.json())
-      });
-    });
-  };
-}
-
-function join (signatory, timestamp) {
-  return memberDo("IN", signatory, timestamp);
-}
-
-function leave (signatory, timestamp) {
-  return memberDo("OUT", signatory, timestamp);
-}
-
-function memberDo (action, signatory, timestamp) {
-  var d = new Date();
-  d.setTime((timestamp || now)*1000);
-  return function (done) {
-    var SyncService = server.SyncService;
-    var ms = new Membership({
-      version: 1,
-      currency: currency,
-      issuer: signatory.fingerprint(),
-      membership: action,
-      date: d,
-      sigDate: d,
-      signature: d.toLocaleString()
-    });
-    ms.hash = sha1(ms.getRawSigned()).toUpperCase();
-    async.series([
-      async.apply(SyncService.submit, ms)
-    ], function (err, res) {
-      if (!err) {
-        done(err, { 
-          statusCode: 200,
-          text: JSON.stringify(res[0].json())
-        });
-      } else {
-        logger.warn(err);
-        done(err, { 
-          statusCode: 400
-        });
-      }
-    });
-  };
-}
-
-function voter (signatory, timestamp) {
-  return voterDo(signatory, timestamp);
-}
-
-function voterDo (signatory, timestamp) {
-  var d = new Date();
-  d.setTime(timestamp*1000);
-  return function (done) {
-    var SyncService = server.SyncService;
-    var voting = new Voting({
-      version: 1,
-      currency: currency,
-      type: 'VOTING',
-      issuer: signatory.fingerprint(),
-      date: d,
-      sigDate: d,
-      signature: "" + d.toLocaleString()
-    });
-    voting.hash = sha1(voting.getRawSigned()).toUpperCase();
-    async.series([
-      async.apply(SyncService.submitVoting, voting)
-    ], function (err, res) {
-      if (!err) {
-        done(err, { 
-          statusCode: 200,
-          text: JSON.stringify(res[0].json())
-        });
-      } else {
-        logger.warn(err);
-        done(err, { 
-          statusCode: 400
-        });
-      }
-    });
-  };
-}
-
-function voteCurrent (signatory) {
-  return function (done) {
-    var ContractService = server.ContractService;
-    var am = ContractService.current();
-    voteAm(signatory, am, done);
-  };
-}
-
-function voteProposed (signatory, delay) {
-  return function (done) {
-    var ContractService = server.ContractService;
-    var am = ContractService.proposed();
-    voteAm(signatory, am, done, delay);
-  };
-}
-
-function voteAm (signatory, am, done, delay) {
-  var generatedPlusOne = am.generated + 1 + (delay || 0);
-  var sigDate = new Date();
-  sigDate.setTime(generatedPlusOne*1000);
-  var vote = {
-    basis: am.number,
-    signature: signatory.fingerprint() + am.number + now,
-    amendmentHash: sha1(am.getRaw()).toUpperCase(),
-    propagated: false,
-    selfGenerated: false,
-    sigDate: sigDate,
-    pubkey: { fingerprint: signatory.fingerprint() }
-  };
-  vote.amendment = am;
-  vote.hash = sha1(new Vote(vote).getRawSigned()).toUpperCase();
-  var VoteService = server.VoteService;
-  VoteService.submit(vote, function (err) {
-    if (!err) {
-      done(err, { 
-        statusCode: 200,
-        text: JSON.stringify(new Vote(vote).json())
-      });
-    } else {
-      logger.warn(err);
-      done(err, { 
-        statusCode: 400
-      });
-    }
-  });
-}
-
-var someTests = {
-
-  voteProposed: function (signatory, expectedAM) {
-    var expected = expectedAM || {};
-    return tester.verify(
-      signatory.name() + " vote for proposed",
-      voteProposed(signatory),
-      is.expectedSignedAmendment(expected)
-    );
-  },
-
-  voteCurrent: function (signatory, expectedAM) {
-    var expected = expectedAM || {};
-    return tester.verify(
-      signatory.name() + " vote for current",
-      voteCurrent(signatory),
-      is.expectedSignedAmendment(expected)
-    );
-  },
-
-  sendVoting: function (signatory, time, errCode) {
-    return tester.verify(
-      signatory.name() + " voting",
-      voter(signatory, time),
-      errCode ?
-        is.expectedHTTPCode(errCode) :
-        is.expectedVoting(signatory.fingerprint())
-    );
-  },
-
-  sendOptIN: function (signatory, time, errCode) {
-    var label = signatory.name() + " OPT-IN";
-    if (time) {
-      var delta = (time - now);
-      label += ' on ' + (delta >= 0 ? '+' + delta : delta);
-    }
-     if (errCode) {
-      label += ' to be HTTP ' + errCode;
-    } else {
-      label += ' to be HTTP 200';
-    }
-    return tester.verify(
-      label,
-      join(signatory, time),
-      errCode ?
-        is.expectedHTTPCode(errCode) :
-        is.expectedMembership(signatory.fingerprint())
-    );
-  },
-
-  sendOptOUT: function (signatory, time, errCode) {
-    return tester.verify(
-      signatory.name() + " OPT-OUT",
-      leave(signatory, time),
-      errCode ?
-        is.expectedHTTPCode(errCode) :
-        is.expectedMembership(signatory.fingerprint())
-    );
-  }
-};
-
-var testCases = [
-
-  /**************************
-  * Public keys tests
-  **/
-
-  tester.verify(
-    "Tobi's PUBKEY",
-    pksAdd(pubkeyTobi),
-    is.expectedPubkey('2E69197FAB029D8669EF85E82457A1587CA0ED9C')
-  ),
-
-  testMerkle("/pks/all", '48578F03A46B358C10468E2312A41C6BCAB19417'),
-
-  /**************************
-  * Membership tests
-  **/
-
-  testProposedAmendment('First proposed amendment, autogenerated on ucoin start', {
-    currency: 'testa',
-    number: 0,
-    membersCount: 0,
-    votersCount: 0,
-    previousHash: null
-  }),
-
-  someTests.sendOptIN(tobi),
-
-  testProposedAmendment('proposed amendment with tobi joining', {
-    currency: 'testa',
-    number: 0,
-    membersCount: 1,
-    membersRoot: '2E69197FAB029D8669EF85E82457A1587CA0ED9C',
-    votersCount: 0,
-    previousHash: null
-  }),
-
-  // OPT-IN must be exactly during AM0's interval
-  someTests.sendOptIN(cat, now - 1, 400),
-  someTests.sendOptIN(cat, now - 3, 400),
-  someTests.sendOptIN(cat, now - 184984, 400),
-  someTests.sendOptIN(cat, now + 1, 400),
-  someTests.sendOptIN(cat, now + 2, 400),
-  someTests.sendOptIN(cat, now + 54, 400),
-  someTests.sendOptIN(cat, now),
-
-  someTests.sendVoting(tobi, now - 1, 400),
-  someTests.sendVoting(tobi, now - 2, 400),
-  someTests.sendVoting(tobi, now - 484, 400),
-  someTests.sendVoting(tobi, now + 1, 400),
-  someTests.sendVoting(tobi, now + 9, 400),
-  someTests.sendVoting(tobi, now + 9879, 400),
-  someTests.sendVoting(cat, now + 1, 400),
-
-  someTests.sendVoting(tobi, now + 0),
-  someTests.sendVoting(cat, now + 0),
-
-  testProposedAmendment('proposed amendment with tobi+cat as members & voters', amendments.AM0),
-
-  // VOTE AM0
-  someTests.voteProposed(cat, amendments.AM0), // Promoted
-  someTests.voteCurrent(tobi, amendments.AM0),
-  testPromotedAmendment(amendments.AM0),
-  testPromotedAmendment(amendments.AM0, 0),
-
-  //-------- VOTING : AM1 ------
-  tester.verify(
-    "Voting AM1 should require 2 votes",
-    voteProposed(tobi),
-    is.expectedSignedAmendment(amendments.AM0_voters_members)
-  ),
-
-  tester.verify(
-    "Voting AM1 should promote AM1 identical to genesis AM",
-    voteProposed(cat),
-    is.expectedSignedAmendment(amendments.AM0_voters_members)
-  ),
-  
-  //----------------------------
-
-  /****** AM2
-  *
-  * Snow publish its pubkey, ask for joining & voting
-  */
-
-  tester.verify(
-    "Snow's PUBKEY",
-    pksAdd(pubkeySnow),
-    is.expectedPubkey('33BBFC0C67078D72AF128B5BA296CC530126F372')
-  ),
-
-  testMerkle("/pks/all", 'F5ACFD67FC908D28C0CFDAD886249AC260515C90'),
-
-  someTests.sendOptIN(snow, now - 1, 400),
-  someTests.sendOptIN(snow, now + 0, 400),
-  someTests.sendOptIN(snow, now + 2, 400), // Indeed, AM2 is not current, but NEXT!
-  someTests.sendOptIN(snow, now + 1),
-  someTests.sendVoting(snow, now - 1, 400),
-  someTests.sendVoting(snow, now + 0, 400),
-  someTests.sendVoting(snow, now + 2, 400),
-  someTests.sendVoting(snow, now + 1),
-
-  // 1/2
-  someTests.voteProposed(cat, amendments.AM2),
-  testPromotedAmendment(amendments.AM0_voters_members, 1),
-  testPromotedAmendment(amendments.AM0_voters_members),
-
-  tester.verify(
-    "Snow shouldn't be able to vote N-1 (current)",
-    voteCurrent(snow),
-    is.expectedHTTPCode(400)
-  ),
-
-  testPromotedAmendment(amendments.AM0_voters_members, 1),
-  testPromotedAmendment(amendments.AM0_voters_members),
-
-  // 2/2
-  someTests.voteProposed(tobi, amendments.AM2),
-
-  testPromotedAmendment(amendments.AM2, 2),
-  testPromotedAmendment(amendments.AM2),
-
-  tester.verify(
-    "Snow shouldn't be able to vote N (new current)",
-    voteCurrent(snow),
-    is.expectedHTTPCode(400)
-  ),
-
-  /******* We have AM2:
-
-    nextVotes: 2,
-    membersCount: 3,
-    membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    membersChanges: [
-      "+33BBFC0C67078D72AF128B5BA296CC530126F372"
-    ],
-    votersCount: 3,
-    votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90',
-    votersChanges: [
-      "+33BBFC0C67078D72AF128B5BA296CC530126F372"
-    ]
-
-    Let's not make tobi vote, but snow + cat instead.
-  */
-
-  tester.verify(
-    "Voting AM3 by cat 1v/2v",
-    voteProposed(cat),
-    is.expectedSignedAmendment(amendments.AM3)
-  ),
-
-  testPromotedAmendment(amendments.AM2, 2),
-  testPromotedAmendment(amendments.AM2),
-
-  tester.verify(
-    "Voting AM3 by snow 2v/2v",
-    voteProposed(snow),
-    is.expectedSignedAmendment(amendments.AM3)
-  ),
-
-  testPromotedAmendment(amendments.AM3, 3),
-  testPromotedAmendment(amendments.AM3),
-
-  // So Cat is not kicked from voters!
-  someTests.sendVoting(cat, now + 3),
-
-  testProposedAmendment('AM4 should see tobi no more voter', amendments.AM4),
-
-  tester.verify(
-    "Tobi voting while having not voted current should not be accepted: already a voter!",
-    voter(tobi, now + 4),
-    is.expectedHTTPCode(400)
-  ),
-
-  // Voting AM4 (ratify tobi's leaving as a voter)
-  // Snow wants to stay as voter
-  someTests.sendVoting(snow, now + 3),
-  someTests.voteProposed(cat),
-  someTests.voteProposed(snow),
-  testPromotedAmendment(amendments.AM4, 4),
-  testPromotedAmendment(amendments.AM4),
-  testProposedAmendment('AM5: no changes', { membersChanges: [], votersChanges: [] }),
-
-  // Tobi voting again
-  someTests.sendVoting(tobi, now + 4),
-  testProposedAmendment('AM5: tobi\'s coming back', {
-    membersChanges: [],
-    votersChanges: ['+2E69197FAB029D8669EF85E82457A1587CA0ED9C'],
-    votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }),
-  someTests.voteProposed(cat),
-  someTests.voteProposed(snow),
-  // Now on AM5
-  testProposedAmendment('AM6: no changes, but tobi as voter', {
-    membersChanges: [],
-    votersChanges: [],
-    votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }),
-
-  someTests.voteProposed(cat),
-  someTests.voteProposed(snow),
-  // Now on AM6
-  // Cat & Snow actualized as voter at AM3 (for AM4), so, with VTExpires = 3, they are kicked at AM 7
-  // Tobi       actualized as voter at AM4 (for AM5), so, with VTExpires = 3, he will be kicked at AM 8
-  testProposedAmendment('AM7: Cat & Snow are leaving as voters', {
-    number: 7,
-    votersChanges: ['-33BBFC0C67078D72AF128B5BA296CC530126F372', '-C73882B64B7E72237A2F460CE9CAB76D19A8651E'],
-    votersRoot: '2E69197FAB029D8669EF85E82457A1587CA0ED9C' }),
-  someTests.sendVoting(cat, now + 5, 400),
-  someTests.sendVoting(snow, now + 5, 400),
-  someTests.sendVoting(cat, now + 6),
-  someTests.sendVoting(snow, now + 6),
-  someTests.voteCurrent(tobi),
-  testProposedAmendment('AM7: everyone is still here', { votersChanges: [], votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }),
-
-
-  someTests.voteProposed(cat),
-  someTests.voteProposed(snow),
-  someTests.voteCurrent(tobi),
-  someTests.sendOptOUT(cat, now + 7),
-  testProposedAmendment('AM8: Cat is leaving?', { membersChanges: ['-C73882B64B7E72237A2F460CE9CAB76D19A8651E'], membersRoot: 'DC7A9229DFDABFB9769789B7BFAE08048BCB856F' }),
-  someTests.sendOptOUT(cat, now + 7, 400),
-  someTests.sendOptOUT(cat, now + 7, 400),
-  someTests.sendVoting(tobi, now + 7),
-  someTests.sendVoting(tobi, now + 7, 400),
-  someTests.sendVoting(tobi, now + 7, 400),
-
-  someTests.voteProposed(cat),
-  someTests.voteProposed(snow),
-  // We are now at AM9: memberships received during AM0 MUST be thrown out
-  testProposedAmendment('AM9: Tobi is kicked out as its key is no more valid', {
-    membersChanges: [
-      '-2E69197FAB029D8669EF85E82457A1587CA0ED9C'],
-    membersRoot: '33BBFC0C67078D72AF128B5BA296CC530126F372',
-    votersChanges: [
-      '-2E69197FAB029D8669EF85E82457A1587CA0ED9C'],
-    votersRoot: '33BBFC0C67078D72AF128B5BA296CC530126F372'})
-];
-
-testCases.splice(nb, testCases.length - nb);
-
-function testMerkle (url, root) {
-  return tester.verify(
-    "merkle " + url,
-    on.doGet(url),
-    is.expectedMerkle(root)
-  );
-}
-
-function testPromotedAmendment (properties, number) {
-  return tester.verify(
-    number >= 0 ? "proposed amendment #" + number : "current amendment",
-    on.doGet("/hdc/amendments/promoted" + (isNaN(number) ? "" : "/" + number)),
-    is.expectedAmendment(properties)
-  );
-}
-
-function testProposedAmendment (label, properties) {
-  return tester.verify(
-    label,
-    on.doGet("/registry/amendment"),
-    is.expectedAmendment(properties)
-  );
-}
-
-before(function (done) {
-  logger.debug("Launching server...");
-  this.timeout(1000*60); // In seconds
-  server = ucoin.createRegistryServer({ name: currency, listenBMA: true, resetData: true }, conf);
-  server.on('BMALoaded', function (err, appReady) {
-    async.waterfall([
-      function (next){
-        PublicKey   = server.conn.model('PublicKey');
-        Membership  = server.conn.model('Membership');
-        Voting      = server.conn.model('Voting');
-        Vote        = server.conn.model('Vote');
-        Amendment   = server.conn.model('Amendment');
-        Transaction = server.conn.model('Transaction');
-        tester.app(appReady);
-        // Execute all tasks
-        async.forEachSeries(testCases, function(testCase, callback){
-          logger.debug('----------------------------------');
-          logger.debug('Test: %s', testCase.label);
-          logger.debug('----------------------------------');
-          testCase.task(callback);
-        }, next);
-      },
-      function (next){
-        server.disconnect();
-        next();
-      },
-    ], function (err) {
-      logger.debug("API fed.");
-      done(err);
-    });
-  });
-});
-
-describe('Testing: ', function(){
-  testCases.forEach(function(testCase){
-    it(testCase.label, function () {
-      testCase.test();
-    });
-  });
-});
diff --git a/test/fast/amendment-0.js b/test/fast/amendment-0.js
deleted file mode 100644
index 4a9482e51e846d861fb247dc66b768cdb61a4dad..0000000000000000000000000000000000000000
--- a/test/fast/amendment-0.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var should   = require('should');
-var assert   = require('assert');
-var mongoose = require('mongoose');
-var sha1     = require('sha1');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var fs       = require('fs');
-
-var AM0 = "" +
- "Version: 1\r\n" +
- "Currency: beta_brousouf\r\n" +
- "Number: 0\r\n" +
- "GeneratedOn: 1380397288\r\n" +
- "NextRequiredVotes: 2\r\n" +
- "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
- "MembersCount: 3\r\n" +
- "MembersChanges:\r\n" +
- "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" +
- "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" +
- "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" +
- "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
- "VotersCount: 3\r\n" +
- "VotersChanges:\r\n" +
- "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" +
- "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" +
- "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n";
- 
-var Amendment = mongoose.model('Amendment', require('../../app/models/amendment'));
-var amTest;
-
-describe('Amendment', function(){
-
-  describe('0 of beta_brousouf currency', function(){
-
-    // Loads amTest with its data
-    before(function(done) {
-      var parser = parsers.parseAmendment(function (err) {
-      });
-      parser.end(AM0);
-      parser.on('readable', function () {
-        var parsed = parser.read();
-        amTest = new Amendment(parsed);
-        done();
-      });
-    });
-
-    it('should be version 1', function(){
-      assert.equal(amTest.version, 1);
-    });
-
-    it('should have beta_brousouf currency name', function(){
-      assert.equal(amTest.currency, 'beta_brousouf');
-    });
-
-    it('should be number 0', function(){
-      assert.equal(amTest.number, 0);
-    });
-
-    it('should have no Universal Dividend', function(){
-      should.not.exist(amTest.dividend);
-    });
-
-    it('should have no Minimal Coin Power', function(){
-      should.not.exist(amTest.coinMinPower);
-    });
-
-    it('should have no previous hash', function(){
-      should.not.exist(amTest.previousHash);
-    });
-
-    it('should have no members status root', function(){
-      should.not.exist(amTest.membersStatusRoot);
-    });
-
-    it('should have F5ACFD67FC908D28C0CFDAD886249AC260515C90 members hash', function(){
-      assert.equal('F5ACFD67FC908D28C0CFDAD886249AC260515C90', amTest.membersRoot);
-    });
-
-    it('should have the following 3 new members', function(){
-      var newMembers = amTest.getNewMembers();
-      assert.equal(newMembers.length, 3);
-      assert.equal(amTest.membersCount, 3);
-      assert.equal(newMembers[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C"); // Obito Uchiwa
-      assert.equal(newMembers[1], "33BBFC0C67078D72AF128B5BA296CC530126F372"); // John Snow
-      assert.equal(newMembers[2], "C73882B64B7E72237A2F460CE9CAB76D19A8651E"); // LoL Cat
-    });
-
-    it('should have the following 3 new voters', function(){
-      var newVoters = amTest.getNewVoters();
-      assert.equal(newVoters.length, 3);
-      assert.equal(amTest.votersCount, 3);
-      assert.equal(newVoters[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C");
-      assert.equal(newVoters[1], "33BBFC0C67078D72AF128B5BA296CC530126F372");
-      assert.equal(newVoters[2], "C73882B64B7E72237A2F460CE9CAB76D19A8651E");
-    });
-
-    it('should have no voters signatures root', function(){
-      should.not.exist(amTest.votersSigRoot);
-    });
-
-    it('its computed hash should be 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC', function(){
-      assert.equal(amTest.hash, '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC');
-    });
-
-    it('its manual hash should be 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC', function(){
-      assert.equal(sha1(amTest.getRaw()).toUpperCase(), '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC');
-    });
-  });
-});
\ No newline at end of file
diff --git a/test/fast/amendment-1.js b/test/fast/amendment-1.js
deleted file mode 100644
index b9e16af62ac95e618532a3ab9d4e7eb122c64cda..0000000000000000000000000000000000000000
--- a/test/fast/amendment-1.js
+++ /dev/null
@@ -1,95 +0,0 @@
-var should   = require('should');
-var assert   = require('assert');
-var mongoose = require('mongoose');
-var sha1     = require('sha1');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-
-var AM1 = "" +
-  "Version: 1\r\n" +
-  "Currency: beta_brousouf\r\n" +
-  "Number: 1\r\n" +
-  "GeneratedOn: 1380398542\r\n" +
-  "NextRequiredVotes: 2\r\n" +
-  "PreviousHash: 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC\r\n" +
-  "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
-  "MembersCount: 3\r\n" +
-  "MembersChanges:\r\n" +
-  "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
-  "VotersCount: 3\r\n" +
-  "VotersChanges:\r\n";
-
-var Amendment = mongoose.model('Amendment', require('../../app/models/amendment'));
-var amTest;
-
-describe('Amendment', function(){
-
-  describe('1 of beta_brousouf currency', function(){
-
-    // Loads amTest with its data
-    before(function(done) {
-      var parser = parsers.parseAmendment();
-      parser.end(AM1);
-      parser.on('readable', function () {
-        var parsed = parser.read();
-        amTest = new Amendment(parsed);
-        done();
-      });
-    });
-
-    it('should be version 1', function(){
-      assert.equal(amTest.version, 1);
-    });
-
-    it('should have beta_brousouf currency name', function(){
-      assert.equal(amTest.currency, 'beta_brousouf');
-    });
-
-    it('should be number 1', function(){
-      assert.equal(amTest.number, 1);
-    });
-
-    it('should have no Universal Dividend', function(){
-      should.not.exist(amTest.dividend);
-    });
-
-    it('should have no Minimal Coin Power', function(){
-      should.not.exist(amTest.coinMinPower);
-    });
-
-    it('should have 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC previous hash', function(){
-      assert.equal(amTest.previousHash, '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC');
-    });
-
-    it('should have 0 new members', function(){
-      var newMembers = amTest.getNewMembers();
-      assert.equal(newMembers.length, 0);
-      assert.equal(amTest.membersCount, 3);
-    });
-
-    it('should have no members status root', function(){
-      should.not.exist(amTest.membersStatusRoot);
-    });
-
-    it('should have F5ACFD67FC908D28C0CFDAD886249AC260515C90 voters hash', function(){
-      assert.equal('F5ACFD67FC908D28C0CFDAD886249AC260515C90', amTest.votersRoot);
-    });
-
-    it('should have the following 0 new voters', function(){
-      var newVoters = amTest.getNewVoters();
-      assert.equal(newVoters.length, 0);
-      assert.equal(amTest.votersCount, 3);
-    });
-
-    it('should have no voters signatures root', function(){
-      should.not.exist(amTest.votersSigRoot);
-    });
-
-    it('its computed hash should be F07D0B6DBB7EA99E5208752EABDB8B721C0010E9', function(){
-      assert.equal(amTest.hash, 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9');
-    });
-
-    it('its manual hash should be F07D0B6DBB7EA99E5208752EABDB8B721C0010E9', function(){
-      assert.equal(sha1(amTest.getRaw()).toUpperCase(), 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9');
-    });
-  });
-});
\ No newline at end of file
diff --git a/test/fast/amendment-2.js b/test/fast/amendment-2.js
deleted file mode 100644
index c07cdbceb767df3f39e772d6e77b140188ea5cbb..0000000000000000000000000000000000000000
--- a/test/fast/amendment-2.js
+++ /dev/null
@@ -1,113 +0,0 @@
-var should   = require('should');
-var assert   = require('assert');
-var mongoose = require('mongoose');
-var sha1     = require('sha1');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var fs       = require('fs');
-
-var AM2 = "" +
-  "Version: 1\r\n" +
-  "Currency: beta_brousouf\r\n" +
-  "Number: 2\r\n" +
-  "GeneratedOn: 1380400542\r\n" +
-  "UniversalDividend: 1184\r\n" +
-  "CoinAlgo: Base2Draft\r\n" +
-  "CoinBase: 4\r\n" +
-  "CoinList: 14 6 2 3 1\r\n" +
-  "NextRequiredVotes: 2\r\n" +
-  "PreviousHash: F07D0B6DBB7EA99E5208752EABDB8B721C0010E9\r\n" +
-  "MembersRoot: 7B66992FD748579B0774EDFAD7AB84143357F7BC\r\n" +
-  "MembersCount: 4\r\n" +
-  "MembersChanges:\r\n" +
-  "+B6AE93DDE390B1E11FA97EEF78B494F99025C77E\r\n" +
-  "VotersRoot: DC7A9229DFDABFB9769789B7BFAE08048BCB856F\r\n" +
-  "VotersCount: 2\r\n" +
-  "VotersChanges:\r\n" +
-  "-C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n";
-
-var Amendment = mongoose.model('Amendment', require('../../app/models/amendment'));
-var amTest;
-
-describe('Amendment', function(){
-
-  describe('2 of beta_brousouf currency', function(){
-
-    // Loads amTest with its data
-    before(function(done) {
-      var parser = parsers.parseAmendment();
-      parser.end(AM2);
-      parser.on('readable', function () {
-        var parsed = parser.read();
-        amTest = new Amendment(parsed);
-        done();
-      });
-    });
-
-    it('should be version 1', function(){
-      assert.equal(amTest.version, 1);
-    });
-
-    it('should have beta_brousouf currency name', function(){
-      assert.equal(amTest.currency, 'beta_brousouf');
-    });
-
-    it('should be number 2', function(){
-      assert.equal(amTest.number, 2);
-    });
-
-    it('should have a niversal Dividend of value 1184', function(){
-      assert.equal(amTest.dividend, 1184);
-    });
-
-    it('should have a Minimal Coin Base of 4', function(){
-      assert.equal(amTest.coinBase, 4);
-    });
-
-    it('should have F07D0B6DBB7EA99E5208752EABDB8B721C0010E9 previous hash', function(){
-      assert.equal(amTest.previousHash, 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9');
-    });
-
-    it('should have no members status root', function(){
-      should.not.exist(amTest.membersStatusRoot);
-    });
-
-    it('should have 7B66992FD748579B0774EDFAD7AB84143357F7BC members hash', function(){
-      assert.equal(amTest.membersRoot, '7B66992FD748579B0774EDFAD7AB84143357F7BC');
-    });
-
-    it('should have DC7A9229DFDABFB9769789B7BFAE08048BCB856F voters hash', function(){
-      assert.equal(amTest.votersRoot, 'DC7A9229DFDABFB9769789B7BFAE08048BCB856F');
-    });
-
-    it('should have no voters signatures root', function(){
-      should.not.exist(amTest.votersSigRoot);
-    });
-
-    it('should have the following new member', function(){
-      var newMembers = amTest.getNewMembers();
-      assert.equal(newMembers.length, 1);
-      assert.equal(amTest.membersCount, 4);
-      assert.equal(newMembers[0], "B6AE93DDE390B1E11FA97EEF78B494F99025C77E"); // walter white
-    });
-
-    it('should have 0 new voters', function(){
-      var voters = amTest.getNewVoters();
-      assert.equal(voters.length, 0);
-      assert.equal(amTest.votersCount, 2);
-    });
-
-    it('should have one voter leaving', function(){
-      var leavingVoters = amTest.getLeavingVoters();
-      assert.equal(leavingVoters.length, 1);
-      assert.equal(amTest.votersCount, 2);
-    });
-
-    it('its computed hash should be 5234E02254151A232197BD629FA0A52DE35FE780', function(){
-      assert.equal(amTest.hash, '5234E02254151A232197BD629FA0A52DE35FE780');
-    });
-
-    it('its manual hash should be 5234E02254151A232197BD629FA0A52DE35FE780', function(){
-      assert.equal(sha1(amTest.getRaw()).toUpperCase(), '5234E02254151A232197BD629FA0A52DE35FE780');
-    });
-  });
-});
\ No newline at end of file
diff --git a/test/fast/community_algos.js b/test/fast/community_algos.js
deleted file mode 100644
index 7f1e7107dcb1d60a13612cf97273ba78bec2660c..0000000000000000000000000000000000000000
--- a/test/fast/community_algos.js
+++ /dev/null
@@ -1,270 +0,0 @@
-var should  = require('should');
-var assert  = require('assert');
-var async   = require('async');
-var fs      = require('fs');
-var parsers = require('../../app/lib/streams/parsers/doc');
-
-var isMember = function (keyID, done) {
-  done(null, true);
-}
-
-var getPubkey = function (keyID, done) {
-  if (keyID == 'E9CAB76D19A8651E') {
-    done(null, {
-      "comment" : "udid2;c;CAT;LOL;2000-04-19;e+43.70-079.42;0;",
-      "name" : "LoL Cat",
-      "email" : "cem.moreau@gmail.com",
-      "raw" : "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nxsBNBFHHC/EBCADWTLSN7EGP+n30snndS3ZNcB02foL+0opcS6LK2coPDJLg\n2nookeJRHZxF3THmZQrKwZOjiuDBinOc5DWlzIS/gD/RaXwntgPFlGKBlBU+\ng255fr28ziSb5Y1lW4N//nUFdPZzoMmPgRj0b17T0UPCoMR8ZZ/Smk5LINbQ\nwt+A+LEoxEdEVcq+Tyc0OlEabqO6RFqiKDRiPhGPiCwVQA3yPjb6iCp5gTch\nObCxCnDbxA0Mfj9FmHrGbepNHGXxStO4xT0woCb7y02S1E8K08kOc5Bq9e1Y\nj5I/mdaw4Hn/Wp28lZl1mnO1u1z9ZU/rcglhEyaEOTwasheb44QcdGSfABEB\nAAHNTUxvTCBDYXQgKHVkaWQyO2M7Q0FUO0xPTDsyMDAwLTA0LTE5O2UrNDMu\nNzAtMDc5LjQyOzA7KSA8Y2VtLm1vcmVhdUBnbWFpbC5jb20+wsB9BBMBCAAn\nBQJRxwvxAhsDBQkLR5jvBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEOnK\nt20ZqGUeZYcH/0ItH4b/O0y7V1Jzc1DZAdn4iDiI7/SF3fN4f6cJCu/SOVb+\nERFIb6JK+HNHdVAcMHKaPW625R0FahHUkcXWkkGmQ6+sLIsVZwVN1oeZtlD1\n2cq9A4UJyfJUXkinMKkI8xpdV8J7s5wFRavOS/qaF5beah0Z+IGwQK0nuXxW\npT6UZWbpUfXPQB2Mz2/rpjSWKwO3X4FwwOfDiuZExyH2JPDYshdPcj/x+gnz\nYW9XfWCJw3rOK42vtM+aLtUpJO0Jh6X/sj/iqyS4rPB4DVCmEgSXPx1P+kqn\nsz3aNTOIujXS8Faz+TC+eNhn+z3SoTl5gBlNNM171fWFr0BR3nIfIu7OwE0E\nUccL8QEIAPAQaxK6s4DjDHiOwrMotvb479QD5PsHU6S0VG0+naoPlNJb2d5w\nYhnFAn4aYLiXx4IIl38rHnV+yWATOUe2rdCe4enTXkxyWJVaxIcNJLFpUjHY\nGbrCnNwiXpuQfSDuRN/wcVNSBKXhWNUPY9IsbgERWhS5YTFnuQcBjMqDwF6J\nImQ8O4nZwno811nqK1XaMuLVvXZAsO1Vi1k3NArM5+jdlq9e3BA0NcHJmGEc\nQdTw0Tk5Oq6rmE8ux7pS0bn6OUkkseR5DyRlFtzqi4wp30GeggeFExx7ZCVu\nctpJX9ZoC3cJoZT0s3LuUtV0EW50yCtP+3Vpkek2WtjfVbM6kDkAEQEAAcLA\nZQQYAQgADwUCUccL8QIbDAUJC0eY7wAKCRDpyrdtGahlHg7+B/95xEoSrFQ7\n/mc7g6sbisvx3s547gUXXYSuFHS03IMDWJrfGKqXtBf9ETBx4OLeBXY7z1lL\n4WCN6/xtrL+mSQ9dbDqdXv/1EhkSv0s+IvJ34KYGAkFXSCoTE7rnkPwQjoMY\nVSFkf5e8g9adyKvndq/QSPNuv+FPL6sHm1N9nmus5Ebr0zTVDmmfoqzokuDf\nHm5h6YrkFscMGjrCKWuXSiTaGj9Hm3MqeZ3TKva5isa/h0h7Ai3wJ5XJpMrF\nNN6BU/wIt7fM2hsNAOwaG+WUfgjYEkOua8gPPtpLZJJPb/89yrs9F7JkLi/o\niAl5VpItm+hlFpLe1TE7oa6k53eZ2a+VzsBNBFNjxXoBCADJ9zEi0Mc4tpef\nAaZP2d2fn1shaBKr0T56QDGohxBUcBohu3k0IdJYcR1t8hs70Gn4HTKouCBh\nhdKHgwWjY40LQ2m5wX0TIqLVxaRawOzohBHRaJG2A6DB2HeMwAxW+9/bm4ko\nmHehtk5RTCXo6CdPn+jTBrj9KVLSVX++ErEf9QEnUD1V501fTx6OD/KAGTGK\nE5AuhiFqti9N2DfwkRVoCfM+L0lznSv3DlvZYcuLtJm9u9Dl/B3EGsp8T3Qd\ni8TWOhLyUyDRGEuFJVI5Mm+76Nl7RJ0FqUNSkDTnJA8zY+ySUtHwxCTlDJUE\nVVFn1Tgri8iTQA+iEYM/RLSketC3ABEBAAHCwX4EGAEIAAkFAlNjxXoCGwIB\nKQkQ6cq3bRmoZR7AXSAEGQEIAAYFAlNjxXoACgkQPRm0C85A7fX2iQgAje5O\nmSAaMgIAIF7qAdBeOoBxr9G/nAjSAoRsT9y0OQcr2NG7a4QFTHZC5vXeYiSk\n7kuzuB8SoVmlSEGPf6NDbfDTxi+Z6leljaT473jbBX7HRzisIUhry17GQpM8\nopJBXqujfD/0498qtFd+8kM+PNUVULoBTmnz5hQLLbt4G7yLpSNuqUA2eyPt\nbb6i8kT2mN7U5kTv8bMY8QwiaH+YDCFP/yBQmtKwX2onhgKQha/f8SJ4DGOv\ng+tCPN0COXw6pwgI/RgZOI9oB/vAJTU/DWuEuKDfTC/f/Wa/6dQ/rhd8LZMP\ntP7XbI+Eue9wzTUsl82YJK49t+70qKTnAZhmnrofCACi4cgsPBVrfuIn8ML+\nT9kszOxYwOnzHy0mNenRo2DQnt9z40YuCXcFoMMIpm0o1EKORFieq7m1XkyI\n+8BKb4ad2HTLWopqT/IRJ46atq/goRWzfdEY4/52XNTjyl2jT6Am926g+XvD\n+NdkSzlnJ6JPuj0eZNTxPicqizaGcI40elmk0+uSNEs86SPSkrsZzbPk+RP0\nM+tGdaw7O3CW7sQUAKPGHt5BldFGL6Hw4pMWNg7obvcu5XtsvkVEgms0t5PF\nNAG/2JTG+Pcicsrf/EdO+o9G3M2z0L4FFxIkrmqrpycUsfT/gIMlFo+EygzQ\nSxwkCr+V2HghBDxZqmr0TYy1\r\n=U+Hq\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n",
-      "fingerprint" : "C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-    })
-  } else if (keyID == '2457A1587CA0ED9C') {
-    done(null, {
-      "comment" : "udid2;c;UCHIWA;OBITO;2000-09-30;e+35.69+139.69;0",
-      "name" : "Tobi Uchiwa",
-      "email" : "cem.moreau@gmail.com",
-      "raw" : "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nxsBNBFHG4x4BCADi8J4sSpIv5q2gREBwMj1TCUFDvQDx8/WivLKJ+LgmC2zw\nuuMDYo9YwZBmMe/orZJRSDwslKUARtFzmSui2CR3b4EEr1Hhz9coyqHsF9lY\ndht2YU7i08FOdppRJdk7XuHCABZ+mXeG8WnNMP+9QjRAh3sFDkWpji9iL5Zm\nzlDx6UMXq3lMSvN3VC32X+K2HoQgesm3fTjCBmQik2Ayvp89Ikc2wAWM5/B7\nRCwdHTTysVOE0KkxIIkeus76p+5pvLzrZOvM18ToLxV7KThxVvHn+dj2iOMu\nteY3BylN+XL1J/nBYkOCfsCigMClbWj7IptqDZWmqRbzYgcrOYa8SezxABEB\nAAHNVVRvYmkgVWNoaXdhICh1ZGlkMjtjO1VDSElXQTtPQklUTzsyMDAwLTA5\nLTMwO2UrMzUuNjkrMTM5LjY5OzApIDxjZW0ubW9yZWF1QGdtYWlsLmNvbT7C\nwH0EEwEIACcFAlHG4x4CGwMFCQs75EIFCwkIBwMFFQoJCAsFFgIDAQACHgEC\nF4AACgkQJFehWHyg7ZxljwgAkkV+cXO8kXXCqXdo9hwSprQwbHHfwsovhIvZ\nI9E4Tpce0TXaebflCecDwsPgGyeP8xPUX8pZAvYYw5klREvKn7Vu6NiGrE07\nk7EUCIs+kkPTXeRAv/NpMfJoUOdh+da0ybs+nTO1lJV+cEGqz0OX8yIwrlwh\nrkvnlFWRE/oe3NoJ9f0N7sMXejhs8aTGClXU87GiUAoQ0XC1U8BPLjprkne5\nRMsSVHj3HbVzVQXmreNVDNsvtJVTskGxUE7IzIK80fBZP7OmC+biZuwTqXek\nF6SCqOJjlIsDY4uIL/cCQRkhM1kmeeHcGOQT+6auPtpHXniRxUNOoi7VCWg/\nHS2r9s7ATQRRxuMeAQgA+jCWHHx/kPQxghMBuio36RoR63qQSFxpp2Lx5HIk\nUYhpHE0oGOEEiBG0HrKIv7Qz+4Cs1VHSDCplD+vtRS9PkjOopSxE+ROHjIfT\n0fcjkYT14m2Ftmcqs5/Vw9qBHLhJQPyqIR4TMVuDP5/1LIfnv/EUoisAFcpT\n86CFK1jOGtdTALxDKIk6mlsiPCXD7jlSWw3btJlwydeudTVYBq5OhC/DLREn\n2vgtvqcWjvi4X/ttEWB35EzP11s6gRTv3ldVlXQ13Db+gHrjExRn848bRu0R\n1RzgcpsXOVeyzlzMKFJDXueyCOdiVAyEVPmLHKojwaP+UHlEnwI/v5OMva1V\nsQARAQABwsBlBBgBCAAPBQJRxuMeAhsMBQkLO+RCAAoJECRXoVh8oO2cgiQI\nAKCqxY4LVbHYDywkwI4dAFp4bFlqKDURKzEq8nfDliBLmFrDAv9lFEBbNii7\nY6b3FxaijUTPlJbU9RX8xtPO6bbAujJPyHsi/hBZjqWCqbajbwoNMYzu9nbt\nB2DfxZKYnVijjmb15WuXVC+GN4M+ZCtw+SNrpFTBPUUl4LjBRvUJ9DhjbD2+\nFlqXfDiRLKma0658s2PQZhqajiEswDyo1fAhOykaWCE5pW0DHl2Fizc77/QD\ne7iQa8ZRWp8Q/w0FJE2bXb3Paxtd40XURVOGRmtNvLPTKXIgxFi2dTCBQz6o\nTeajOjun6x6BUJVUbnJ40YmlqYbXqHyI9AcVMMEsLdw=\r\n=j8Ju\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n",
-      "fingerprint" : "2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-    });
-  } else {
-    done('Key was not found');
-  }
-}
-
-var AnyKey = require('../../app/lib/algos/community/AnyKey');
-var OneSig = require('../../app/lib/algos/community/1Sig')(isMember, getPubkey);
-
-var pubkeyCatRaw = fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8');
-var pubkeySnowRaw = fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8');
-
-var amGenerated = 1403301600;
-var aYear = 24*3600*365.25;
-var theDay = new Date(amGenerated * 1000);
-var theDayAYearBefore = new Date((amGenerated - aYear) * 1000);
-var POSITIVE = 1;
-var NEGATIVE = -1;
-var NO_CHANGES = 0;
-
-var doingNothing = {
-  currentMembership: null,
-  nextMembership:    null,
-  voterOn:           null,
-  nextVoting:        null,
-};
-
-var justJoining = {
-  currentMembership: null,
-  nextMembership:    { membership: 'IN', date: theDay },
-  voterOn:           null,
-  nextVoting:        null,
-};
-
-var justLeaving = {
-  currentMembership: { membership: 'IN' },
-  nextMembership:    { membership: 'OUT', date: theDay },
-  voterOn:           null,
-  nextVoting:        null,
-};
-
-var askingToVote = {
-  currentMembership: { membership: 'IN' },
-  nextMembership:    null,
-  voterOn:           null,
-  nextVoting:        { date: theDay },
-};
-
-var askingToVoteFutureMember = {
-  currentMembership: null,
-  nextMembership:    { membership: 'IN', date: theDay },
-  voterOn:           null,
-  nextVoting:        { date: theDay },
-};
-
-var askingToLeave = {
-  currentMembership: { membership: 'IN' },
-  nextMembership:    { membership: 'OUT', date: theDay },
-  voterOn:           amGenerated,
-  nextVoting:        null,
-};
-
-var aStaticOldVoter = {
-  currentMembership: { membership: 'IN' },
-  nextMembership:    null,
-  voterOn:           amGenerated - 3600*24*15,
-  nextVoting:        null,
-};
-
-var aStaticOldMember = {
-  currentMembership: { membership: 'IN', date: theDayAYearBefore },
-  nextMembership:    null,
-  voterOn:           null,
-  nextVoting:        null,
-};
-
-var aVoterActualizing = {
-  currentMembership: { membership: 'IN' },
-  nextMembership:    null,
-  voterOn:           amGenerated - 1,
-  nextVoting:        { date: theDay },
-};
-
-describe('AnyKey:', function(){
-
-  var pubkey = { raw: pubkeyCatRaw };
-
-  it('a non-member doing nothing', function (done) {
-    AnyKey(pubkey, doingNothing, { generated: amGenerated },              expect(NO_CHANGES, NO_CHANGES, done));
-  });
-
-  it('a non-member wants to join', function (done) {
-    AnyKey(pubkey, justJoining, { generated: amGenerated },              expect(POSITIVE, NO_CHANGES, done));
-  });
-
-  it('a member wants to leave', function (done) {
-    AnyKey(pubkey, justLeaving, { generated: amGenerated },              expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a member wants to vote', function (done) {
-    AnyKey(pubkey, askingToVote, { generated: amGenerated },             expect(NO_CHANGES, POSITIVE, done));
-  });
-
-  it('a future member wants to vote', function (done) {
-    AnyKey(pubkey, askingToVoteFutureMember, { generated: amGenerated }, expect(POSITIVE, POSITIVE, done));
-  });
-
-  it('a voter wants to leave as a member', function (done) {
-    AnyKey(pubkey, askingToLeave, { generated: amGenerated },            expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a too old voter should be kicked from voters', function (done) {
-    AnyKey(pubkey, aStaticOldVoter, { generated: amGenerated },          expect(NO_CHANGES, NEGATIVE, done));
-  });
-
-  it('a voter actualizing himself should be shown as "+"', function (done) {
-    AnyKey(pubkey, aVoterActualizing, { generated: amGenerated },        expect(NO_CHANGES, POSITIVE, done));
-  });
-
-  it('no too old member exist in AnyKey algorithm', function (done) {
-    AnyKey(pubkey, aStaticOldMember, { generated: amGenerated },          expect(NO_CHANGES, NO_CHANGES, done));
-  });
-});
-
-describe('1Sig:', function(){
-
-  var pubkey1Sig = { raw: pubkeyCatRaw, nbVerifiedSigs: 1 };
-  var pubkeyNSig = { raw: pubkeyCatRaw, nbVerifiedSigs: 23 };
-
-  it('a non-member doing nothing', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, doingNothing, { generated: amGenerated },              expect(NO_CHANGES, NO_CHANGES, cb)) },
-      function(cb) { OneSig(pubkeyNSig, doingNothing, { generated: amGenerated },              expect(NO_CHANGES, NO_CHANGES, cb)) },
-    ], done);
-  });
-
-  it('a non-member wants to join', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, justJoining, { generated: amGenerated },               expect(POSITIVE, NO_CHANGES, cb)) },
-      function(cb) { OneSig(pubkeyNSig, justJoining, { generated: amGenerated },               expect(POSITIVE, NO_CHANGES, cb)) },
-    ], done);
-  });
-
-  it('a member wants to leave', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, justLeaving, { generated: amGenerated },               expect(NEGATIVE, NEGATIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, justLeaving, { generated: amGenerated },               expect(NEGATIVE, NEGATIVE, cb)) },
-    ], done);
-  });
-
-  it('a member wants to vote', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, askingToVote, { generated: amGenerated },              expect(NO_CHANGES, POSITIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, askingToVote, { generated: amGenerated },              expect(NO_CHANGES, POSITIVE, cb)) },
-    ], done);
-  });
-
-  it('a future member wants to vote', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, askingToVoteFutureMember, { generated: amGenerated },  expect(POSITIVE, POSITIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, askingToVoteFutureMember, { generated: amGenerated },  expect(POSITIVE, POSITIVE, cb)) },
-    ], done);
-  });
-
-  it('a voter wants to leave as a member', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, askingToLeave, { generated: amGenerated },             expect(NEGATIVE, NEGATIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, askingToLeave, { generated: amGenerated },             expect(NEGATIVE, NEGATIVE, cb)) },
-    ], done);
-  });
-
-  it('a too old voter should be kicked from voters', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, aStaticOldVoter, { generated: amGenerated },           expect(NO_CHANGES, NEGATIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, aStaticOldVoter, { generated: amGenerated },           expect(NO_CHANGES, NEGATIVE, cb)) },
-    ], done);
-  });
-
-  it('a voter actualizing himself should be shown as "+"', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, aVoterActualizing, { generated: amGenerated },         expect(NO_CHANGES, POSITIVE, cb)) },
-      function(cb) { OneSig(pubkeyNSig, aVoterActualizing, { generated: amGenerated },         expect(NO_CHANGES, POSITIVE, cb)) },
-    ], done);
-  });
-
-  it('no too old member exist in 1Sig algorithm', function (done) {
-    async.series([
-      function(cb) { OneSig(pubkey1Sig, aStaticOldMember, { generated: amGenerated },          expect(NO_CHANGES, NO_CHANGES, cb)) },
-      function(cb) { OneSig(pubkeyNSig, aStaticOldMember, { generated: amGenerated },          expect(NO_CHANGES, NO_CHANGES, cb)) },
-    ], done);
-  });
-
-});
-
-describe('1Sig (with non-eligible pubkey):', function(){
-
-  // Testing wrong number of signatures
-
-  var wrongPubkey = { raw: pubkeySnowRaw };
-
-  it('a non-member doing nothing (should not happen in real)', function (done) {
-    OneSig(wrongPubkey, doingNothing, { generated: amGenerated },             expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a non-member wants to join', function (done) {
-    OneSig(wrongPubkey, justJoining, { generated: amGenerated },              expect(NO_CHANGES, NO_CHANGES, done));
-  });
-
-  it('a member wants to leave', function (done) {
-    OneSig(wrongPubkey, justLeaving, { generated: amGenerated },              expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a member wants to vote', function (done) {
-    OneSig(wrongPubkey, askingToVote, { generated: amGenerated },             expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a future member wants to vote (should not happen, since he can\'t be a future member', function (done) {
-    OneSig(wrongPubkey, askingToVoteFutureMember, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, done));
-  });
-
-  it('a voter wants to leave as a member', function (done) {
-    OneSig(wrongPubkey, askingToLeave, { generated: amGenerated },            expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('a too old voter should be kicked from voters', function (done) {
-    OneSig(wrongPubkey, aStaticOldVoter, { generated: amGenerated },          expect(NEGATIVE, NEGATIVE, done));
-  });
-
-  it('no too old member exist in 1Sig algorithm', function (done) {
-    OneSig(wrongPubkey, aStaticOldMember, { generated: amGenerated },          expect(NEGATIVE, NEGATIVE, done));
-  });
-});
-
-function expect (membershipIndicator, voterIndicator, done) {
-  return function (err, indicators) {
-    should.not.exist(err);
-    should.exist(indicators);
-    should.exist(indicators.membership);
-    should.exist(indicators.key);
-    indicators.membership.should.equal(membershipIndicator);
-    indicators.key.should.equal(voterIndicator);
-    done();
-  };
-}
\ No newline at end of file
diff --git a/test/fast/statement.js b/test/fast/statement.js
deleted file mode 100644
index ff3cac76ccdcd57b019f1bf052fb5f818ee9dc56..0000000000000000000000000000000000000000
--- a/test/fast/statement.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var should   = require('should');
-var assert   = require('assert');
-var async    = require('async');
-var sha1     = require('sha1');
-var fs       = require('fs');
-var mongoose = require('mongoose');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var ucoin    = require('../..');
-
-var Statement = mongoose.model('Statement', require('../../app/models/statement'));
-var rawCF = fs.readFileSync(__dirname + "/../data/statements/cat.flow", "utf8") +
-            fs.readFileSync(__dirname + "/../data/statements/cat.flow.asc", "utf8");
-
-describe('Statement', function(){
-
-  describe('signed by cat', function(){
-
-    var entry;
-
-    before(function(done) {
-      var parser = parsers.parseStatement().asyncWrite(rawCF, function (err, obj) {
-        entry = new Statement(obj);
-        done(err);
-      });
-    });
-
-    it('should be version 1', function(){
-      assert.equal(entry.version, 1);
-    });
-
-    it('should have beta_brousoufs currency name', function(){
-      assert.equal(entry.currency, 'beta_brousouf');
-    });
-
-    it('should have key', function(){
-      assert.equal(entry.issuer, 'C73882B64B7E72237A2F460CE9CAB76D19A8651E');
-    });
-
-    it('should have date', function(){
-      should.exist(entry.date);
-    });
-
-    it('its computed hash should be FEDBD536DC987968D36C2C69F7A3CC6698BFBADF', function(){
-      assert.equal(entry.hash, 'FEDBD536DC987968D36C2C69F7A3CC6698BFBADF');
-    });
-
-    it('its manual hash should be A3EDCD9434938A0745C08DBD13FE436BE32053FB', function(){
-      assert.equal(sha1(entry.getRaw()).toUpperCase(), 'A3EDCD9434938A0745C08DBD13FE436BE32053FB');
-    });
-
-    it('its manual signed hash should be FEDBD536DC987968D36C2C69F7A3CC6698BFBADF', function(){
-      assert.equal(sha1(entry.getRawSigned()).toUpperCase(), 'FEDBD536DC987968D36C2C69F7A3CC6698BFBADF');
-    });
-  });
-});
diff --git a/test/fast/vote.js b/test/fast/vote.js
deleted file mode 100644
index 82ab28df98fff9b87118389005000602638509c6..0000000000000000000000000000000000000000
--- a/test/fast/vote.js
+++ /dev/null
@@ -1,133 +0,0 @@
-var should   = require('should');
-var assert   = require('assert');
-var mongoose = require('mongoose');
-var sha1     = require('sha1');
-var common   = require('../../app/lib/common');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var fs       = require('fs');
-
-var AM0 = "" +
-  "Version: 1\r\n" +
-  "Currency: beta_brousouf\r\n" +
-  "Number: 0\r\n" +
-  "GeneratedOn: 1398895200\r\n" +
-  "NextRequiredVotes: 1\r\n" +
-  "MembersRoot: 2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE\r\n" +
-  "MembersCount: 3\r\n" +
-  "MembersChanges:\r\n" +
-  "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" +
-  "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" +
-  "+D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" +
-  "VotersRoot: D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" +
-  "VotersCount: 1\r\n" +
-  "VotersChanges:\r\n" +
-  "+D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" +
-  "-----BEGIN PGP SIGNATURE-----\r\n" +
-  "Version: GnuPG v1\r\n" +
-  "\r\n" +
-  "iQEcBAABCAAGBQJThMLnAAoJEAh7o1HArrbf/ooH+wYzibvx66254R9FJfNz/miQ\r\n" +
-  "9GWzSbB5l+3Megxgrg3kl/OrJxcDr+o8/xxdtxROFRkwBfPkg4TNBmcFd6u0aLZp\r\n" +
-  "WSGBVgBlTaD18QGNVZQnrMsY9E4Ih+v+bg6tMGNnS2evqH2/OVcNO/gq4HfTxje/\r\n" +
-  "Ce6UdMpvFyZBXJlfclPhZtfB3sxQ8qpd+7X6ih2p2BLLPmmgHbL7995X0kjNZUqN\r\n" +
-  "UlNKbm0sFeOq3Ta01BIUx/u80oUNXoC/JemlpbiHsMrAtL1ZDT+CM5WrEKVdVidy\r\n" +
-  "jV6QcnZqUcO7Yfvf8z2yPN92W9OQJrTA8wjIjjJm5Dq5LbTi4C/jlQl4+uKvOg8=\r\n" +
-  "=GqZy\r\n" +
-  "-----END PGP SIGNATURE-----\r\n";
- 
-var Vote = mongoose.model('Vote', require('../../app/models/vote'));
-var Amendment = mongoose.model('Amendment', require('../../app/models/amendment'));
-var v;
-
-describe('Vote', function(){
-
-  describe('0 of beta_brousouf currency', function(){
-
-    // Loads v with its data
-    before(function(done) {
-      // var parser = parsers.parseAmendment();
-      var parser = parsers.parseVote(function (err) {
-        done(err);
-      });
-
-      parser.end(AM0);
-      parser.on('readable', function () {
-        var parsed = parser.read();
-        v = new Vote(parsed);
-        v.amendment = new Amendment(parsed.amendment);
-        done();
-      });
-    });
-
-    it('should be version 1', function(){
-      assert.equal(v.amendment.version, 1);
-    });
-
-    it('should have beta_brousouf currency name', function(){
-      assert.equal(v.amendment.currency, 'beta_brousouf');
-    });
-
-    it('should be number 0', function(){
-      assert.equal(v.amendment.number, 0);
-    });
-
-    it('should have no Universal Dividend', function(){
-      should.not.exist(v.amendment.dividend);
-    });
-
-    it('should have no Minimal Coin Power', function(){
-      should.not.exist(v.amendment.coinMinPower);
-    });
-
-    it('should have no previous hash', function(){
-      should.not.exist(v.amendment.previousHash);
-    });
-
-    it('should have no members status root', function(){
-      should.not.exist(v.amendment.membersStatusRoot);
-    });
-
-    it('should have 2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE members hash', function(){
-      assert.equal('2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE', v.amendment.membersRoot);
-    });
-
-    it('should have the following 3 new members', function(){
-      var newMembers = v.amendment.getNewMembers();
-      assert.equal(newMembers.length, 3);
-      assert.equal(v.amendment.membersCount, 3);
-      assert.equal(newMembers[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C"); // Obito Uchiwa
-      assert.equal(newMembers[1], "C73882B64B7E72237A2F460CE9CAB76D19A8651E"); // John Snow
-      assert.equal(newMembers[2], "D049002A6724D35F867F64CC087BA351C0AEB6DF"); // LoL Cat
-    });
-
-    it('should have D049002A6724D35F867F64CC087BA351C0AEB6DF voters hash', function(){
-      assert.equal('D049002A6724D35F867F64CC087BA351C0AEB6DF', v.amendment.votersRoot);
-    });
-
-    it('should have the following 1 new voter', function(){
-      var newVoters = v.amendment.getNewVoters();
-      assert.equal(newVoters.length, 1);
-      assert.equal(v.amendment.votersCount, 1);
-      assert.equal(newVoters[0], "D049002A6724D35F867F64CC087BA351C0AEB6DF");
-    });
-
-    it('should have no voters signatures root', function(){
-      should.not.exist(v.amendment.votersSigRoot);
-    });
-
-    it('its computed hash should be 65A55999086155BF6D3E4EB5D475E46E4E2307D2', function(){
-      assert.equal(v.amendment.hash, '65A55999086155BF6D3E4EB5D475E46E4E2307D2');
-    });
-
-    it('its manual hash should be 65A55999086155BF6D3E4EB5D475E46E4E2307D2', function(){
-      assert.equal(sha1(v.amendment.getRaw()).toUpperCase(), '65A55999086155BF6D3E4EB5D475E46E4E2307D2');
-    });
-
-    it('its computed SIGNED hash should be 2D5E939799C37BEFAE43629E9962D47B1E6742A8', function(){
-      assert.equal(v.hash, '2D5E939799C37BEFAE43629E9962D47B1E6742A8');
-    });
-
-    it('its manual SIGNED hash should be 2D5E939799C37BEFAE43629E9962D47B1E6742A8', function(){
-      assert.equal(sha1(v.getRawSigned()).toUpperCase(), '2D5E939799C37BEFAE43629E9962D47B1E6742A8');
-    });
-  });
-});
\ No newline at end of file
diff --git a/test/fast/voting.js b/test/fast/voting.js
deleted file mode 100644
index 314ff626335e6a8905b8e21a65225f2389462b7e..0000000000000000000000000000000000000000
--- a/test/fast/voting.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var should   = require('should');
-var mongoose = require('mongoose');
-var assert   = require('assert');
-var async    = require('async');
-var sha1     = require('sha1');
-var fs       = require('fs');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var ucoin    = require('../..');
-
-var Voting = mongoose.model('Voting', require('../../app/models/voting'));
-var rawVoting = "" +
-  "Version: 1\r\n" +
-  "Currency: beta_brousouf\r\n" +
-  "Registry: VOTING\r\n" +
-  "Issuer: 405715EC64289D1F43808F57EC51F273CBC0FA17\r\n" +
-  "Date: 1402836803\r\n" +
-  "AmendmentNumber: 0\r\n" +
-  "AmendmentHash: 1F747250395C6AE7C3CF4BB094F007151D5AB188\r\n";
-
-describe('Voting', function(){
-
-  var vt;
-
-  before(function(done) {
-    var parser = parsers.parseVoting().asyncWrite(rawVoting, function (err, obj) {
-      vt = new Voting(obj);
-      done(err);
-    });
-  });
-
-  it('should be version 1', function(){
-    assert.equal(vt.version, 1);
-  });
-
-  it('should have beta_brousoufs currency name', function(){
-    assert.equal(vt.currency, 'beta_brousouf');
-  });
-
-  it('should have registry VOTING', function(){
-    assert.equal(vt.type, 'VOTING');
-  });
-
-  it('should have good issuer', function(){
-    assert.equal(vt.issuer, '405715EC64289D1F43808F57EC51F273CBC0FA17');
-  });
-
-  it('should have good date', function(){
-    assert.equal(vt.date.timestamp(), 1402836803);
-  });
-
-  it('its computed hash should be CEA87B744CE437CE2E8FE09AFCA028950C32D15A', function(){
-    assert.equal(vt.hash, 'CEA87B744CE437CE2E8FE09AFCA028950C32D15A');
-  });
-
-  it('its manual hash should be CEA87B744CE437CE2E8FE09AFCA028950C32D15A', function(){
-    assert.equal(sha1(vt.getRaw()).toUpperCase(), 'CEA87B744CE437CE2E8FE09AFCA028950C32D15A');
-  });
-});
diff --git a/test/slow/c-pubkeys.js b/test/medium/c-pubkeys.js
similarity index 91%
rename from test/slow/c-pubkeys.js
rename to test/medium/c-pubkeys.js
index bd7572e553a42c9f5b7b3e9e811b0c31e1cfa1b0..fd9373c928be12a6452740ad0bb294e17c088135 100644
--- a/test/slow/c-pubkeys.js
+++ b/test/medium/c-pubkeys.js
@@ -33,17 +33,17 @@ var testCases = [
   **/
 
   // Cat is used by server
-  testMerkle("/pks/all", 'C73882B64B7E72237A2F460CE9CAB76D19A8651E'),
+  testMerkle("/pks/all", ''),
 
   tester.verify(
     "Snow giving his key for first time must pass",
     on.pksAdd(pubkeySnow),
     is.expectedPubkey('33BBFC0C67078D72AF128B5BA296CC530126F372')
   ),
-  testMerkle("/pks/all", '5DB500A285BD380A68890D09232475A8CA003DC8'),
+  testMerkle("/pks/all", '33BBFC0C67078D72AF128B5BA296CC530126F372'),
 
   tester.verify(
-    "Cat has already given his key, but without the same signatures (this one is laking some signatures)",
+    "Cat's pubkey'",
     on.pksAdd(pubkeyCat),
     is.expectedPubkey('C73882B64B7E72237A2F460CE9CAB76D19A8651E')
   ),
@@ -83,7 +83,7 @@ function testMerkle (url, root) {
 before(function (done) {
   logger.debug("Launching server...");
   this.timeout(1000*3); // In seconds
-  var server = ucoin.createRegistryServer({ name: currency, listenBMA: true, resetData: true }, {
+  var server = ucoin.createPKSServer({ name: currency, listenBMA: true, resetData: true }, {
     currency: currency,
     pgpkey: fs.readFileSync(__dirname + "/../data/lolcat.priv"),
     pgppasswd: 'lolcat',
diff --git a/test/medium/hdcserver.js b/test/medium/hdcserver.js
deleted file mode 100644
index 14193d876674bb00b0f93b2e9aed993feb46cd88..0000000000000000000000000000000000000000
--- a/test/medium/hdcserver.js
+++ /dev/null
@@ -1,226 +0,0 @@
-var should   = require('should');
-var fs       = require('fs');
-var async    = require('async');
-var ucoin    = require('./../..');
-var unix2dos = require('../../app/lib/unix2dos');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var logger   = require('../../app/lib/logger')('[hdcserver]');
-
-var pubkeyCatRaw = unix2dos(fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8'));
-var pubkeySnowRaw = unix2dos(fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8'));
-var pubkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.pub', 'utf8'));
-
-var pubkeyCat, pubkeySnow, pubkeyUbot1;
-
-before(function (done) {
-  async.parallel({
-    cat: function(callback){
-      parsers.parsePubkey().asyncWrite(pubkeyCatRaw, function (err, obj) {
-        pubkeyCat = obj;
-        callback(err);
-      });
-    },
-    snow: function(callback){
-      parsers.parsePubkey().asyncWrite(pubkeySnowRaw, function (err, obj) {
-        pubkeySnow = obj;
-        callback(err);
-      });
-    },
-    ubot1: function(callback){
-      parsers.parsePubkey().asyncWrite(pubkeyUbot1Raw, function (err, obj) {
-        pubkeyUbot1 = obj;
-        callback(err);
-      });
-    },
-  }, done);
-})
-
-describe('A server', function () {
-
-  this.timeout(1000*5);
-
-  var hdcServer;
-  beforeEach(function (done) {
-    hdcServer = ucoin.createHDCServer({ name: 'hdc1', resetData: true });
-    hdcServer.on('services', done);
-  })
-
-  afterEach(function (done) {
-    hdcServer.disconnect(done);
-  })
-  
-  it('HDC should emit error on wrong data type', function (done) {
-    hdcServer.on('error', function (err) {
-      should.exist(err);
-      done();
-    });
-    hdcServer.write({ some: 'data' });
-  });
-  
-  it('HDC should accept pubkeys', function (done) {
-    hdcServer.on('pubkey', function (pubkey) {
-      should.exist(pubkey);
-      done();
-    });
-    hdcServer.write(pubkeySnow);
-  });
-  
-  it('HDC should allow both simple & multiple writings', function (done) {
-    async.parallel([
-      until(hdcServer, 'pubkey', 2)
-    ], done);
-    hdcServer.singleWriteStream().write(pubkeyUbot1);
-    hdcServer.singleWriteStream().end();
-    hdcServer.write(pubkeySnow);
-  });
-  
-  it('HDC should accept votes', function (done) {
-    async.parallel([
-      until(hdcServer, 'vote', 1)
-    ], done);
-    hdcServer.write(pubkeyUbot1);
-    hdcServer.write({
-      amendment: {
-        "version": 1,
-        "number": 0,
-        "generated": 1398895200,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": null,
-        "coinList": [],
-        "votersChanges": [
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ],
-        "membersChanges": [
-          "+2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-          "+C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ]
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-  });
-  
-  it('HDC should accept transactions', function (done) {
-    async.parallel([
-      until(hdcServer, 'transaction', 1)
-    ], done);
-    hdcServer.write(pubkeyUbot1);
-    hdcServer.write({
-      amendment: {
-        "version": 1,
-        "number": 0,
-        "generated": 1398895200,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": null,
-        "coinList": [],
-        "votersChanges": [
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ],
-        "membersChanges": [
-          "+2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-          "+C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ]
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    hdcServer.write({
-      amendment: {
-        "version": 1,
-        "number": 1,
-        "generated": 1398981600,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2",
-        "coinList": [],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    hdcServer.write({
-      amendment: {
-        "version": 1,
-        "number": 2,
-        "generated": 1399068000,
-        "nextVotes": 1,
-        "dividend": 100,
-        "coinBase": 0,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452",
-        "coinList": [
-          26,
-          7,
-          5,
-          3,
-          1
-        ],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    hdcServer.write({
-      "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n",
-      "version": 1,
-      "currency": "beta_brousouf",
-      "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "number": 0,
-      "previousHash": null,
-      "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "coins": [
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12",
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14"
-      ],
-      "sigDate": new Date(),
-      "comment": "",
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-    });
-  });
-})
-
-function until (server, eventName, count) {
-  var counted = 0;
-  var max = count == undefined ? 1 : count;
-  return function (callback) {
-    server.on(eventName, function (obj) {
-      logger.trace('event = %s', eventName);
-      should.exist(obj);
-      counted++;
-      if (counted == max)
-        callback();
-    });
-  }
-}
\ No newline at end of file
diff --git a/test/medium/openpgp.js b/test/medium/openpgp.js
index 7b9a82c0fca624b6d578494c1a5e24e4ff6e6f7c..90f4b690d220a1eb5f2e7faf8c9e9532992bbde9 100644
--- a/test/medium/openpgp.js
+++ b/test/medium/openpgp.js
@@ -142,18 +142,11 @@ describe('Multiline message signature:', function(){
    "Currency: beta_brousouf\r\n" +
    "Number: 0\r\n" +
    "GeneratedOn: 1380397288\r\n" +
-   "NextRequiredVotes: 2\r\n" +
    "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
    "MembersCount: 3\r\n" +
    "MembersChanges:\r\n" +
    "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" +
    "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" +
-   "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" +
-   "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" +
-   "VotersCount: 3\r\n" +
-   "VotersChanges:\r\n" +
-   "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" +
-   "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" +
    "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" +
     "\r\n";
 
diff --git a/test/medium/peerserver.js b/test/medium/peerserver.js
index 9440c53ec60f9562928979f0312cfd8d73e9f7e8..94d2737b930f33d2ba4d1bccf98b1a75d218fa25 100644
--- a/test/medium/peerserver.js
+++ b/test/medium/peerserver.js
@@ -147,107 +147,6 @@ describe('A server', function () {
       "pubkey": { fingerprint: "C73882B64B7E72237A2F460CE9CAB76D19A8651E" }
     });
   });
-  
-  it('Peer should accept transactions', function (done) {
-    async.parallel({
-      transaction: until(peerServer, 'transaction'),
-    }, done);
-    peerServer.write(pubkeyUbot1);
-    peerServer.write({
-      amendment: {
-        "version": 1,
-        "number": 0,
-        "generated": 1398895200,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": null,
-        "coinList": [],
-        "votersChanges": [
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ],
-        "membersChanges": [
-          "+2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-          "+C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ]
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    peerServer.write({
-      amendment: {
-        "version": 1,
-        "number": 1,
-        "generated": 1398981600,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2",
-        "coinList": [],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    peerServer.write({
-      amendment: {
-        "version": 1,
-        "number": 2,
-        "generated": 1399068000,
-        "nextVotes": 1,
-        "dividend": 100,
-        "coinBase": 0,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452",
-        "coinList": [
-          26,
-          7,
-          5,
-          3,
-          1
-        ],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    peerServer.write({
-      "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n",
-      "version": 1,
-      "currency": "beta_brousouf",
-      "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "number": 0,
-      "previousHash": null,
-      "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "coins": [
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12",
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14"
-      ],
-      "sigDate": new Date(),
-      "comment": "",
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-    });
-  });
 })
 
 function until (server, eventName, count) {
diff --git a/test/medium/pksserver.js b/test/medium/pksserver.js
index 4243527d0e6aba9c552e2177c05a12e0d81a5a46..9f03673fb22fa5594ea63ad0f2fc086984cac8ce 100644
--- a/test/medium/pksserver.js
+++ b/test/medium/pksserver.js
@@ -41,7 +41,7 @@ describe('A PKS server', function () {
 
   var pksServer;
   beforeEach(function (done) {
-    pksServer = ucoin.createHDCServer({ name: 'hdc1', resetData: true });
+    pksServer = ucoin.createPKSServer({ name: 'hdc1', resetData: true });
     pksServer.on('services', done);
   })
 
diff --git a/test/medium/regserver.js b/test/medium/regserver.js
deleted file mode 100644
index 551eeed70e804ea3caae3f54d2f8572dcad52af5..0000000000000000000000000000000000000000
--- a/test/medium/regserver.js
+++ /dev/null
@@ -1,289 +0,0 @@
-var ucoin    = require('./../..');
-var async    = require('async');
-var should   = require('should');
-var fs       = require('fs');
-var unix2dos = require('../../app/lib/unix2dos');
-var parsers  = require('../../app/lib/streams/parsers/doc');
-var logger   = require('../../app/lib/logger')('[regserver]');
-
-var pubkeyCatRaw = unix2dos(fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8'));
-var pubkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.pub', 'utf8'));
-var privkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.priv', 'utf8'));
-
-var pubkeyCat, pubkeyUbot1;
-
-before(function (done) {
-  async.parallel({
-    cat: function(callback){
-      parsers.parsePubkey().asyncWrite(pubkeyCatRaw, function (err, obj) {
-        pubkeyCat = obj;
-        callback(err);
-      });
-    },
-    ubot1: function(callback){
-      parsers.parsePubkey().asyncWrite(pubkeyUbot1Raw, function (err, obj) {
-        pubkeyUbot1 = obj;
-        callback(err);
-      });
-    },
-  }, done);
-})
-
-describe('A server', function () {
-
-  this.timeout(1000*5);
-
-  var regServer;
-  before(function (done) {
-    regServer = ucoin.createRegistryServer({ name: 'hdc3', listenBMA: true, resetData: true }, {
-      pgpkey: privkeyUbot1Raw,
-      pgppasswd: 'ubot1',
-      currency: 'beta_brousouf',
-      ipv4: '127.0.0.1',
-      remoteipv4: '127.0.0.1',
-      port: 8090,
-      remoteport: 8090,
-      kmanagement: 'ALL',
-      createNext: true,
-      sync: {
-        "AMStart": 1398895200,
-        "AMFreq": 86400,
-        "UDFreq": 172800,
-        "UD0": 100,
-        "UDPercent": 0.1,
-        "Consensus": 0.33,
-        "AMDaemon" : "OFF",
-        "Algorithm" : "AnyKey"
-      }
-    });
-    regServer.on('BMALoaded', done);
-  })
-  
-  // it('Registry should emit error on wrong data type', function (done) {
-  //   regServer.on('error', function (err) {
-  //     should.exist(err);
-  //     done();
-  //   });
-  //   regServer.write({ some: 'data' });
-  // });
-  
-  // it('Registry should accept pubkeys', function (done) {
-  //   regServer.on('pubkey', function (pubkey) {
-  //     should.exist(pubkey);
-  //     done();
-  //   });
-  //   regServer.write(pubkeyCat);
-  // });
-  
-  // it('Registry should accept forwards & status', function (done) {
-  //   async.parallel({
-  //     forward: until(regServer, 'forward'),
-  //     status:  until(regServer, 'status'),
-  //     wallet:  until(regServer, 'wallet'),
-  //   }, done);
-  //   regServer.write(pubkeyCat);
-  //   regServer.write({
-  //     "version": "1",
-  //     "currency": "beta_brousouf",
-  //     "fingerprint": "C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-  //     "endpoints": [
-  //       "BASIC_MERKLED_API 127.0.0.1 8080"
-  //     ],
-  //     "keyID": "E9CAB76D19A8651E",
-  //     "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJTlsmOCRDpyrdtGahlHgAAGPoIANAv8Q6PtaLuCzD9aDH+\nue9G10QNsXBCOIErj7wocmct3Y9yeYBwyAfth+ia0K/YDgygOY+n1yKid6QD\nlEOaDSENcdONZlYO/zAHDu6vQR/zsAPyztRCp0TSOCxQcQV2xSFkSvUSF8g2\noNI8RETgpLIlbKE8sS3F4v5OcxSa6wkhgngqRL6ZmqYqTPzgsAXlguA/Tq48\nNwRUQZBeP/TnMvnhhaZeww5qgxMNKWAMIjv7RUvMoP+YMMwSpgIKD3QYOhFK\nZLfYnxhiS/1jtJ+GTVdPLr5MNjLnNAc195aBT7OGi2frIsr7Qhz6TdMQnh0b\n39ohs+qaacQFbPS8qyVbhsM=\r\n=0nGP\r\n-----END PGP SIGNATURE-----\r\n"
-  //   });
-  //   regServer.write({
-  //     "version": "1",
-  //     "currency": "beta_brousouf",
-  //     "from": "C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-  //     "to": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-  //     "keyID": "E9CAB76D19A8651E",
-  //     "forward": "ALL",
-  //     "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJThMLbCRAIe6NRwK623wAA3GMIAIvzPBWfTZfR27vJM0v+\nU5Tv1ro8G2zrBGaTG+qe5ZXNxjgtKjtx6v1XY3zDo8s8IEAoTt09mp5M+Iz9\nPQ1eD3ThPF5Eulc+ZfN8Gqahwqro0gU0YJ6VetXdTsULNm9FJOEy3xToTcvu\nR9bmRNwrIoBRLVECRl5nRcgXCN2ETw7rejVlWSKQbNJKnh13cd65pJIYe4z6\nLDic65WyV5RL12H33F0yoEkL5Srq54iGsqtDjSKH4pCclKOc2tbmqQtS6DDQ\nggPOGrkNAbm3T7fii+UQfmT820gz938iYs/8x3kvQuWOYJgNdbfjbBi+qmg5\nZz3+PPOaiWzLKhdul/rFk5M=\r\n=alII\r\n-----END PGP SIGNATURE-----\r\n"
-  //   });
-  //   regServer.write({
-  //     "version": "1",
-  //     "currency": "beta_brousouf",
-  //     "status": "UP",
-  //     "keyID": "E9CAB76D19A8651E"
-  //   });
-  //   regServer.write({
-  //     "version": "1",
-  //     "currency": "beta_brousouf",
-  //     "fingerprint": "C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-  //     "requiredTrusts": 1,
-  //     "hosters": [
-  //       "2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-  //       "C73882B64B7E72237A2F460CE9CAB76D19A8651E"
-  //     ],
-  //     "trusts": [
-  //       "2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-  //       "C73882B64B7E72237A2F460CE9CAB76D19A8651E"
-  //     ],
-  //     "keyID": "E9CAB76D19A8651E",
-  //     "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQEcBAABCAAGBQJTltBaAAoJED0ZtAvOQO311hYH/RxCRmDbpGZ4OKsJ283MjHI1\nu1Teh/SDWuTjeGld8m76v7Yu61PA4vb4YzTldNvGg1sBoFKy2yH/UXTxTuM2WOJh\nVnzb1BhR4Nbl3+N4E7q/0JndTv+N34c4z3gltOJJQ1VtudYFEnzRxxJPsgc8OTTm\nWmwNUu8lUE3MEI3P10TXfKcU+WmATYj2+VtK6GHjKAqjY5Lnctz94nyHLr2M5+7E\nkJ/9CkXKulTG3qTpwFL3HsILQJO93CGXjDFrdbWcq+RIRbMXWnM4ibQf7lQ1TMKK\n7Z8rKWvyGn6sHkM34OcAPd2dORwtxuCTMLtcHFUp5lxXWkT/CZEGOh9XlcilVXc=\n=ylC/\n-----END PGP SIGNATURE-----\n",
-  //   });
-  // });
-  
-  // it('Registry should accept peerings', function (done) {
-  //   regServer.on('peer', function (peer) {
-  //     should.exist(peer);
-  //     done();
-  //   });
-  //   regServer.write({
-  //     "version": "1",
-  //     "currency": "beta_brousouf",
-  //     "fingerprint": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-  //     "keyID": "087BA351C0AEB6DF",
-  //     "endpoints": [
-  //       "BASIC_MERKLED_API 88.163.127.43 9101"
-  //     ],
-  //     "status": "UP",
-  //     "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJThMLbCRAIe6NRwK623wAA3GMIAIvzPBWfTZfR27vJM0v+\nU5Tv1ro8G2zrBGaTG+qe5ZXNxjgtKjtx6v1XY3zDo8s8IEAoTt09mp5M+Iz9\nPQ1eD3ThPF5Eulc+ZfN8Gqahwqro0gU0YJ6VetXdTsULNm9FJOEy3xToTcvu\nR9bmRNwrIoBRLVECRl5nRcgXCN2ETw7rejVlWSKQbNJKnh13cd65pJIYe4z6\nLDic65WyV5RL12H33F0yoEkL5Srq54iGsqtDjSKH4pCclKOc2tbmqQtS6DDQ\nggPOGrkNAbm3T7fii+UQfmT820gz938iYs/8x3kvQuWOYJgNdbfjbBi+qmg5\nZz3+PPOaiWzLKhdul/rFk5M=\r\n=alII\r\n-----END PGP SIGNATURE-----\r\n"
-  //   });
-  // });
-  
-  it('Registry should accept transactions', function (done) {
-    async.parallel([
-      until(regServer, 'pubkey'),
-      until(regServer, 'vote', 3),
-      until(regServer, 'transaction'),
-      until(regServer, 'voting'),
-      until(regServer, 'statement'),
-    ], done);
-    // regServer.write(pubkeyUbot1);
-    regServer.write(pubkeyCat);
-    regServer.write({
-      amendment: {
-        "version": 1,
-        "number": 0,
-        "generated": 1398895200,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": null,
-        "coinList": [],
-        "votersChanges": [
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ],
-        "membersChanges": [
-          "+2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-          "+C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-          "+D049002A6724D35F867F64CC087BA351C0AEB6DF"
-        ]
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    regServer.write({
-      "version": "1",
-      "currency": "beta_brousouf",
-      "type": "VOTING",
-      "issuer": "C73882B64B7E72237A2F460CE9CAB76D19A8651E",
-      "date": new Date(1398895200*1000),
-      "sigDate": new Date(1401209571*1000),
-      "amNumber": 0,
-      "amHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2",
-      "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQEcBAABCAAGBQJThMLjAAoJEAh7o1HArrbf3EMH/jB1W0RJahpQzf653zu79GOe\nSuolSa9LNe5dCmoAlQ5ilCcf6amQDrZ5JmY/8DC7q2IkNMaOaUQ/sQbtAbXjzBhI\nM3zDBiUzX6J9IZ+DjuMPR98AoCORG6+1SA/ed6Je6j/hmSVx/F14PD2NjId7My9H\ne5eg74RdziqmerDfA0AENPxRWc418ah+MZi8NdXHl6r/oPuQX2oucFuAawtKFEL5\n53yLcEI3iXRCfnx724O6D5oh2iD/09sfUFv7Mqd3EmUAB0VCDH6VhZ6QSDeDHmu4\nQhPoJVTtb4YzHeAHVQI7bpgboLpwWKEuXAQPvTHRt2LsB5Vmjl5f55WMldwo3BM=\n=qtq7\n-----END PGP SIGNATURE-----\n",
-    });
-    regServer.write({
-      amendment: {
-        "version": 1,
-        "number": 1,
-        "generated": 1398981600,
-        "nextVotes": 1,
-        "dividend": null,
-        "coinBase": null,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2",
-        "coinList": [],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    regServer.write({
-      amendment: {
-        "version": 1,
-        "number": 2,
-        "generated": 1399068000,
-        "nextVotes": 1,
-        "dividend": 100,
-        "coinBase": 0,
-        "votersCount": 1,
-        "membersCount": 3,
-        "currency": "beta_brousouf",
-        "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-        "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE",
-        "coinAlgo": "Base2Draft",
-        "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452",
-        "coinList": [
-          26,
-          7,
-          5,
-          3,
-          1
-        ],
-        "votersChanges": [],
-        "membersChanges": []
-      },
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "sigDate": new Date()
-    });
-    regServer.write({
-      "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n",
-      "version": 1,
-      "currency": "beta_brousouf",
-      "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "number": 0,
-      "previousHash": null,
-      "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "coins": [
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12",
-        "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14"
-      ],
-      "sigDate": new Date(),
-      "comment": "",
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-    });
-    regServer.write({
-      "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n",
-      "version": 1,
-      "currency": "beta_brousouf",
-      "amendmentNumber": 2,
-      "amendmentHash": "2694D9AEA40866A0D6F01C719607007ABC075E84",
-      "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" },
-      "date": new Date(),
-      "algorithm": "AnyKey",
-      "sigDate": new Date(),
-      "issuer": "D049002A6724D35F867F64CC087BA351C0AEB6DF",
-      "selfGenerated": true
-    });
-  });
-})
-
-function until (server, eventName, count) {
-  var counted = 0;
-  var max = count == undefined ? 1 : count;
-  return function (callback) {
-    server.on(eventName, function (obj) {
-      logger.trace('event = %s', eventName);
-      should.exist(obj);
-      counted++;
-      if (counted == max)
-        callback();
-    });
-  }
-}
diff --git a/test/medium/routing.js b/test/medium/routing.js
index f2659f49001b4e119a1fa216d9aaa4d82f359bbf..2dcb1b2d67d5d28474bccb9aaabeb350dd5ab26a 100644
--- a/test/medium/routing.js
+++ b/test/medium/routing.js
@@ -27,8 +27,8 @@ describe('In a unidirectional 2 servers network,', function () {
   var serverA, serverB;
 
   beforeEach(function (done) {
-    serverA = ucoin.createHDCServer({ name: 'hdcA', resetData: true });
-    serverB = ucoin.createHDCServer({ name: 'hdcB', resetData: true });
+    serverA = ucoin.createWOTServer({ name: 'hdcA', resetData: true });
+    serverB = ucoin.createWOTServer({ name: 'hdcB', resetData: true });
     serverA.pipe(serverB);
     resetServers(serverA, serverB)(done);
   });
@@ -60,8 +60,8 @@ describe('In a bidirectionnal 2 servers network,', function () {
   var serverA, serverB;
 
   beforeEach(function (done) {
-    serverA = ucoin.createHDCServer({ name: 'hdcC', resetData: true });
-    serverB = ucoin.createHDCServer({ name: 'hdcD', resetData: true });
+    serverA = ucoin.createWOTServer({ name: 'hdcC', resetData: true });
+    serverB = ucoin.createWOTServer({ name: 'hdcD', resetData: true });
     serverA.pipe(serverB);
     serverB.pipe(serverA);
     resetServers(serverA, serverB)(done);
@@ -96,11 +96,11 @@ describe('In an oriented 5 servers network,', function () {
 
   before(function (done) {
 
-    serverA = ucoin.createHDCServer({ name: 'test_A', resetData: true });
-    serverB = ucoin.createHDCServer({ name: 'test_B', resetData: true });
-    serverC = ucoin.createHDCServer({ name: 'test_C', resetData: true });
-    serverD = ucoin.createHDCServer({ name: 'test_D', resetData: true });
-    serverE = ucoin.createHDCServer({ name: 'test_E', resetData: true });
+    serverA = ucoin.createWOTServer({ name: 'test_A', resetData: true });
+    serverB = ucoin.createWOTServer({ name: 'test_B', resetData: true });
+    serverC = ucoin.createWOTServer({ name: 'test_C', resetData: true });
+    serverD = ucoin.createWOTServer({ name: 'test_D', resetData: true });
+    serverE = ucoin.createWOTServer({ name: 'test_E', resetData: true });
 
     serverA.pipe(serverB).pipe(serverA); // A ◀--▶ B
     serverB.pipe(serverC).pipe(serverB); // B ◀--▶ C
diff --git a/test/tool/test.js b/test/tool/test.js
index 4e2dc0cc88d8bbe35c76e85efa9e611ed65135dc..2c0369ec68484c34cd2ce2602d86b7f1e5c6e7a1 100644
--- a/test/tool/test.js
+++ b/test/tool/test.js
@@ -49,7 +49,6 @@ module.exports.tester = function (currency) {
   };
 
   var queueOfMsVt = ttlQueue(1000);
-  var queueOfVotes = ttlQueue(1000);
 
   this.create = function (params) {
     return new module.exports.HTTPTestCase(params.label, {
@@ -188,22 +187,6 @@ module.exports.tester = function (currency) {
     };
   };
 
-  this.setVoter = function (signatory) {
-    var Voting = mongoose.model('Voting');
-    return function (done) {
-      queueOfMsVt.push(function (cb) {
-        var ms = new Voting({ version: 1, currency: currency, issuer: signatory.fingerprint(), type: 'VOTING' });
-        var raw = ms.getRaw();
-        signatory.sign(raw, function (err, sig) {
-          post ('/registry/community/voters', {
-            'voting': raw,
-            'signature': sig
-          }, cb);
-        });
-      }, done);
-    };
-  };
-
   this.join = function (signatory) {
     var Membership = mongoose.model('Membership');
     return function (done) {
@@ -249,52 +232,6 @@ module.exports.tester = function (currency) {
     };
   };
 
-  this.selfVote = function (number) {
-    return function (done) {
-      queueOfVotes.push(function (cb) {
-        get ('/registry/amendment/'+ number + '/vote', cb);
-      }, done);
-    };
-  };
-
-  this.vote = function (signatory) {
-    return function (done) {
-      queueOfVotes.push(function (cb) {
-        async.waterfall([
-          function (next){
-            get ('/registry/amendment', next);
-          },
-          function (res, next){
-            var json = JSON.parse(res.text);
-            var sig = signatory.sign(json.raw);
-            post('/hdc/amendments/votes', {
-              'amendment': json.raw,
-              'signature': sig
-            }, next);
-          },
-        ], cb);
-      }, done);
-    };
-  };
-
-  this.voteCurrent = function (signatory) {
-    return function (done) {
-      async.waterfall([
-        function (next){
-          get ('/hdc/amendments/current', next);
-        },
-        function (res, next){
-          var json = JSON.parse(res.text);
-          var sig = signatory.sign(json.raw);
-          post('/hdc/amendments/votes', {
-            'amendment': json.raw,
-            'signature': sig
-          }, next);
-        },
-      ], done);
-    };
-  };
-
   this.app = function (appToSet) {
     app = appToSet;
   };
@@ -427,9 +364,6 @@ function isAmendment (json) {
     "currency",
     "generated",
     "number",
-    "votersRoot",
-    "votersCount",
-    "votersChanges",
     "membersRoot",
     "membersCount",
     "membersChanges",
@@ -461,7 +395,6 @@ function isAmendment (json) {
     json.coinList.length.should.not.be.below(1);
   }
   json.membersCount.should.be.a.Number.and.not.be.below(0);
-  json.votersCount.should.be.a.Number.and.not.be.below(0);
   // Strings
   json.currency.should.be.a.String.and.not.be.empty;
   if (json.previousHash) {
@@ -472,19 +405,10 @@ function isAmendment (json) {
   } else {
     json.membersRoot.should.be.a.String.and.be.empty;
   }
-  if (json.votersCount > 0) {
-    json.votersRoot.should.be.a.String.and.match(/^[A-Z0-9]{40}$/);
-  } else {
-    json.votersRoot.should.be.a.String.and.be.empty;
-  }
   json.membersChanges.should.be.an.Array;
   json.membersChanges.forEach(function(change){
     change.should.match(/^(\+|-)[A-Z0-9]{40}$/);
   });
-  json.votersChanges.should.be.an.Array;
-  json.votersChanges.forEach(function(change){
-    change.should.match(/^(\+|-)[A-Z0-9]{40}$/);
-  });
 }
 
 function isTransaction (json) {
diff --git a/txserver.js b/txserver.js
new file mode 100644
index 0000000000000000000000000000000000000000..492031df37e390b8468b881f49a0795db1e41401
--- /dev/null
+++ b/txserver.js
@@ -0,0 +1,78 @@
+var async   = require('async');
+var util    = require('util');
+var parsers = require('./app/lib/streams/parsers/doc');
+var PKSServer  = require('./pksserver');
+
+function HDCServer (dbConf, overrideConf, interceptors, onInit) {
+
+  var logger  = require('./app/lib/logger')(dbConf.name);
+
+  var selfInterceptors = [
+    {
+      // Transaction
+      matches: function (obj) {
+        return obj.recipient ? true : false;
+      },
+      treatment: function (server, obj, next) {
+        async.waterfall([
+          function (next){
+            server.TransactionsService.processTx(obj, next);
+          },
+          function (tx, next){
+            server.emit('transaction', tx);
+            next(null, tx);
+          },
+        ], next);
+      }
+    }
+  ];
+
+  PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []);
+
+  var that = this;
+
+  this._read = function (size) {
+  };
+
+  this._initServices = function(conn, done) {
+    this.KeyService         = require('./app/service/KeyService').get(conn);
+    this.PublicKeyService   = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
+    this.ContractService    = require('./app/service/ContractService').get(conn, that.conf);
+    this.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService);
+    async.parallel({
+      contract: function(callback){
+        that.ContractService.load(callback);
+      },
+      peering: function(callback){
+        callback();
+      },
+    }, function (err) {
+      done(err);
+    });
+  };
+
+  this._listenBMA = function (app) {
+    this.listenPKS(app);
+    this.listenHDC(app);
+  };
+
+  this.listenHDC = function (app) {
+    var hdc = require('./app/controllers/hdc')(that);
+    app.get(    '/contract/amendments/promoted/:am_number',       hdc.amendments.promotedNumber);
+    app.post(   '/tx/transactions/process',                       hdc.transactions.processTx);
+    app.get(    '/tx/transactions/last/:count',                   hdc.transactions.lastNAll);
+    app.get(    '/tx/transactions/sender/:fpr',                   hdc.transactions.sender.get);
+    app.get(    '/tx/transactions/sender/:fpr/view/:number',      hdc.transactions.viewtx);
+    app.get(    '/tx/transactions/sender/:fpr/last/:count',       hdc.transactions.sender.lastNofSender);
+    app.get(    '/tx/transactions/sender/:fpr/last/:count/:from', hdc.transactions.sender.lastNofSender);
+    app.get(    '/tx/transactions/recipient/:fpr',                hdc.transactions.recipient);
+    app.get(    '/tx/transactions/refering/:fpr/:number',         hdc.transactions.refering);
+    app.get(    '/tx/coins/list/:fpr',                            hdc.coins.list);
+    app.get(    '/tx/coins/view/:coin_id/owner',                  hdc.coins.view);
+    app.get(    '/tx/coins/view/:coin_id/history',                hdc.coins.history);
+  };
+}
+
+util.inherits(HDCServer, PKSServer);
+
+module.exports = HDCServer;
diff --git a/wotserver.js b/wotserver.js
new file mode 100644
index 0000000000000000000000000000000000000000..2723f56c969af3c2e746e6aabb49b516b3ffa311
--- /dev/null
+++ b/wotserver.js
@@ -0,0 +1,84 @@
+var async   = require('async');
+var util    = require('util');
+var parsers = require('./app/lib/streams/parsers/doc');
+var PKSServer  = require('./pksserver');
+
+function WOTServer (dbConf, overrideConf, interceptors, onInit) {
+
+  var logger  = require('./app/lib/logger')(dbConf.name);
+
+  var selfInterceptors = [
+    {
+      // Membership
+      matches: function (obj) {
+        return obj.userid ? true : false;
+      },
+      treatment: function (server, obj, next) {
+        async.waterfall([
+          function (next){
+            that.KeychainService.submit(obj, next);
+          },
+          function (membership, next){
+            that.emit('membership', membership);
+            next(null, membership);
+          },
+        ], next);
+      }
+    },{
+      // Transaction
+      matches: function (obj) {
+        return obj.recipient ? true : false;
+      },
+      treatment: function (server, obj, next) {
+        async.waterfall([
+          function (next){
+            server.TransactionsService.processTx(obj, next);
+          },
+          function (tx, next){
+            server.emit('transaction', tx);
+            next(null, tx);
+          },
+        ], next);
+      }
+    }
+  ];
+
+  PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []);
+
+  var that = this;
+
+  this._read = function (size) {
+  };
+
+  this._initServices = function(conn, done) {
+    this.KeyService         = require('./app/service/KeyService').get(conn);
+    this.PublicKeyService   = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService);
+    this.KeychainService    = require('./app/service/KeychainService').get(conn, that.conf);
+    async.parallel({
+      contract: function(callback){
+        that.KeychainService.load(callback);
+      },
+      peering: function(callback){
+        callback();
+      },
+    }, function (err) {
+      done(err);
+    });
+  };
+
+  this._listenBMA = function (app) {
+    this.listenPKS(app);
+    this.listenWOT(app);
+  };
+
+  this.listenWOT = function (app) {
+    var keychain = require('./app/controllers/keychain')(that);
+    app.post(   '/keychain/membership',       keychain.parseMembership);
+    app.post(   '/keychain/keyblock',         keychain.parseKeyblock);
+    app.get(    '/keychain/current',          keychain.current);
+  };
+}
+
+util.inherits(WOTServer, PKSServer);
+
+module.exports = WOTServer;