diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index 8479e9f446db5174743c4a6ab1ce94a420f1583c..8e5ca1b8343ed4bb04638cc3abb696bcded9a7de 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -22,6 +22,7 @@ type Peer interface {
 	Host() []byte
 	Port() uint16
 	Version() string
+	PingTime() string
 	Connected() *int32
 }
 
diff --git a/ethpub/pub.go b/ethpub/pub.go
index 6d4c230add9dacfb0a389a8b6967c4ad8b3bc76d..e00bd0dbefc7d4f6a8a2a40ad38e3ed2520d0ba5 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -56,6 +56,7 @@ func (lib *PEthereum) GetPeers() []PPeer {
 	var peers []PPeer
 	for peer := lib.manager.Peers().Front(); peer != nil; peer = peer.Next() {
 		p := peer.Value.(ethchain.Peer)
+		// we only want connected peers
 		if atomic.LoadInt32(p.Connected()) != 0 {
 			peers = append(peers, *NewPPeer(p))
 		}
diff --git a/ethpub/types.go b/ethpub/types.go
index 1079f09b4fb4f010ba71411638b941125da15c06..4967eda492de56e31fc5c5ddf67984090cb0f132 100644
--- a/ethpub/types.go
+++ b/ethpub/types.go
@@ -20,6 +20,7 @@ type PPeer struct {
 	Port         int    `json:"port"`
 	Version      string `json:"version"`
 	LastResponse string `json:"lastResponse"`
+	Latency      string `json:"latency"`
 }
 
 func NewPPeer(peer ethchain.Peer) *PPeer {
@@ -34,7 +35,7 @@ func NewPPeer(peer ethchain.Peer) *PPeer {
 	}
 	ipAddress := strings.Join(ip, ".")
 
-	return &PPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port())}
+	return &PPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime()}
 }
 
 // Block interface exposed to QML
diff --git a/peer.go b/peer.go
index 71ad914614b7eac67d025c9feb9c694750a68dea..eed5bec30850de6d4fec907910a10d028ed41f07 100644
--- a/peer.go
+++ b/peer.go
@@ -130,6 +130,10 @@ type Peer struct {
 	blocksRequested int
 
 	version string
+
+	// We use this to give some kind of pingtime to a node, not very accurate, could be improved.
+	pingTime      time.Duration
+	pingStartTime time.Time
 }
 
 func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer {
@@ -185,6 +189,9 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
 }
 
 // Getters
+func (p *Peer) PingTime() string {
+	return p.pingTime.String()
+}
 func (p *Peer) Inbound() bool {
 	return p.inbound
 }
@@ -246,7 +253,7 @@ func (p *Peer) writeMessage(msg *ethwire.Msg) {
 // Outbound message handler. Outbound messages are handled here
 func (p *Peer) HandleOutbound() {
 	// The ping timer. Makes sure that every 2 minutes a ping is send to the peer
-	pingTimer := time.NewTicker(2 * time.Minute)
+	pingTimer := time.NewTicker(30 * time.Second)
 	serviceTimer := time.NewTicker(5 * time.Minute)
 
 out:
@@ -255,12 +262,12 @@ out:
 		// Main message queue. All outbound messages are processed through here
 		case msg := <-p.outputQueue:
 			p.writeMessage(msg)
-
 			p.lastSend = time.Now()
 
 		// Ping timer sends a ping to the peer each 2 minutes
 		case <-pingTimer.C:
 			p.writeMessage(ethwire.NewMessage(ethwire.MsgPingTy, ""))
+			p.pingStartTime = time.Now()
 
 		// Service timer takes care of peer broadcasting, transaction
 		// posting or block posting
@@ -290,8 +297,8 @@ clean:
 
 // Inbound handler. Inbound messages are received here and passed to the appropriate methods
 func (p *Peer) HandleInbound() {
-
 	for atomic.LoadInt32(&p.disconnect) == 0 {
+
 		// HMM?
 		time.Sleep(500 * time.Millisecond)
 		// Wait for a message from the peer
@@ -319,6 +326,7 @@ func (p *Peer) HandleInbound() {
 				// last pong so the peer handler knows this peer is still
 				// active.
 				p.lastPong = time.Now().Unix()
+				p.pingTime = time.Now().Sub(p.pingStartTime)
 			case ethwire.MsgBlockTy:
 				// Get all blocks and process them
 				var block, lastBlock *ethchain.Block
@@ -531,11 +539,15 @@ func (p *Peer) Start() {
 		return
 	}
 
-	// Run the outbound handler in a new goroutine
 	go p.HandleOutbound()
 	// Run the inbound handler in a new goroutine
 	go p.HandleInbound()
 
+	// Wait a few seconds for startup and then ask for an initial ping
+	time.Sleep(2 * time.Second)
+	p.writeMessage(ethwire.NewMessage(ethwire.MsgPingTy, ""))
+	p.pingStartTime = time.Now()
+
 }
 
 func (p *Peer) Stop() {