diff --git a/state/managed_state.go b/state/managed_state.go
index 1914e977ae1b7ea46d0112e39aecdcb006b010a6..aff0206b28087a65bf8de81416655587b4b76d5b 100644
--- a/state/managed_state.go
+++ b/state/managed_state.go
@@ -23,13 +23,19 @@ func ManageState(statedb *StateDB) *ManagedState {
 	}
 }
 
+func (ms *ManagedState) SetState(statedb *StateDB) {
+	ms.mu.Lock()
+	defer ms.mu.Unlock()
+	ms.StateDB = statedb
+}
+
 func (ms *ManagedState) RemoveNonce(addr []byte, n uint64) {
 	if ms.hasAccount(addr) {
 		ms.mu.Lock()
 		defer ms.mu.Unlock()
 
 		account := ms.getAccount(addr)
-		if n-account.nstart < uint64(len(account.nonces)) {
+		if n-account.nstart <= uint64(len(account.nonces)) {
 			reslice := make([]bool, n-account.nstart)
 			copy(reslice, account.nonces[:n-account.nstart])
 			account.nonces = reslice
@@ -47,7 +53,7 @@ func (ms *ManagedState) NewNonce(addr []byte) uint64 {
 			return account.nstart + uint64(i)
 		}
 	}
-	account.nonces = append(account.nonces, false)
+	account.nonces = append(account.nonces, true)
 	return uint64(len(account.nonces)) + account.nstart
 }
 
@@ -57,9 +63,17 @@ func (ms *ManagedState) hasAccount(addr []byte) bool {
 }
 
 func (ms *ManagedState) getAccount(addr []byte) *account {
-	if _, ok := ms.accounts[string(addr)]; !ok {
+	if account, ok := ms.accounts[string(addr)]; !ok {
 		so := ms.GetOrNewStateObject(addr)
 		ms.accounts[string(addr)] = newAccount(so)
+	} else {
+		// Always make sure the state account nonce isn't actually higher
+		// than the tracked one.
+		so := ms.StateDB.GetStateObject(addr)
+		if so != nil && uint64(len(account.nonces))+account.nstart < so.nonce {
+			ms.accounts[string(addr)] = newAccount(so)
+		}
+
 	}
 
 	return ms.accounts[string(addr)]
diff --git a/state/managed_state_test.go b/state/managed_state_test.go
index ae374f728a1cfffdff1a4cd97c64b1441aa1038a..da52ab270eebb996c0c34eea61024103a6133b63 100644
--- a/state/managed_state_test.go
+++ b/state/managed_state_test.go
@@ -1,12 +1,18 @@
 package state
 
-import "testing"
+import (
+	"testing"
 
-var addr = []byte("test")
+	"github.com/ethereum/go-ethereum/ethutil"
+)
+
+var addr = ethutil.Address([]byte("test"))
 
 func create() (*ManagedState, *account) {
-	ms := ManageState(nil)
-	ms.accounts[string(addr)] = newAccount(&StateObject{nonce: 100})
+	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)
 
 	return ms, ms.accounts[string(addr)]
 }
@@ -16,6 +22,11 @@ func TestNewNonce(t *testing.T) {
 
 	nonce := ms.NewNonce(addr)
 	if nonce != 100 {
+		t.Error("expected nonce 100. got", nonce)
+	}
+
+	nonce = ms.NewNonce(addr)
+	if nonce != 101 {
 		t.Error("expected nonce 101. got", nonce)
 	}
 }
@@ -52,3 +63,19 @@ func TestReuse(t *testing.T) {
 		t.Error("expected nonce to be 105. got", nonce)
 	}
 }
+
+func TestRemoteNonceChange(t *testing.T) {
+	ms, account := create()
+	nn := make([]bool, 10)
+	for i, _ := range nn {
+		nn[i] = true
+	}
+	account.nonces = append(account.nonces, nn...)
+	nonce := ms.NewNonce(addr)
+
+	ms.StateDB.stateObjects[string(addr)].nonce = 200
+	nonce = ms.NewNonce(addr)
+	if nonce != 200 {
+		t.Error("expected nonce after remote update to be", 201, "got", nonce)
+	}
+}