diff --git a/ethchain/keypair.go b/ethchain/keypair.go
deleted file mode 100644
index 0f23bacdf8fecb8784bc96bc5df794ee9a1fd049..0000000000000000000000000000000000000000
--- a/ethchain/keypair.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package ethchain
-
-import (
-	"github.com/ethereum/eth-go/ethutil"
-	"github.com/obscuren/secp256k1-go"
-	"math/big"
-)
-
-type KeyPair struct {
-	PrivateKey []byte
-	PublicKey  []byte
-
-	// The associated account
-	account *StateObject
-	state   *State
-}
-
-func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) {
-	pubkey, err := secp256k1.GeneratePubKey(seckey)
-	if err != nil {
-		return nil, err
-	}
-
-	return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil
-}
-
-func NewKeyPairFromValue(val *ethutil.Value) *KeyPair {
-	keyPair := &KeyPair{PrivateKey: val.Get(0).Bytes(), PublicKey: val.Get(1).Bytes()}
-
-	return keyPair
-}
-
-func (k *KeyPair) Address() []byte {
-	return ethutil.Sha3Bin(k.PublicKey[1:])[12:]
-}
-
-func (k *KeyPair) Account() *StateObject {
-	if k.account == nil {
-		k.account = k.state.GetAccount(k.Address())
-	}
-
-	return k.account
-}
-
-// Create transaction, creates a new and signed transaction, ready for processing
-func (k *KeyPair) CreateTx(receiver []byte, value *big.Int, data []string) *Transaction {
-	/* TODO
-	tx := NewTransaction(receiver, value, data)
-	tx.Nonce = k.account.Nonce
-
-	// Sign the transaction with the private key in this key chain
-	tx.Sign(k.PrivateKey)
-
-	return tx
-	*/
-	return nil
-}
-
-func (k *KeyPair) RlpEncode() []byte {
-	return ethutil.EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode()
-}
-
-type KeyRing struct {
-	keys []*KeyPair
-}
-
-func (k *KeyRing) Add(pair *KeyPair) {
-	k.keys = append(k.keys, pair)
-}
-
-// The public "singleton" keyring
-var keyRing *KeyRing
-
-func GetKeyRing(state *State) *KeyRing {
-	if keyRing == nil {
-		keyRing = &KeyRing{}
-
-		data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
-		it := ethutil.NewValueFromBytes(data).NewIterator()
-		for it.Next() {
-			v := it.Value()
-			keyRing.Add(NewKeyPairFromValue(v))
-		}
-	}
-
-	return keyRing
-}
diff --git a/ethdb/database.go b/ethdb/database.go
index 3dbff36dea5ae7541086bcaf79180478305c60b8..09e9d8c7d7772d06ad3f35cea5d1a6a676e8a5fa 100644
--- a/ethdb/database.go
+++ b/ethdb/database.go
@@ -54,11 +54,13 @@ func (db *LDBDatabase) LastKnownTD() []byte {
 	return data
 }
 
+/*
 func (db *LDBDatabase) GetKeys() []*ethutil.Key {
 	data, _ := db.Get([]byte("KeyRing"))
 
 	return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
 }
+*/
 
 func (db *LDBDatabase) Close() {
 	// Close the leveldb database
diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go
index b0fa64ed78334b1ce3c1eea784e3513759f67137..1e9d2899ab58e4533469691f8044cb8ab36dfcea 100644
--- a/ethdb/memory_database.go
+++ b/ethdb/memory_database.go
@@ -26,11 +26,13 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) {
 	return db.db[string(key)], nil
 }
 
