diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/PeerDao.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/PeerDao.java
index d12e7013bfc9817767d328385cbe45eae875d188..810727218960574e25b826a11781551f29b29526 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/PeerDao.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/PeerDao.java
@@ -47,15 +47,15 @@ public interface PeerDao extends EntityDao<String, Peer> {
      * @param pubkeys
      * @return
      */
-    List<Peer> getPeersByCurrencyIdAndApiAndPubkeys(String currencyId, String endpointApi, String[] pubkeys);
+    List<Peer> getPeersByCurrencyIdAndApiAndPubkeys(String currencyId, String endpointApi, String[] includePubkeys);
 
     /**
-     * Get peers as BMA /network/peers format
+     * Get all UP peers
      * @param currencyId
      * @param pubkeys use to filter on specific pubkeys. If null, not filtering
      * @return
      */
-    List<NetworkPeers.Peer> getBmaPeersByCurrencyId(String currencyId, String[] pubkeys);
+    List<Peer> getUpPeersByCurrencyId(String currencyId, String[] includePubkeys);
 
     /**
      * Get WS2p heads as BMA /network/ws2p/head format
@@ -63,7 +63,7 @@ public interface PeerDao extends EntityDao<String, Peer> {
      * @param pubkeys use to filter on specific pubkeys. If null, not filtering
      * @return
      */
-    List<NetworkWs2pHeads.Head> getWs2pPeersByCurrencyId(String currencyId, String[] pubkeys);
+    List<NetworkWs2pHeads.Head> getWs2pPeersByCurrencyId(String currencyId, String[] includePubkeys);
 
     boolean isExists(String currencyId, String peerId);
 
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java
index 44cd11b4c4f7a6978472789797ef3ef75ca6f999..0234378ea81f221d76a3c20d453a3d2207de78c9 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java
@@ -116,10 +116,13 @@ public class MemoryPeerDaoImpl implements PeerDao {
     }
 
     @Override
-    public List<NetworkPeers.Peer> getBmaPeersByCurrencyId(String currencyId, String[] pubkeys) {
+    public List<Peer> getUpPeersByCurrencyId(String currencyId, String[] pubkeys) {
         Preconditions.checkNotNull(currencyId);
 
-        return Peers.toBmaPeers(getPeersByCurrencyIdAndApiAndPubkeys(currencyId, null, pubkeys));
+        return getPeersByCurrencyIdAndApiAndPubkeys(currencyId, null, pubkeys)
+                .stream()
+                .filter(Peers::isReacheable)
+                .collect(Collectors.toList());
     }
 
     @Override
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java
index afb43fc57f4e6f0bf167b349841b918510d58ba7..6ca031f8267792c5471460cd3bfa3cccd6063864 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java
@@ -37,11 +37,10 @@ public class NetworkPeering implements Serializable {
     private String block;
     private String signature;
     private String status;
+    private String pubkey;
 
     private String raw;
 
-    private String pubkey;
-
     public Endpoint[] endpoints;
 
     public String getVersion() {
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java
index c7e4455c63b86aa7f638081fdbecdcb31d6bbca0..b91b546c86ffd611dc6641c611d9e2be2633bbf2 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java
@@ -43,76 +43,9 @@ public class NetworkPeers implements Serializable {
         return s;
     }
 
-    public static class Peer implements Serializable {
-        public String version;
-        public String currency;
-        public String status;
-        public Long statusTS;
-        public String block;
-        public String signature;
-        public String pubkey;
+    public static class Peer extends NetworkPeering implements Serializable {
         public Long firstDown;
         public Long lastTry;
-        public String raw;
-        public NetworkPeering.Endpoint[] endpoints;
-
-        public String getVersion() {
-            return version;
-        }
-
-        public void setVersion(String version) {
-            this.version = version;
-        }
-
-        public String getCurrency() {
-            return currency;
-        }
-
-        public void setCurrency(String currency) {
-            this.currency = currency;
-        }
-
-        public String getStatus() {
-            return status;
-        }
-
-        public void setStatus(String status) {
-            this.status = status;
-        }
-
-        @JsonGetter("statusTS")
-        public Long getStatusTS() {
-            return statusTS;
-        }
-
-        @JsonSetter("statusTS")
-        public void setStatusTS(Long statusTS) {
-            this.statusTS = statusTS;
-        }
-
-        public String getBlock() {
-            return block;
-        }
-
-        public void setBlock(String block) {
-            this.block = block;
-        }
-
-        public String getSignature() {
-            return signature;
-        }
-
-        public void setSignature(String signature) {
-            this.signature = signature;
-        }
-
-        public String getPubkey() {
-            return pubkey;
-        }
-
-        public void setPubkey(String pubkey) {
-            this.pubkey = pubkey;
-        }
 
         @JsonGetter("first_down")
         public Long getFirstDown() {
@@ -142,22 +75,13 @@ public class NetworkPeers implements Serializable {
             this.endpoints = endpoints;
         }
 
-        @JsonIgnore
-        public String getRaw() {
-            return raw;
-        }
-
-        public void setRaw(String raw) {
-            this.raw = raw;
-        }
-
         @Override
         public String toString() {
-            String s = "version=" + version + "\n" +
-                    "currency=" + currency + "\n" +
-                    "pubkey=" + pubkey + "\n" +
-                    "status=" + status + "\n" +
-                    "block=" + block + "\n";
+            String s = "version=" + getVersion() + "\n" +
+                    "currency=" + getCurrency() + "\n" +
+                    "pubkey=" + getPubkey() + "\n" +
+                    "status=" + getStatus() + "\n" +
+                    "block=" + getBlock() + "\n";
             for(NetworkPeering.Endpoint endpoint: endpoints) {
                 if (endpoint != null) {
                     s += endpoint.toString() + "\n";
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peer.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peer.java
index 29125edd43837b2dd53859311ced47005b704324..c00902e7210f563b4081a4ebd20121156c0a52b4 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peer.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peer.java
@@ -154,15 +154,15 @@ public class Peer implements LocalEntity<String>, Serializable {
             return this;
         }
 
-        public Builder setPeering(NetworkPeers.Peer remotePeer) {
+        public Builder setPeering(NetworkPeering remotePeering) {
             this.peering = this.peering != null ? this.peering : new Peering();
 
-            this.peering.setVersion(remotePeer.getVersion());
-            this.peering.setSignature(remotePeer.getSignature());
+            this.peering.setVersion(remotePeering.getVersion());
+            this.peering.setSignature(remotePeering.getSignature());
 
             // Block number+hash
-            if (remotePeer.getBlock() != null) {
-                String[] blockParts = remotePeer.getBlock().split("-");
+            if (remotePeering.getBlock() != null) {
+                String[] blockParts = remotePeering.getBlock().split("-");
                 if (blockParts.length == 2) {
                     this.peering.setBlockNumber(Integer.parseInt(blockParts[0]));
                     this.peering.setBlockHash(blockParts[1]);
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peers.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peers.java
index deb2d801dde378bd46434d7a788f21382fd933b4..a30b8636444bcf3a37e330e77dca4eded63430c8 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peers.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/local/Peers.java
@@ -26,6 +26,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.duniter.core.client.model.bma.*;
 import org.duniter.core.util.CollectionUtils;
+import org.duniter.core.util.Preconditions;
 import org.duniter.core.util.StringUtils;
 
 import java.util.List;
@@ -112,10 +113,6 @@ public final class Peers {
                 result.setSignature(null);
             }
 
-            // Default values (not stored yet)
-            // TODO check if still used by clients
-            result.setStatusTS(0L);
-
             // Compute status (=UP is at least one endpoint is UP)
             String status = endpoints.stream()
                     .map(Peers::getStatus)
@@ -190,4 +187,50 @@ public final class Peers {
         bmaEp.setPath(ep.getPath());
         return bmaEp;
     }
+
+    public static Peer setPeeringAndStats(Peer peer, NetworkPeering peeringDocument)  {
+        Preconditions.checkNotNull(peer);
+        Preconditions.checkNotNull(peeringDocument);
+
+        Peer.Stats stats = peer.getStats() != null ? peer.getStats() : new Peer.Stats();
+        Peer.Peering peering = (peer.getPeering() != null) ? peer.getPeering() : new Peer.Peering();
+
+        // Copy some fields
+        peer.setPubkey(peeringDocument.getPubkey());
+        peer.setCurrency(peeringDocument.getCurrency());
+
+        peering.setVersion(peeringDocument.getVersion());
+        peering.setSignature(peeringDocument.getSignature());
+
+        // Copy block infos
+        String blockstamp = peeringDocument.getBlock();
+        if (StringUtils.isNotBlank(blockstamp)) {
+            String[] blockParts = blockstamp.split("-");
+            if (blockParts.length == 2) {
+                int blockNumber = Integer.parseInt(blockParts[0]);
+                String blockHash = blockParts[1];
+
+                // Fill peering block
+                peering.setBlockNumber(blockNumber);
+                peering.setBlockHash(blockHash);
+
+                // use peering block as default stats (if empty)
+                if (stats.getBlockNumber() == null) {
+                    stats.setBlockNumber(blockNumber);
+                    stats.setBlockHash(blockHash);
+                }
+            }
+        }
+
+        // Update peer status UP/DOWN
+        if ("UP".equalsIgnoreCase(peeringDocument.getStatus())) {
+            stats.setStatus(Peer.PeerStatus.UP);
+            stats.setLastUpTime((long)Math.round(System.currentTimeMillis() / 1000));
+        }
+        else {
+            stats.setStatus(Peer.PeerStatus.DOWN);
+        }
+
+        return peer;
+    }
 }
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/service/bma/NetworkRemoteServiceImpl.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/service/bma/NetworkRemoteServiceImpl.java
index a1a62bcd518bbeff3df1d4f3b7200ce86b706a9c..069388faf71664fe5582f8c68bc68d93e9fa7b32 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/service/bma/NetworkRemoteServiceImpl.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/service/bma/NetworkRemoteServiceImpl.java
@@ -37,7 +37,6 @@ import org.duniter.core.client.config.Configuration;
 import org.duniter.core.client.model.bma.*;
 import org.duniter.core.client.model.bma.jackson.JacksonUtils;
 import org.duniter.core.client.model.local.Peer;
-import org.duniter.core.client.service.ServiceLocator;
 import org.duniter.core.exception.TechnicalException;
 import org.duniter.core.util.Preconditions;
 import org.duniter.core.util.websocket.WebsocketClientEndpoint;
@@ -135,7 +134,7 @@ public class NetworkRemoteServiceImpl extends BaseRemoteServiceImpl implements N
         NetworkPeers remoteResult = httpService.executeRequest(peer, URL_PEERS, NetworkPeers.class, config.getNetworkLargerTimeout());
 
         for (NetworkPeers.Peer remotePeer: remoteResult.peers) {
-            boolean match = (status == null || status.equalsIgnoreCase(remotePeer.status))
+            boolean match = (status == null || status.equalsIgnoreCase(remotePeer.getStatus()))
                     && (currentBlockNumber == null || currentBlockNumber.equals(parseBlockNumber(remotePeer)))
                     && (currentBlockHash == null || currentBlockHash.equals(parseBlockHash(remotePeer)));
 
@@ -244,15 +243,15 @@ public class NetworkRemoteServiceImpl extends BaseRemoteServiceImpl implements N
     protected Integer parseBlockNumber(NetworkPeers.Peer remotePeer) {
         Preconditions.checkNotNull(remotePeer);
 
-        if (remotePeer.block == null) {
+        if (remotePeer.getBlock() == null) {
             return null;
         }
-        int index = remotePeer.block.indexOf("-");
+        int index = remotePeer.getBlock().indexOf("-");
         if (index == -1) {
             return null;
         }
 
-        String str = remotePeer.block.substring(0, index);
+        String str = remotePeer.getBlock().substring(0, index);
         try {
             return Integer.parseInt(str);
         } catch(NumberFormatException e) {
@@ -263,15 +262,15 @@ public class NetworkRemoteServiceImpl extends BaseRemoteServiceImpl implements N
     protected String parseBlockHash(NetworkPeers.Peer remotePeer) {
         Preconditions.checkNotNull(remotePeer);
 
-        if (remotePeer.block == null) {
+        if (remotePeer.getBlock()== null) {
             return null;
         }
-        int index = remotePeer.block.indexOf("-");
+        int index = remotePeer.getBlock().indexOf("-");
         if (index == -1) {
             return null;
         }
 
-        String hash = remotePeer.block.substring(index+1);
+        String hash = remotePeer.getBlock().substring(index+1);
         return hash;
     }