diff --git a/ethereum.go b/ethereum.go
index fdfb59b09f71dac5530c5dccf2ebf50ebf1aa86d..729f819266e5c51b32976f2380b378915615f540 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -2,9 +2,11 @@ package eth
 
 import (
 	"container/list"
+	"encoding/json"
 	"fmt"
 	"math/rand"
 	"net"
+	"path"
 	"strconv"
 	"strings"
 	"sync"
@@ -31,9 +33,7 @@ var ethlogger = ethlog.NewLogger("SERV")
 func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) {
 	// Loop thru the peers and close them (if we had them)
 	for e := peers.Front(); e != nil; e = e.Next() {
-		if peer, ok := e.Value.(*Peer); ok {
-			callback(peer, e)
-		}
+		callback(e.Value.(*Peer), e)
 	}
 }
 
@@ -399,47 +399,57 @@ func (s *Ethereum) Start(seed bool) {
 }
 
 func (s *Ethereum) Seed() {
-	ethlogger.Debugln("Retrieving seed nodes")
-
-	// Eth-Go Bootstrapping
-	ips, er := net.LookupIP("seed.bysh.me")
-	if er == nil {
-		peers := []string{}
+	var ips []string
+	data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"))
+	json.Unmarshal([]byte(data), &ips)
+	if len(ips) > 0 {
 		for _, ip := range ips {
-			node := fmt.Sprintf("%s:%d", ip.String(), 30303)
-			ethlogger.Debugln("Found DNS Go Peer:", node)
-			peers = append(peers, node)
+			ethlogger.Infoln("Connecting to previous peer ", ip)
+			s.ConnectToPeer(ip)
+		}
+	} else {
+		ethlogger.Debugln("Retrieving seed nodes")
+
+		// Eth-Go Bootstrapping
+		ips, er := net.LookupIP("seed.bysh.me")
+		if er == nil {
+			peers := []string{}
+			for _, ip := range ips {
+				node := fmt.Sprintf("%s:%d", ip.String(), 30303)
+				ethlogger.Debugln("Found DNS Go Peer:", node)
+				peers = append(peers, node)
+			}
+			s.ProcessPeerList(peers)
 		}
-		s.ProcessPeerList(peers)
-	}
 
-	// Official DNS Bootstrapping
-	_, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org")
-	if err == nil {
-		peers := []string{}
-		// Iterate SRV nodes
-		for _, n := range nodes {
-			target := n.Target
-			port := strconv.Itoa(int(n.Port))
-			// Resolve target to ip (Go returns list, so may resolve to multiple ips?)
-			addr, err := net.LookupHost(target)
-			if err == nil {
-				for _, a := range addr {
-					// Build string out of SRV port and Resolved IP
-					peer := net.JoinHostPort(a, port)
-					ethlogger.Debugln("Found DNS Bootstrap Peer:", peer)
-					peers = append(peers, peer)
+		// Official DNS Bootstrapping
+		_, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org")
+		if err == nil {
+			peers := []string{}
+			// Iterate SRV nodes
+			for _, n := range nodes {
+				target := n.Target
+				port := strconv.Itoa(int(n.Port))
+				// Resolve target to ip (Go returns list, so may resolve to multiple ips?)
+				addr, err := net.LookupHost(target)
+				if err == nil {
+					for _, a := range addr {
+						// Build string out of SRV port and Resolved IP
+						peer := net.JoinHostPort(a, port)
+						ethlogger.Debugln("Found DNS Bootstrap Peer:", peer)
+						peers = append(peers, peer)
+					}
+				} else {
+					ethlogger.Debugln("Couldn't resolve :", target)
 				}
-			} else {
-				ethlogger.Debugln("Couldn't resolve :", target)
 			}
+			// Connect to Peer list
+			s.ProcessPeerList(peers)
 		}
-		// Connect to Peer list
-		s.ProcessPeerList(peers)
-	}
 
-	// XXX tmp
-	s.ConnectToPeer(seedNodeAddress)
+		// XXX tmp
+		s.ConnectToPeer(seedNodeAddress)
+	}
 }
 
 func (s *Ethereum) peerHandler(listener net.Listener) {
@@ -459,6 +469,13 @@ func (s *Ethereum) Stop() {
 	// Close the database
 	defer s.db.Close()
 
+	var ips []string
+	eachPeer(s.peers, func(p *Peer, e *list.Element) {
+		ips = append(ips, p.conn.RemoteAddr().String())
+	})
+	d, _ := json.MarshalIndent(ips, "", "    ")
+	ethutil.WriteFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"), d)
+
 	eachPeer(s.peers, func(p *Peer, e *list.Element) {
 		p.Stop()
 	})
diff --git a/peer.go b/peer.go
index 69aa4b6685d3fa87ff7933bf9f70c5dd20a236be..6289535357ba0cc68439cb19cc6c30fba96b5eaf 100644
--- a/peer.go
+++ b/peer.go
@@ -680,7 +680,7 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
 	var (
 		p2pVersion = c.Get(0).Uint()
 		clientId   = c.Get(1).Str()
-		caps       = c.Get(2).Raw()
+		caps       = c.Get(2)
 		port       = c.Get(3).Uint()
 		pub        = c.Get(4).Bytes()
 	)
@@ -734,11 +734,17 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
 	p.ethereum.PushPeer(p)
 	p.ethereum.reactor.Post("peerList", p.ethereum.Peers())
 
-	ethlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, caps)
+	ethlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, caps.Raw())
 
 	peerlogger.Debugln(p)
 
-	p.pushStatus()
+	capsIt := caps.NewIterator()
+	for capsIt.Next() {
+		switch capsIt.Value().Str() {
+		case "eth":
+			p.pushStatus()
+		}
+	}
 }
 
 func (p *Peer) String() string {