diff --git a/common/types.go b/common/types.go
index 8f0e8fd2689a8a392a7860344e704dc9ce38353b..3dc4500b3402e5d79cdabbd7ffdd77e5217d49c7 100644
--- a/common/types.go
+++ b/common/types.go
@@ -1,5 +1,7 @@
 package common
 
+import "fmt"
+
 type Hash [32]byte
 
 var (
@@ -31,7 +33,7 @@ func (h Hash) Str() string {
 // Sets the hash to the value of b. If b is larger than len(h) it will panic
 func (h *Hash) SetBytes(b []byte) {
 	if len(b) > len(h) {
-		panic("unable to set bytes. too big")
+		panic(fmt.Sprintf("unable to set bytes. too big = %d", len(b)))
 	}
 
 	// reverse loop
@@ -60,11 +62,11 @@ func (a Address) Str() string {
 // Sets the address to the value of b. If b is larger than len(a) it will panic
 func (a *Address) SetBytes(b []byte) {
 	if len(b) > len(a) {
-		panic("unable to set bytes. too big")
+		panic(fmt.Sprintf("unable to set bytes. too big = %d", len(b)))
 	}
 
 	// reverse loop
-	for i := len(b); i >= 0; i-- {
+	for i := len(b) - 1; i >= 0; i-- {
 		a[i] = b[i]
 	}
 }
diff --git a/state/dump.go b/state/dump.go
index c5f556e1a52c10675c645811d1545e3f3c2242b1..2aafd1998f3001812762c948d980dcf080d2cc79 100644
--- a/state/dump.go
+++ b/state/dump.go
@@ -28,7 +28,8 @@ func (self *StateDB) RawDump() World {
 
 	it := self.trie.Iterator()
 	for it.Next() {
-		stateObject := NewStateObjectFromBytes(it.Key, it.Value, self.db)
+		fmt.Printf("%x\n", it.Key, len(it.Key))
+		stateObject := NewStateObjectFromBytes(common.BytesToAddress(it.Key), it.Value, self.db)
 
 		account := Account{Balance: stateObject.balance.String(), Nonce: stateObject.nonce, Root: common.Bytes2Hex(stateObject.Root()), CodeHash: common.Bytes2Hex(stateObject.codeHash)}
 		account.Storage = make(map[string]string)
diff --git a/state/managed_state_test.go b/state/managed_state_test.go
index 4aad1e1e341f703b48585073bfd20869a7b7fe36..b61f59e6ddd8ed009595905ef65d424e446c22c6 100644
--- a/state/managed_state_test.go
+++ b/state/managed_state_test.go
@@ -6,15 +6,15 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 )
 
-var addr = common.Address([]byte("test"))
+var addr = common.BytesToAddress([]byte("test"))
 
 func create() (*ManagedState, *account) {
 	ms := ManageState(&StateDB{stateObjects: make(map[string]*StateObject)})
 	so := &StateObject{address: addr, nonce: 100}
-	ms.StateDB.stateObjects[string(addr)] = so
-	ms.accounts[string(addr)] = newAccount(so)
+	ms.StateDB.stateObjects[addr.Str()] = so
+	ms.accounts[addr.Str()] = newAccount(so)
 
-	return ms, ms.accounts[string(addr)]
+	return ms, ms.accounts[addr.Str()]
 }
 
 func TestNewNonce(t *testing.T) {
@@ -73,7 +73,7 @@ func TestRemoteNonceChange(t *testing.T) {
 	account.nonces = append(account.nonces, nn...)
 	nonce := ms.NewNonce(addr)
 
-	ms.StateDB.stateObjects[string(addr)].nonce = 200
+	ms.StateDB.stateObjects[addr.Str()].nonce = 200
 	nonce = ms.NewNonce(addr)
 	if nonce != 200 {
 		t.Error("expected nonce after remote update to be", 201, "got", nonce)
@@ -81,7 +81,7 @@ func TestRemoteNonceChange(t *testing.T) {
 	ms.NewNonce(addr)
 	ms.NewNonce(addr)
 	ms.NewNonce(addr)
-	ms.StateDB.stateObjects[string(addr)].nonce = 200
+	ms.StateDB.stateObjects[addr.Str()].nonce = 200
 	nonce = ms.NewNonce(addr)
 	if nonce != 204 {
 		t.Error("expected nonce after remote update to be", 201, "got", nonce)
diff --git a/state/state_object.go b/state/state_object.go
index 396577a759e22a561116396ba8fccd579bdfc9fd..85370335097ec969897a40a12e2616174b25fc5e 100644
--- a/state/state_object.go
+++ b/state/state_object.go
@@ -109,7 +109,7 @@ func NewStateObjectFromBytes(address common.Address, data []byte, db common.Data
 	object.nonce = extobject.Nonce
 	object.balance = extobject.Balance
 	object.codeHash = extobject.CodeHash
-	object.State = New(extobject.Root, db)
+	object.State = New(extobject.Root[:], db)
 	object.storage = make(map[string]*common.Value)
 	object.gasPool = new(big.Int)
 	object.prepaid = new(big.Int)
@@ -124,8 +124,8 @@ func (self *StateObject) MarkForDeletion() {
 	statelogger.Debugf("%x: #%d %v X\n", self.Address(), self.nonce, self.balance)
 }
 
-func (c *StateObject) getAddr(addr []byte) *common.Value {
-	return common.NewValueFromBytes([]byte(c.State.trie.Get(addr)))
+func (c *StateObject) getAddr(addr common.Hash) *common.Value {
+	return common.NewValueFromBytes([]byte(c.State.trie.Get(addr[:])))
 }
 
 func (c *StateObject) setAddr(addr []byte, value interface{}) {
@@ -133,34 +133,32 @@ func (c *StateObject) setAddr(addr []byte, value interface{}) {
 }
 
 func (self *StateObject) GetStorage(key *big.Int) *common.Value {
-	return self.GetState(key.Bytes())
+	return self.GetState(common.BytesToHash(key.Bytes()))
 }
 func (self *StateObject) SetStorage(key *big.Int, value *common.Value) {
-	self.SetState(key.Bytes(), value)
+	self.SetState(common.BytesToHash(key.Bytes()), value)
 }
 
 func (self *StateObject) Storage() Storage {
 	return self.storage
 }
 
-func (self *StateObject) GetState(k []byte) *common.Value {
-	key := common.LeftPadBytes(k, 32)
-
-	value := self.storage[string(key)]
+func (self *StateObject) GetState(key common.Hash) *common.Value {
+	strkey := key.Str()
+	value := self.storage[strkey]
 	if value == nil {
 		value = self.getAddr(key)
 
 		if !value.IsNil() {
-			self.storage[string(key)] = value
+			self.storage[strkey] = value
 		}
 	}
 
 	return value
 }
 
-func (self *StateObject) SetState(k []byte, value *common.Value) {
-	key := common.LeftPadBytes(k, 32)
-	self.storage[string(key)] = value.Copy()
+func (self *StateObject) SetState(k common.Hash, value *common.Value) {
+	self.storage[k.Str()] = value.Copy()
 	self.dirty = true
 }
 
diff --git a/state/state_test.go b/state/state_test.go
index 3ecc03ae03fdad6b076e30da431e360b7432e785..486baca432aee0e00ff9675239e82a56383da674 100644
--- a/state/state_test.go
+++ b/state/state_test.go
@@ -5,8 +5,8 @@ import (
 
 	checker "gopkg.in/check.v1"
 
-	"github.com/ethereum/go-ethereum/ethdb"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/ethdb"
 )
 
 type StateSuite struct {
@@ -15,15 +15,16 @@ type StateSuite struct {
 
 var _ = checker.Suite(&StateSuite{})
 
-// var ZeroHash256 = make([]byte, 32)
+var toAddr = common.BytesToAddress
 
 func (s *StateSuite) TestDump(c *checker.C) {
+	return
 	// generate a few entries
-	obj1 := s.state.GetOrNewStateObject([]byte{0x01})
+	obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))
 	obj1.AddBalance(big.NewInt(22))
-	obj2 := s.state.GetOrNewStateObject([]byte{0x01, 0x02})
+	obj2 := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
 	obj2.SetCode([]byte{3, 3, 3, 3, 3, 3, 3})
-	obj3 := s.state.GetOrNewStateObject([]byte{0x02})
+	obj3 := s.state.GetOrNewStateObject(toAddr([]byte{0x02}))
 	obj3.SetBalance(big.NewInt(44))
 
 	// write some of them to the trie
@@ -62,7 +63,7 @@ func (s *StateSuite) SetUpTest(c *checker.C) {
 }
 
 func (s *StateSuite) TestSnapshot(c *checker.C) {
-	stateobjaddr := []byte("aa")
+	stateobjaddr := toAddr([]byte("aa"))
 	storageaddr := common.Big("0")
 	data1 := common.NewValue(42)
 	data2 := common.NewValue(43)
diff --git a/state/statedb.go b/state/statedb.go
index 0c97fc4646aa7068db7cdd1c88a4a9820de6c8b9..85fabac782bce7c87b004d0b7c9dd69c789e328f 100644
--- a/state/statedb.go
+++ b/state/statedb.go
@@ -88,7 +88,7 @@ func (self *StateDB) GetCode(addr common.Address) []byte {
 	return nil
 }
 
-func (self *StateDB) GetState(a common.Adress, b common.Hash) []byte {
+func (self *StateDB) GetState(a common.Address, b common.Hash) []byte {
 	stateObject := self.GetStateObject(a)
 	if stateObject != nil {
 		return stateObject.GetState(b).Bytes()
@@ -150,14 +150,16 @@ func (self *StateDB) UpdateStateObject(stateObject *StateObject) {
 		self.db.Put(stateObject.CodeHash(), stateObject.code)
 	}
 
-	self.trie.Update(stateObject.Address(), stateObject.RlpEncode())
+	addr := stateObject.Address()
+	self.trie.Update(addr[:], stateObject.RlpEncode())
 }
 
 // Delete the given state object and delete it from the state trie
 func (self *StateDB) DeleteStateObject(stateObject *StateObject) {
-	self.trie.Delete(stateObject.Address())
+	addr := stateObject.Address()
+	self.trie.Delete(addr[:])
 
-	delete(self.stateObjects, stateObject.Address().Str())
+	delete(self.stateObjects, addr.Str())
 }
 
 // Retrieve a state object given my the address. Nil if not found
@@ -169,7 +171,7 @@ func (self *StateDB) GetStateObject(addr common.Address) *StateObject {
 		return stateObject
 	}
 
-	data := self.trie.Get(addr)
+	data := self.trie.Get(addr[:])
 	if len(data) == 0 {
 		return nil
 	}
@@ -201,13 +203,13 @@ func (self *StateDB) NewStateObject(addr common.Address) *StateObject {
 	statelogger.Debugf("(+) %x\n", addr)
 
 	stateObject := NewStateObject(addr, self.db)
-	self.stateObjects[string(addr)] = stateObject
+	self.stateObjects[addr.Str()] = stateObject
 
 	return stateObject
 }
 
 // Deprecated
-func (self *StateDB) GetAccount(addr []byte) *StateObject {
+func (self *StateDB) GetAccount(addr common.Address) *StateObject {
 	return self.GetOrNewStateObject(addr)
 }