diff --git a/ethchain/keypair.go b/ethchain/keypair.go
index a5af791d0d8635245970dc04caf3921dc3e062b3..0f23bacdf8fecb8784bc96bc5df794ee9a1fd049 100644
--- a/ethchain/keypair.go
+++ b/ethchain/keypair.go
@@ -2,6 +2,7 @@ package ethchain
 
 import (
 	"github.com/ethereum/eth-go/ethutil"
+	"github.com/obscuren/secp256k1-go"
 	"math/big"
 )
 
@@ -14,6 +15,15 @@ type KeyPair struct {
 	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()}
 
diff --git a/ethchain/state_object.go b/ethchain/state_object.go
index 8e921795d7a8007005bd31ddbf7f515acee84a54..4ec91d2e082b9ddd56a3c5a4dcb30e4714c864f2 100644
--- a/ethchain/state_object.go
+++ b/ethchain/state_object.go
@@ -80,7 +80,6 @@ func (c *StateObject) SetAddr(addr []byte, value interface{}) {
 func (c *StateObject) SetMem(num *big.Int, val *ethutil.Value) {
 	addr := ethutil.BigToBytes(num, 256)
 	c.SetAddr(addr, val)
-	//c.state.trie.Update(string(addr), string(val.Encode()))
 }
 
 func (c *StateObject) GetMem(num *big.Int) *ethutil.Value {
diff --git a/ethchain/transaction_pool.go b/ethchain/transaction_pool.go
index 8fbe676f5b3d7d2e9fab99c8c427b65516c626d8..72836d6cb1b3b1b1b47fee400445135358ed0cad 100644
--- a/ethchain/transaction_pool.go
+++ b/ethchain/transaction_pool.go
@@ -91,14 +91,12 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
 // Process transaction validates the Tx and processes funds from the
 // sender to the recipient.
 func (pool *TxPool) ProcessTransaction(tx *Transaction, block *Block, toContract bool) (err error) {
-	/*
-		defer func() {
-			if r := recover(); r != nil {
-				log.Println(r)
-				err = fmt.Errorf("%v", r)
-			}
-		}()
-	*/
+	defer func() {
+		if r := recover(); r != nil {
+			log.Println(r)
+			err = fmt.Errorf("%v", r)
+		}
+	}()
 	// Get the sender
 	sender := block.state.GetAccount(tx.Sender())
 
diff --git a/ethchain/vm.go b/ethchain/vm.go
index 0a3690c4152910bdc38bb46e87e8462265247354..3a3b3447aa98de877f1e65842971d2b46052665c 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -73,10 +73,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 		}
 	}()
 
-	// If the amount of gas supplied is less equal to 0
-	if closure.Gas.Cmp(big.NewInt(0)) <= 0 {
-		// TODO Do something
-	}
+	ethutil.Config.Log.Debugf("[VM] Running closure %x\n", closure.object.Address())
 
 	// Memory for the current closure
 	mem := &Memory{}
@@ -107,9 +104,11 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 		val := closure.Get(pc)
 		// Get the opcode (it must be an opcode!)
 		op := OpCode(val.Uint())
-		if ethutil.Config.Debug {
-			ethutil.Config.Log.Debugf("%-3d %-4s", pc, op.String())
-		}
+		/*
+			if ethutil.Config.Debug {
+				ethutil.Config.Log.Debugf("%-3d %-4s", pc, op.String())
+			}
+		*/
 
 		gas := new(big.Int)
 		useGas := func(amount *big.Int) {
@@ -163,9 +162,6 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 		case oLOG:
 			stack.Print()
 			mem.Print()
-		case oSTOP: // Stop the closure
-			return closure.Return(nil), nil
-
 			// 0x20 range
 		case oADD:
 			require(2)
@@ -520,22 +516,18 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
 
 			return closure.Return(ret), nil
 		case oSUICIDE:
-			/*
-				recAddr := stack.Pop().Bytes()
-				// Purge all memory
-				deletedMemory := contract.state.Purge()
-				// Add refunds to the pop'ed address
-				refund := new(big.Int).Mul(StoreFee, big.NewInt(int64(deletedMemory)))
-				account := state.GetAccount(recAddr)
-				account.Amount.Add(account.Amount, refund)
-				// Update the refunding address
-				state.UpdateAccount(recAddr, account)
-				// Delete the contract
-				state.trie.Update(string(addr), "")
-
-				ethutil.Config.Log.Debugf("(%d) => %x\n", deletedMemory, recAddr)
-				break out
-			*/
+			require(1)
+
+			receiver := vm.state.GetAccount(stack.Pop().Bytes())
+			receiver.AddAmount(closure.object.Amount)
+
+			vm.stateManager.manifest.AddObjectChange(receiver)
+
+			closure.object.state.Purge()
+
+			fallthrough
+		case oSTOP: // Stop the closure
+			return closure.Return(nil), nil
 		default:
 			ethutil.Config.Log.Debugf("Invalid opcode %x\n", op)
 
diff --git a/ethereum.go b/ethereum.go
index df8e9ef7d47020df768c9e266de5e25ae56c7947..4181f9cd84a1ec972fd4ef8c8224322bc1f914be 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -354,7 +354,7 @@ func (s *Ethereum) WaitForShutdown() {
 func (s *Ethereum) upnpUpdateThread() {
 	// Go off immediately to prevent code duplication, thereafter we renew
 	// lease every 15 minutes.
-	timer := time.NewTimer(0 * time.Second)
+	timer := time.NewTimer(5 * time.Minute)
 	lport, _ := strconv.ParseInt(s.Port, 10, 16)
 	first := true
 out:
diff --git a/natupnp.go b/natupnp.go
index e4072d0ddb6d966cf9e99eeb7d8b6cbd8a8f38de..c7f9eeb622b30b3641cc51cbf3be29c63e73f21c 100644
--- a/natupnp.go
+++ b/natupnp.go
@@ -246,6 +246,10 @@ func soapRequest(url, function, message string) (r *http.Response, err error) {
 	//fmt.Println(fullMessage)
 
 	r, err = http.DefaultClient.Do(req)
+	if err != nil {
+		return
+	}
+
 	if r.Body != nil {
 		defer r.Body.Close()
 	}
diff --git a/peer.go b/peer.go
index 4f7005ac4d0eaa9f0b28c28cf8498ebb039e1297..80ddc5142a9411c747850c6d046e9fca7f6b8e64 100644
--- a/peer.go
+++ b/peer.go
@@ -440,14 +440,14 @@ func (p *Peer) HandleInbound() {
 
 				// If a parent is found send back a reply
 				if parent != nil {
-					ethutil.Config.Log.Infof("[PEER] Found conical block, returning chain from: %x ", parent.Hash())
+					ethutil.Config.Log.Debugf("[PEER] Found conical block, returning chain from: %x ", parent.Hash())
 					chain := p.ethereum.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks)
 					if len(chain) > 0 {
-						ethutil.Config.Log.Infof("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash())
+						ethutil.Config.Log.Debugf("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash())
 						p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain))
 					}
 				} else {
-					ethutil.Config.Log.Infof("[PEER] Could not find a similar block")
+					ethutil.Config.Log.Debugf("[PEER] Could not find a similar block")
 					// If no blocks are found we send back a reply with msg not in chain
 					// and the last hash from get chain
 					lastHash := msg.Data.Get(l - 1)
@@ -455,7 +455,7 @@ func (p *Peer) HandleInbound() {
 					p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, []interface{}{lastHash.Raw()}))
 				}
 			case ethwire.MsgNotInChainTy:
-				ethutil.Config.Log.Infof("Not in chain %x\n", msg.Data)
+				ethutil.Config.Log.Debugf("Not in chain %x\n", msg.Data)
 				// TODO
 			case ethwire.MsgGetTxsTy:
 				// Get the current transactions of the pool
@@ -478,29 +478,6 @@ func (p *Peer) HandleInbound() {
 	p.Stop()
 }
 
-func packAddr(address, port string) ([]interface{}, uint16) {
-	addr := strings.Split(address, ".")
-	a, _ := strconv.Atoi(addr[0])
-	b, _ := strconv.Atoi(addr[1])
-	c, _ := strconv.Atoi(addr[2])
-	d, _ := strconv.Atoi(addr[3])
-	host := []interface{}{int32(a), int32(b), int32(c), int32(d)}
-	prt, _ := strconv.Atoi(port)
-
-	return host, uint16(prt)
-}
-
-func unpackAddr(value *ethutil.Value, p uint64) string {
-	a := strconv.Itoa(int(value.Get(0).Uint()))
-	b := strconv.Itoa(int(value.Get(1).Uint()))
-	c := strconv.Itoa(int(value.Get(2).Uint()))
-	d := strconv.Itoa(int(value.Get(3).Uint()))
-	host := strings.Join([]string{a, b, c, d}, ".")
-	port := strconv.Itoa(int(p))
-
-	return net.JoinHostPort(host, port)
-}
-
 func (p *Peer) Start() {
 	peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String())
 	servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
@@ -662,3 +639,26 @@ func (p *Peer) CatchupWithPeer(blockHash []byte) {
 func (p *Peer) RlpData() []interface{} {
 	return []interface{}{p.host, p.port, p.pubkey}
 }
+
+func packAddr(address, port string) ([]interface{}, uint16) {
+	addr := strings.Split(address, ".")
+	a, _ := strconv.Atoi(addr[0])
+	b, _ := strconv.Atoi(addr[1])
+	c, _ := strconv.Atoi(addr[2])
+	d, _ := strconv.Atoi(addr[3])
+	host := []interface{}{int32(a), int32(b), int32(c), int32(d)}
+	prt, _ := strconv.Atoi(port)
+
+	return host, uint16(prt)
+}
+
+func unpackAddr(value *ethutil.Value, p uint64) string {
+	a := strconv.Itoa(int(value.Get(0).Uint()))
+	b := strconv.Itoa(int(value.Get(1).Uint()))
+	c := strconv.Itoa(int(value.Get(2).Uint()))
+	d := strconv.Itoa(int(value.Get(3).Uint()))
+	host := strings.Join([]string{a, b, c, d}, ".")
+	port := strconv.Itoa(int(p))
+
+	return net.JoinHostPort(host, port)
+}