diff --git a/ethchain/block.go b/ethchain/block.go
index aac50ccb14528a795cef4a513ede7a88f09d1df5..ca84dc19cfe97cb20ed788aa15957290ba6b60a9 100644
--- a/ethchain/block.go
+++ b/ethchain/block.go
@@ -122,7 +122,7 @@ func (block *Block) Transactions() []*Transaction {
 }
 
 func (block *Block) PayFee(addr []byte, fee *big.Int) bool {
-	contract := block.state.GetContract(addr)
+	contract := block.state.GetStateObject(addr)
 	// If we can't pay the fee return
 	if contract == nil || contract.Amount.Cmp(fee) < 0 /* amount < fee */ {
 		fmt.Println("Contract has insufficient funds", contract.Amount, fee)
diff --git a/ethchain/block_chain.go b/ethchain/block_chain.go
index 6c3b15a6a382f3e21985e65e529b9c503a1cebb1..99e17727c345c7f18629dd1d46e2bc6c4993dbea 100644
--- a/ethchain/block_chain.go
+++ b/ethchain/block_chain.go
@@ -260,7 +260,7 @@ func AddTestNetFunds(block *Block) {
 		"e6716f9544a56c530d868e4bfbacb172315bdead", // Jeffrey
 		"1e12515ce3e0f817a4ddef9ca55788a1d66bd2df", // Vit
 		"1a26338f0d905e295fccb71fa9ea849ffa12aaf4", // Alex
-		"2ef47100e0787b915105fd5e3f4ff6752079d5cb", // Maran
+		//"2ef47100e0787b915105fd5e3f4ff6752079d5cb", // Maran
 	} {
 		//log.Println("2^200 Wei to", addr)
 		codedAddr := ethutil.FromHex(addr)
diff --git a/ethchain/state.go b/ethchain/state.go
index d02584d6799b35369f5bc541beabed1035e1eac9..63c4a32a63ce6da24b5cbbf0a1697a392e76ddb2 100644
--- a/ethchain/state.go
+++ b/ethchain/state.go
@@ -49,28 +49,6 @@ func (s *State) Purge() int {
 	return s.trie.NewIterator().Purge()
 }
 
-// XXX Deprecated
-func (s *State) GetContract(addr []byte) *StateObject {
-	data := s.trie.Get(string(addr))
-	if data == "" {
-		return nil
-	}
-
-	// build contract
-	contract := NewStateObjectFromBytes(addr, []byte(data))
-
-	// Check if there's a cached state for this contract
-	cachedState := s.states[string(addr)]
-	if cachedState != nil {
-		contract.state = cachedState
-	} else {
-		// If it isn't cached, cache the state
-		s.states[string(addr)] = contract.state
-	}
-
-	return contract
-}
-
 func (s *State) GetStateObject(addr []byte) *StateObject {
 	data := s.trie.Get(string(addr))
 	if data == "" {
@@ -91,6 +69,21 @@ func (s *State) GetStateObject(addr []byte) *StateObject {
 	return stateObject
 }
 
+// Updates any given state object
+func (s *State) UpdateStateObject(object *StateObject) {
+	addr := object.Address()
+
+	if object.state != nil {
+		s.states[string(addr)] = object.state
+	}
+
+	ethutil.Config.Db.Put(ethutil.Sha3Bin(object.Script()), object.Script())
+
+	s.trie.Update(string(addr), string(object.RlpEncode()))
+
+	s.manifest.AddObjectChange(object)
+}
+
 func (s *State) SetStateObject(stateObject *StateObject) {
 	s.states[string(stateObject.address)] = stateObject.state
 
@@ -116,18 +109,6 @@ func (s *State) Copy() *State {
 	return NewState(s.trie.Copy())
 }
 
-// Updates any given state object
-func (s *State) UpdateStateObject(object *StateObject) {
-	addr := object.Address()
-
-	if object.state != nil {
-		s.states[string(addr)] = object.state
-	}
-
-	s.trie.Update(string(addr), string(object.RlpEncode()))
-	s.manifest.AddObjectChange(object)
-}
-
 func (s *State) Put(key, object []byte) {
 	s.trie.Update(string(key), string(object))
 }
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index 28570775baaaca8b393f9f0e6a0b80cea481919f..098263e8ad68fe05a500186a06bb341dc0208c37 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -87,7 +87,7 @@ func (sm *StateManager) BlockChain() *BlockChain {
 func (sm *StateManager) MakeContract(state *State, tx *Transaction) *StateObject {
 	contract := MakeContract(tx, state)
 	if contract != nil {
-		state.states[string(tx.Hash()[12:])] = contract.state
+		state.states[string(tx.CreationAddress())] = contract.state
 
 		return contract
 	}
@@ -117,7 +117,8 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
 			}
 		} else {
 			err := sm.Ethereum.TxPool().ProcessTransaction(tx, block, false)
-			contract := state.GetContract(tx.Recipient)
+			contract := state.GetStateObject(tx.Recipient)
+			ethutil.Config.Log.Debugf("contract recip %x\n", tx.Recipient)
 			if err == nil && len(contract.Script()) > 0 {
 				sm.EvalScript(state, contract.Script(), contract, tx, block)
 			} else if err != nil {
diff --git a/ethchain/state_object.go b/ethchain/state_object.go
index 7a11a1152276f407889854bd347c19479ef7be3e..cb6211ea6156ede14532f9894931c04dbd8ca771 100644
--- a/ethchain/state_object.go
+++ b/ethchain/state_object.go
@@ -10,8 +10,9 @@ type StateObject struct {
 	// Address of the object
 	address []byte
 	// Shared attributes
-	Amount *big.Int
-	Nonce  uint64
+	Amount     *big.Int
+	ScriptHash []byte
+	Nonce      uint64
 	// Contract related attributes
 	state      *State
 	script     []byte
@@ -22,12 +23,10 @@ type StateObject struct {
 func MakeContract(tx *Transaction, state *State) *StateObject {
 	// Create contract if there's no recipient
 	if tx.IsContract() {
-		// FIXME
-		addr := tx.Hash()[12:]
+		addr := tx.CreationAddress()
 
 		value := tx.Value
-		contract := NewContract(addr, value, []byte(""))
-		state.UpdateStateObject(contract)
+		contract := NewContract(addr, value, ZeroHash256)
 
 		contract.script = tx.Data
 		contract.initScript = tx.Init
@@ -146,9 +145,10 @@ func (c *StateObject) RlpEncode() []byte {
 	if c.state != nil {
 		root = c.state.trie.Root
 	} else {
-		root = nil
+		root = ZeroHash256
 	}
-	return ethutil.Encode([]interface{}{c.Amount, c.Nonce, root, c.script})
+
+	return ethutil.Encode([]interface{}{c.Amount, c.Nonce, root, ethutil.Sha3Bin(c.script)})
 }
 
 func (c *StateObject) RlpDecode(data []byte) {
@@ -157,7 +157,10 @@ func (c *StateObject) RlpDecode(data []byte) {
 	c.Amount = decoder.Get(0).BigInt()
 	c.Nonce = decoder.Get(1).Uint()
 	c.state = NewState(ethutil.NewTrie(ethutil.Config.Db, decoder.Get(2).Interface()))
-	c.script = decoder.Get(3).Bytes()
+
+	c.ScriptHash = decoder.Get(3).Bytes()
+
+	c.script, _ = ethutil.Config.Db.Get(c.ScriptHash)
 }
 
 // Storage change object. Used by the manifest for notifying changes to
diff --git a/ethchain/state_object_test.go b/ethchain/state_object_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..1db01a537303fa956b22e20601ca8a709ac31048
--- /dev/null
+++ b/ethchain/state_object_test.go
@@ -0,0 +1,25 @@
+package ethchain
+
+import (
+	"fmt"
+	"github.com/ethereum/eth-go/ethdb"
+	"github.com/ethereum/eth-go/ethutil"
+	"testing"
+)
+
+func TestSync(t *testing.T) {
+	ethutil.ReadConfig("", ethutil.LogStd)
+
+	db, _ := ethdb.NewMemDatabase()
+	state := NewState(ethutil.NewTrie(db, ""))
+
+	contract := NewContract([]byte("aa"), ethutil.Big1, ZeroHash256)
+
+	contract.script = []byte{42}
+
+	state.UpdateStateObject(contract)
+	state.Sync()
+
+	object := state.GetStateObject([]byte("aa"))
+	fmt.Printf("%x\n", object.Script())
+}
diff --git a/ethchain/transaction.go b/ethchain/transaction.go
index e93e610be54e66045f9c8191b6dd9bcdaba5bffb..8ea4704cb66bb20fa617e3703b30a8b09df22782 100644
--- a/ethchain/transaction.go
+++ b/ethchain/transaction.go
@@ -60,7 +60,7 @@ func (tx *Transaction) IsContract() bool {
 }
 
 func (tx *Transaction) CreationAddress() []byte {
-	return tx.Hash()[12:]
+	return ethutil.Sha3Bin(ethutil.NewValue([]interface{}{tx.Sender(), tx.Nonce}).Encode())[12:]
 }
 
 func (tx *Transaction) Signature(key []byte) []byte {
diff --git a/ethchain/vm.go b/ethchain/vm.go
index 6579830ecb248a42408a70b27381d379935f07d0..e732d22a428ad443309ecef4b115ec7376f6c47e 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -471,7 +471,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 			args := mem.Get(inOffset.Int64(), inSize.Int64())
 
 			// Fetch the contract which will serve as the closure body
-			contract := vm.state.GetContract(addr.Bytes())
+			contract := vm.state.GetStateObject(addr.Bytes())
 
 			if contract != nil {
 				// Prepay for the gas
diff --git a/ethpub/pub.go b/ethpub/pub.go
index 8c9a0666c03dccf4994131f200fa7f949284986a..fb1018d471404133c1b417946b9caf600bb2eb5f 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -45,7 +45,7 @@ func (lib *PEthereum) GetKey() *PKey {
 }
 
 func (lib *PEthereum) GetStateObject(address string) *PStateObject {
-	stateObject := lib.stateManager.CurrentState().GetContract(ethutil.FromHex(address))
+	stateObject := lib.stateManager.CurrentState().GetStateObject(ethutil.FromHex(address))
 	if stateObject != nil {
 		return NewPStateObject(stateObject)
 	}
@@ -160,7 +160,6 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
 	}
 
 	acc := lib.stateManager.TransState().GetStateObject(keyPair.Address())
-	//acc := lib.stateManager.GetAddrState(keyPair.Address())
 	tx.Nonce = acc.Nonce
 	acc.Nonce += 1
 	lib.stateManager.TransState().SetStateObject(acc)
diff --git a/ethpub/types.go b/ethpub/types.go
index c902afc564007b9f44f8a91bfe8f07923b452a6a..75115f4e87c1e1903be4c59a02cef20c5d82c587 100644
--- a/ethpub/types.go
+++ b/ethpub/types.go
@@ -2,6 +2,7 @@ package ethpub
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/ethereum/eth-go/ethchain"
 	"github.com/ethereum/eth-go/ethutil"
 )
@@ -112,6 +113,14 @@ func (c *PStateObject) IsContract() bool {
 	return false
 }
 
+func (c *PStateObject) Script() string {
+	if c.object != nil {
+		return ethutil.Hex(c.object.Script())
+	}
+
+	return ""
+}
+
 type PStorageState struct {
 	StateAddress string
 	Address      string
diff --git a/peer.go b/peer.go
index 45ff0a795a75f76a3e238460e4b57a9581a29196..f84b4d472abb4451e8b75d7e3d87d22876e640f9 100644
--- a/peer.go
+++ b/peer.go
@@ -18,7 +18,7 @@ const (
 	// The size of the output buffer for writing messages
 	outputBufferSize = 50
 	// Current protocol version
-	ProtocolVersion = 8
+	ProtocolVersion = 9
 )
 
 type DiscReason byte