diff --git a/www/js/controllers/network-controllers.js b/www/js/controllers/network-controllers.js
index 0f8d34061048341018f48ca2caa974902dadac70..c25b2c1ab0f051c56857b3fd6785a3ba03b8a478 100644
--- a/www/js/controllers/network-controllers.js
+++ b/www/js/controllers/network-controllers.js
@@ -63,7 +63,12 @@ function NetworkLookupController($scope, $timeout, $state, $ionicPopover, BMA, U
   $scope.load = function() {
 
     if ($scope.search.loading){
-      csNetwork.start($scope.node, {filter: $scope.search.type});
+      csNetwork.start($scope.node, {
+        filter: {
+          member: ($scope.search.type === 'member'),
+          mirror: ($scope.search.type === 'mirror')
+        }
+      });
 
       // Catch event on new peers
       var refreshing = false;
diff --git a/www/js/entities/peer.js b/www/js/entities/peer.js
index b4255f0aa83bccee623512dab0ec55925d3d8771..7e898a580d3569d323c142346e9025400ffdc832 100644
--- a/www/js/entities/peer.js
+++ b/www/js/entities/peer.js
@@ -57,6 +57,14 @@ function Peer(json) {
     return bma || {};
   };
 
+  that.getEndpoints = function(regex) {
+    if (!regex) return that.endpoints;
+    return that.endpoints.reduce(function(res, ep){
+      if (ep.match(regex)) return res.concat(ep);
+      return res;
+    }, []);
+  };
+
   that.getDns = function() {
     var bma = that.getBMA();
     return bma.dns ? bma.dns : null;
diff --git a/www/js/services/network-services.js b/www/js/services/network-services.js
index 6b2f3cc10bce471844b058d3d6941c83d185211d..b57840656eb5255737839c16a9201218056cde62 100644
--- a/www/js/services/network-services.js
+++ b/www/js/services/network-services.js
@@ -12,26 +12,34 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
 
       data = {
         bma: null,
+        loading: true,
         peers: [],
-        filter: null,
+        filter: {
+          member: true,
+          mirror: true,
+          endpointRegex: null
+        },
         knownBlocks: [],
         knownPeers: {},
         mainBuid: null,
         uidsByPubkeys: null,
-        updatingPeers: true,
         searchingPeersOnNetwork: false
       },
 
       resetData = function() {
         data.bma = null;
         data.peers = [];
-        data.filter = null;
+        data.filter = {
+          member: true,
+          mirror: true,
+          endpointRegex: null
+        };
         data.memberPeersCount = 0;
         data.knownBlocks = [];
         data.knownPeers = {};
         data.mainBuid = null;
         data.uidsByPubkeys = {};
-        data.updatingPeers = true;
+        data.loading = true;
         data.searchingPeersOnNetwork = false;
       },
 
@@ -49,7 +57,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
       },
 
       isBusy = function() {
-        return data.updatingPeers;
+        return data.loading;
       },
 
       getKnownBlocks = function() {
@@ -60,7 +68,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
         data.knownPeers = {};
         data.peers = [];
         data.searchingPeersOnNetwork = true;
-        data.updatingPeers = true;
+        data.loading = true;
 
         var newPeers = [];
 
@@ -73,8 +81,8 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
           if (newPeers.length) {
             flushNewPeersAndSort(newPeers);
           }
-          else if (data.updatingPeers && !data.searchingPeersOnNetwork) {
-            data.updatingPeers = false;
+          else if (data.loading && !data.searchingPeersOnNetwork) {
+            data.loading = false;
             $interval.cancel(interval);
             console.debug('[network] Finish : all peers found. Stopping new peers check.');
             // The peer lookup end, we can make a clean final report
@@ -104,15 +112,39 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
           });
       },
 
+      /**
+       * Apply filter on a peer. (peer uid should have been filled BEFORE)
+       */
+      applyPeerFilter = function(peer) {
+        // no filter
+        if (!data.filter) return true;
+
+        // Filter member and mirror
+        if ((data.filter.member && !peer.uid) ||
+            (data.filter.mirror && peer.uid)) {
+          return false;
+        }
+
+        // Filter on endpoints
+        if (data.filter.endpointRegex) {
+          var endpoints = peer.getEndpoints(data.filter.endpointRegex);
+          if (!endpoints.length) return false;
+        }
+
+        return true;
+      };
+
       addIfNewAndOnlinePeer = function(peer, list) {
         list = list || data.newPeers;
         if (!peer) return;
         peer = new Peer(peer);
         var server = peer.getServer();
+
         if (data.knownPeers[server]) return; // already processed: exit
+
         refreshPeer(peer)
-          .then(function() {
-            if (peer.online) list.push(peer);
+          .then(function(peer) {
+            if (peer && peer.online) list.push(peer);
           });
       },
 
@@ -122,12 +154,8 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
         peer.blockNumber = peer.block.replace(/-.+$/, '');
         peer.uid = data.uidsByPubkeys[peer.pubkey];
 
-        // filter
-        if (data.filter &&
-            ((data.filter === 'member' && !peer.uid) ||
-             (data.filter === 'mirror' && peer.uid))) {
-          return $q.when(peer);
-        }
+        // Apply filter
+        if (!applyPeerFilter(peer)) return $q.when();
 
         var node = new BMA.instance(peer.getHost(), peer.getPort(), false);
 
@@ -163,6 +191,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
             // Exit if offline, or not expert mode or too small device
             if (!peer.online || !csSettings.data.expertMode || UIUtils.screen.isSmall()) return peer;
             var jobs = [];
+
             // Get hardship (only for a member peer)
             if (peer.uid) {
               jobs.push(node.blockchain.stats.hardship({pubkey: peer.pubkey})
@@ -170,7 +199,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
                   peer.level = res && res.level;
                 })
                 .catch(function() {
-                  peer.level = null; // continue
+                  peer.level = '?'; // continue
                 }));
             }
 
@@ -180,7 +209,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
                 peer.version = res && res.duniter && res.duniter.version;
               })
               .catch(function() {
-                peer.version = null; // continue
+                peer.version = 'v?'; // continue
               }));
 
             $q.all(jobs);
