diff --git a/core/chain_manager.go b/core/chain_manager.go
index 7fed7b8b1893cbed4e3ba3bb82af3f9fce7e14db..101d0568daa2bc19a06d4001b123d3c6af1addda 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -449,6 +449,8 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
 				*/
 
 				self.setTransState(state.New(block.Root(), self.stateDb))
+				self.setTxState(state.New(block.Root(), self.stateDb))
+
 				queue[i] = ChainEvent{block}
 				queueEvent.canonicalCount++
 			} else {
diff --git a/core/error.go b/core/error.go
index 04e40646cfa605414ceff2d29bb0ae97d2164dd5..69e320eb0fbe662fff6faa7380189f3abe5c192a 100644
--- a/core/error.go
+++ b/core/error.go
@@ -78,7 +78,7 @@ func (err *NonceErr) Error() string {
 }
 
 func NonceError(is, exp uint64) *NonceErr {
-	return &NonceErr{Message: fmt.Sprintf("Nonce err. Is %d, expected %d", is, exp), Is: is, Exp: exp}
+	return &NonceErr{Message: fmt.Sprintf("Transaction w/ invalid nonce (%d / %d)", is, exp), Is: is, Exp: exp}
 }
 
 func IsNonceErr(err error) bool {
diff --git a/core/state_transition.go b/core/state_transition.go
index ee99ec7aa31c56371fe9bcf05c57b3e184f5bbd5..f49aed87425200a557ff7c316efac3a593aa0404 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -148,6 +148,9 @@ func (self *StateTransition) preCheck() (err error) {
 
 	// Pre-pay gas / Buy gas of the coinbase account
 	if err = self.BuyGas(); err != nil {
+		if state.IsGasLimitErr(err) {
+			return err
+		}
 		return InvalidTxError(err)
 	}
 
diff --git a/miner/worker.go b/miner/worker.go
index 9bcea15396b49a3b9321b3feec85612007ee9118..a39a0b43b5baf396051e7285574590f8e7ca69f3 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -212,6 +212,7 @@ gasLimit:
 			fallthrough
 		case core.IsInvalidTxErr(err):
 			// Remove invalid transactions
+			self.chain.TxState().RemoveNonce(tx.From(), tx.Nonce())
 			remove = append(remove, tx)
 		case state.IsGasLimitErr(err):
 			// Break on gas limit