+/*
 func (db *MemDatabase) GetKeys() []*ethutil.Key {
 	data, _ := db.Get([]byte("KeyRing"))
 
 	return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
 }
+*/
 
 func (db *MemDatabase) Delete(key []byte) error {
 	delete(db.db, string(key))
diff --git a/ethpub/pub.go b/ethpub/pub.go
index 4d153636890bbd1e4ef75d4b89db0052db2a5166..daacb9d78232290e8dc87cd00249144028c8f0fd 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -39,10 +39,7 @@ func (lib *PEthereum) GetBlock(hexHash string) *PBlock {
 }
 
 func (lib *PEthereum) GetKey() *PKey {
-	keyPair, err := ethchain.NewKeyPairFromSec(ethutil.Config.Db.GetKeys()[0].PrivateKey)
-	if err != nil {
-		return nil
-	}
+	keyPair := ethutil.GetKeyRing().Get(0)
 
 	return NewPKey(keyPair)
 }
@@ -90,7 +87,7 @@ func (lib *PEthereum) IsContract(address string) bool {
 }
 
 func (lib *PEthereum) SecretToAddress(key string) string {
-	pair, err := ethchain.NewKeyPairFromSec(ethutil.FromHex(key))
+	pair, err := ethutil.NewKeyPairFromSec(ethutil.FromHex(key))
 	if err != nil {
 		return ""
 	}
@@ -115,12 +112,12 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
 		hash = ethutil.FromHex(recipient)
 	}
 
-	var keyPair *ethchain.KeyPair
+	var keyPair *ethutil.KeyPair
 	var err error
 	if key[0:2] == "0x" {
-		keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2])))
+		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2])))
 	} else {
-		keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
+		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
 	}
 
 	if err != nil {
diff --git a/ethpub/types.go b/ethpub/types.go
index 7f25e48a6005d9646e03193c73c6db739c8c2788..c902afc564007b9f44f8a91bfe8f07923b452a6a 100644
--- a/ethpub/types.go
+++ b/ethpub/types.go
@@ -39,7 +39,7 @@ type PKey struct {
 	PublicKey  string `json:"publicKey"`
 }
 
-func NewPKey(key *ethchain.KeyPair) *PKey {
+func NewPKey(key *ethutil.KeyPair) *PKey {
 	return &PKey{ethutil.Hex(key.Address()), ethutil.Hex(key.PrivateKey), ethutil.Hex(key.PublicKey)}
 }
 
diff --git a/ethutil/db.go b/ethutil/db.go
index abbf4a2b0930929e32a1c02860cfa938ee7d2a36..e02a80fca7e493bb07d1575cb8c14eae8c006b99 100644
--- a/ethutil/db.go
+++ b/ethutil/db.go
@@ -4,7 +4,7 @@ package ethutil
 type Database interface {
 	Put(key []byte, value []byte)
 	Get(key []byte) ([]byte, error)
-	GetKeys() []*Key
+	//GetKeys() []*Key
 	Delete(key []byte) error
 	LastKnownTD() []byte
 	Close()
diff --git a/ethutil/key.go b/ethutil/key.go
deleted file mode 100644
index ec195f2136b1e4da39363103a4cac5aba040b5f7..0000000000000000000000000000000000000000
--- a/ethutil/key.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package ethutil
-
-type Key struct {
-	PrivateKey []byte
-	PublicKey  []byte
-}
-
-func NewKeyFromBytes(data []byte) *Key {
-	val := NewValueFromBytes(data)
-	return &Key{val.Get(0).Bytes(), val.Get(1).Bytes()}
-}
-
-func (k *Key) Address() []byte {
-	return Sha3Bin(k.PublicKey[1:])[12:]
-}
-
-func (k *Key) RlpEncode() []byte {
-	return EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode()
-}
diff --git a/ethutil/keypair.go b/ethutil/keypair.go
new file mode 100644
index 0000000000000000000000000000000000000000..cf5882e2c4dbea41890f3816b6fcec46228596f9
--- /dev/null
+++ b/ethutil/keypair.go
@@ -0,0 +1,109 @@
+package ethutil
+
+import (
+	"github.com/obscuren/secp256k1-go"
+)
+
+type KeyPair struct {
+	PrivateKey []byte
+	PublicKey  []byte
+
+	// The associated account
+	account *StateObject
+}
+
+func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) {
+	pubkey, err := secp256k1.GeneratePubKey(seckey)
+	if err != nil {
+		return nil, err
+	}
+
+	return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil
+}
+
+func NewKeyPairFromValue(val *Value) *KeyPair {
+	v, _ := NewKeyPairFromSec(val.Bytes())
+
+	return v
+}
+
+func (k *KeyPair) Address() []byte {
+	return Sha3Bin(k.PublicKey[1:])[12:]
+}
+
+func (k *KeyPair) RlpEncode() []byte {
+	return k.RlpValue().Encode()
+}
+
+func (k *KeyPair) RlpValue() *Value {
+	return NewValue(k.PrivateKey)
+}
+
+type KeyRing struct {
+	keys []*KeyPair
+}
+
+func (k *KeyRing) Add(pair *KeyPair) {
+	k.keys = append(k.keys, pair)
+}
+
+func (k *KeyRing) Get(i int) *KeyPair {
+	if len(k.keys) > i {
+		return k.keys[i]
+	}
+
+	return nil
+}
+
+func (k *KeyRing) Len() int {
+	return len(k.keys)
+}
+
+func (k *KeyRing) NewKeyPair(sec []byte) (*KeyPair, error) {
+	keyPair, err := NewKeyPairFromSec(sec)
+	if err != nil {
+		return nil, err
+	}
+
+	k.Add(keyPair)
+	Config.Db.Put([]byte("KeyRing"), k.RlpValue().Encode())
+
+	return keyPair, nil
+}
+
+func (k *KeyRing) Reset() {
+	Config.Db.Put([]byte("KeyRing"), nil)
+	k.keys = nil
+}
+
+func (k *KeyRing) RlpValue() *Value {
+	v := EmptyValue()
+	for _, keyPair := range k.keys {
+		v.Append(keyPair.RlpValue())
+	}
+
+	return v
+}
+
+// The public "singleton" keyring
+var keyRing *KeyRing
+
+func GetKeyRing() *KeyRing {
+	if keyRing == nil {
+		keyRing = &KeyRing{}
+
+		data, _ := Config.Db.Get([]byte("KeyRing"))
+		it := NewValueFromBytes(data).NewIterator()
+		for it.Next() {
+			v := it.Value()
+
+			key, err := NewKeyPairFromSec(v.Bytes())
+			if err != nil {
+				panic(err)
+			}
+			keyRing.Add(key)
+		}
+	}
+
+	return keyRing
+}
diff --git a/peer.go b/peer.go
index 70759f246d6259bd59683ae9d30b78ee0ca24fef..433ce161fb196e08f92be0a0b8a52d55a28533b4 100644
--- a/peer.go
+++ b/peer.go
@@ -581,8 +581,8 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
 		p.port = uint16(c.Get(4).Uint())
 
 		// Self connect detection
-		key := ethutil.Config.Db.GetKeys()[0]
-		if bytes.Compare(key.PublicKey, p.pubkey) == 0 {
+		keyPair := ethutil.GetKeyRing().Get(0)
+		if bytes.Compare(keyPair.PublicKey, p.pubkey) == 0 {
 			p.Stop()
 
 			return