diff --git a/ethvm/vm.go b/ethvm/vm.go
index b81c8a189c56c30b4805167765a791a4a3f8410e..a93b56e605a2625aab484e148a10109587ce04af 100644
--- a/ethvm/vm.go
+++ b/ethvm/vm.go
@@ -282,20 +282,15 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
 		case SDIV:
 			require(2)
 			x, y := stack.Popn()
-			// n > 2**255
-			if x.Cmp(Pow256) > 0 {
-				x.Sub(Pow256, x)
-			}
-			if y.Cmp(Pow256) > 0 {
-				y.Sub(Pow256, y)
-			}
-			z := new(big.Int)
-			z.Div(x, y)
-			if z.Cmp(Pow256) > 0 {
-				z.Sub(Pow256, z)
+			self.Printf(" %v / %v", y, x)
+
+			if x.Cmp(ethutil.Big0) != 0 {
+				base.Div(y, x)
 			}
-			// Push result on to the stack
-			stack.Push(z)
+
+			self.Printf(" = %v", base)
+			// Pop result back on the stack
+			stack.Push(base)
 		case MOD:
 			require(2)
 			x, y := stack.Popn()
@@ -309,20 +304,14 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
 		case SMOD:
 			require(2)
 			x, y := stack.Popn()
-			// n > 2**255
-			if x.Cmp(Pow256) > 0 {
-				x.Sub(Pow256, x)
-			}
-			if y.Cmp(Pow256) > 0 {
-				y.Sub(Pow256, y)
-			}
-			z := new(big.Int)
-			z.Mod(x, y)
-			if z.Cmp(Pow256) > 0 {
-				z.Sub(Pow256, z)
-			}
-			// Push result on to the stack
-			stack.Push(z)
+
+			self.Printf(" %v %% %v", y, x)
+
+			base.Mod(y, x)
+
+			self.Printf(" = %v", base)
+			stack.Push(base)
+
 		case EXP:
 			require(2)
 			x, y := stack.Popn()
diff --git a/peer.go b/peer.go
index c73617ed5b81da7584c87248543c636d4253f1af..ffba695caa085aa5be2325b6f3983969c9c3446d 100644
--- a/peer.go
+++ b/peer.go
@@ -121,7 +121,8 @@ type Peer struct {
 	versionKnown bool
 
 	// Last received pong message
-	lastPong int64
+	lastPong          int64
+	lastBlockReceived time.Time
 
 	host []byte
 	port uint16
@@ -408,10 +409,7 @@ func (p *Peer) HandleInbound() {
 				for i := msg.Data.Len() - 1; i >= 0; i-- {
 					block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i))
 
-					//p.ethereum.StateManager().PrepareDefault(block)
-					//state := p.ethereum.StateManager().CurrentState()
 					err = p.ethereum.StateManager().Process(block, false)
-
 					if err != nil {
 						if ethutil.Config.Debug {
 							peerlogger.Infof("Block %x failed\n", block.Hash())
@@ -422,6 +420,8 @@ func (p *Peer) HandleInbound() {
 					} else {
 						lastBlock = block
 					}
+
+					p.lastBlockReceived = time.Now()
 				}
 
 				if msg.Data.Len() <= 1 {
@@ -561,6 +561,25 @@ func (p *Peer) HandleInbound() {
 	p.Stop()
 }
 
+// General update method
+func (self *Peer) update() {
+	serviceTimer := time.NewTicker(5 * time.Second)
+
+out:
+	for {
+		select {
+		case <-serviceTimer.C:
+			if time.Since(self.lastBlockReceived) > 10*time.Second {
+				self.catchingUp = false
+			}
+		case <-self.quit:
+			break out
+		}
+	}
+
+	serviceTimer.Stop()
+}
+
 func (p *Peer) Start() {
 	peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String())
 	servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
@@ -583,6 +602,8 @@ func (p *Peer) Start() {
 	go p.HandleOutbound()
 	// Run the inbound handler in a new goroutine
 	go p.HandleInbound()
+	// Run the general update handler
+	go p.update()
 
 	// Wait a few seconds for startup and then ask for an initial ping
 	time.Sleep(2 * time.Second)