@@ -229,9 +258,8 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
           return -score;
         });
         if (updateMainBuid) {
-          // TODO: raise a special event if changed ?
           data.mainBuid = mainBlock.buid;
-          //api.data.raise.changed(data); // raise event
+          api.data.raise.mainBlockChanged(data); // raise event
         }
         api.data.raise.changed(data); // raise event
       },
@@ -239,7 +267,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
       startListeningOnSocket = function() {
         // Listen for new block
         data.bma.websocket.block().on(function(block) {
-          if (data.updatingPeers) return;
+          if (data.loading) return;
           var uid = buid(block);
           if (data.knownBlocks.indexOf(uid) === -1) {
             console.debug('[network] Receiving block: ' + uid.substring(0, 20));
@@ -247,7 +275,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
             // If first block: do NOT refresh peers (will be done in start() method)
             var skipRefreshPeers = data.knownBlocks.length === 1;
             if (!skipRefreshPeers) {
-              data.updatingPeers = true;
+              data.loading = true;
               // We wait 2s when a new block is received, just to wait for network propagation
               $timeout(function() {
                 console.debug('[network] new block received by WS: will refresh peers');
@@ -258,27 +286,30 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
         });
         // Listen for new peer
         data.bma.websocket.peer().on(function(peer) {
-          if (!peer || data.updatingPeers) return;
+          if (!peer || data.loading) return;
           peer = new Peer(peer);
           var existingPeer = _.where(data.peers, {server: peer.getServer()});
           if (existingPeer && existingPeer.length == 1) {
             peer = existingPeer[0];
             existingPeer = true;
           }
-          refreshPeer(peer).then(function() {
-            if (data.updatingPeers) return; // skip if load has been started
 
-            if (existingPeer) {
-              if (!peer.online) {
-                data.peers.splice(data.peers.indexOf(peer), 1); // remove existing peers
+          refreshPeer(peer)
+            .then(function(peer) {
+              if (data.loading) return; // skip if full load is running
+
+              if (existingPeer) {
+                // remove existing peers, when reject or offline
+                if (!peer || !peer.online) {
+                  data.peers.splice(data.peers.indexOf(peer), 1);
+                }
+                sortPeers();
               }
-              sortPeers();
-            }
-            else if(peer.online) {
-              data.peers.push(peer);
-              sortPeers();
-            }
-          });
+              else if(peer.online) {
+                data.peers.push(peer);
+                sortPeers();
+              }
+            });
         });
       },
 
@@ -342,6 +373,7 @@ angular.module('cesium.network.services', ['ngResource', 'ngApi', 'cesium.bma.se
 
     // Register extension points
     api.registerEvent('data', 'changed');
+    api.registerEvent('data', 'mainBlockChanged');
     api.registerEvent('data', 'rollback');
 
     return {
diff --git a/www/templates/network/items_peers.html b/www/templates/network/items_peers.html
index 349bf69d12bf231ffd25dfdf0b0b44dd098bc872..b96e25109712040416ed9401fd4d01344baff8d0 100644
--- a/www/templates/network/items_peers.html
+++ b/www/templates/network/items_peers.html
@@ -15,8 +15,8 @@
       </div>
       <div class="col col-10 no-padding" ng-if="settings.expertMode">
         <h3 class="hidden-sm hidden-xs hidden-md">
-          <span ng-if="peer.level"><i class="ion-lock-combination"></i> {{peer.level}}</span>
-          <span ng-if="!peer.level" translate>PEER.MIRROR</span>
+          <span ng-if="peer.uid"><i class="ion-lock-combination"></i> {{peer.level}}</span>
+          <span ng-if="!peer.uid" translate>PEER.MIRROR</span>
         </h3>
         <h4 class="hidden-sm hidden-xs hidden-md gray">v{{peer.version}}</h4>
       </div>