diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go
index 490da82a6c4e9454395a6e08a14f9331eb1e5b52..9bce3f988a498fd89746b739ac9f425c5f667468 100644
--- a/accounts/abi/bind/backends/simulated.go
+++ b/accounts/abi/bind/backends/simulated.go
@@ -203,7 +203,8 @@ type callmsg struct {
 
 func (m callmsg) From() (common.Address, error)         { return m.from.Address(), nil }
 func (m callmsg) FromFrontier() (common.Address, error) { return m.from.Address(), nil }
-func (m callmsg) Nonce() uint64                         { return m.from.Nonce() }
+func (m callmsg) Nonce() uint64                         { return 0 }
+func (m callmsg) CheckNonce() bool                      { return false }
 func (m callmsg) To() *common.Address                   { return m.to }
 func (m callmsg) GasPrice() *big.Int                    { return m.gasPrice }
 func (m callmsg) Gas() *big.Int                         { return m.gasLimit }
diff --git a/common/registrar/ethreg/api.go b/common/registrar/ethreg/api.go
index 6d77a9385d8822f1c396651371a1a484c9353ab6..6dd0ef46f3822652ddca98ba3b7fbb9314632bba 100644
--- a/common/registrar/ethreg/api.go
+++ b/common/registrar/ethreg/api.go
@@ -128,7 +128,10 @@ func (m callmsg) FromFrontier() (common.Address, error) {
 	return m.from.Address(), nil
 }
 func (m callmsg) Nonce() uint64 {
-	return m.from.Nonce()
+	return 0
+}
+func (m callmsg) CheckNonce() bool {
+	return false
 }
 func (m callmsg) To() *common.Address {
 	return m.to
diff --git a/core/state_transition.go b/core/state_transition.go
index c8160424b9439a8f11f8bf0b3f770d3a848d30cf..9e6b2f567e8fb5dd0c456b4ff4649edc42d3ad0a 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -71,6 +71,7 @@ type Message interface {
 	Value() *big.Int
 
 	Nonce() uint64
+	CheckNonce() bool
 	Data() []byte
 }
 
@@ -208,8 +209,10 @@ func (self *StateTransition) preCheck() (err error) {
 	}
 
 	// Make sure this transaction's nonce is correct
-	if n := self.state.GetNonce(sender.Address()); n != msg.Nonce() {
-		return NonceError(msg.Nonce(), n)
+	if msg.CheckNonce() {
+		if n := self.state.GetNonce(sender.Address()); n != msg.Nonce() {
+			return NonceError(msg.Nonce(), n)
+		}
 	}
 
 	// Pre-pay gas
diff --git a/core/types/transaction.go b/core/types/transaction.go
index b99d3a71638e430b6259939fcc74cbe89dc36387..c71c98aa7db1debcfcfe9da635c35b7e255a8d57 100644
--- a/core/types/transaction.go
+++ b/core/types/transaction.go
@@ -113,6 +113,7 @@ func (tx *Transaction) Gas() *big.Int      { return new(big.Int).Set(tx.data.Gas
 func (tx *Transaction) GasPrice() *big.Int { return new(big.Int).Set(tx.data.Price) }
 func (tx *Transaction) Value() *big.Int    { return new(big.Int).Set(tx.data.Amount) }
 func (tx *Transaction) Nonce() uint64      { return tx.data.AccountNonce }
+func (tx *Transaction) CheckNonce() bool   { return true }
 
 func (tx *Transaction) To() *common.Address {
 	if tx.data.Recipient == nil {
diff --git a/eth/api.go b/eth/api.go
index 74a81510080fe766cd54e6936123507a07c5a401..3b7abb69a22f5468aabe76ee98ea47b97e375711 100644
--- a/eth/api.go
+++ b/eth/api.go
@@ -424,7 +424,6 @@ func (api *PrivateDebugAPI) traceBlock(block *types.Block, config *vm.Config) (b
 // callmsg is the message type used for call transations.
 type callmsg struct {
 	addr          common.Address
-	nonce         uint64
 	to            *common.Address
 	gas, gasPrice *big.Int
 	value         *big.Int
@@ -434,7 +433,8 @@ type callmsg struct {
 // accessor boilerplate to implement core.Message
 func (m callmsg) From() (common.Address, error)         { return m.addr, nil }
 func (m callmsg) FromFrontier() (common.Address, error) { return m.addr, nil }
-func (m callmsg) Nonce() uint64                         { return m.nonce }
+func (m callmsg) Nonce() uint64                         { return 0 }
+func (m callmsg) CheckNonce() bool                      { return false }
 func (m callmsg) To() *common.Address                   { return m.to }
 func (m callmsg) GasPrice() *big.Int                    { return m.gasPrice }
 func (m callmsg) Gas() *big.Int                         { return m.gas }
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index 6e888fc93b6a57a8f52fdd5a4e3d047f5a54d4e0..f604a0ef2b16da5cfb0fa051de5579f4dfec5a2a 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -534,7 +534,6 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A
 // callmsg is the message type used for call transations.
 type callmsg struct {
 	addr          common.Address
-	nonce         uint64
 	to            *common.Address
 	gas, gasPrice *big.Int
 	value         *big.Int
@@ -544,7 +543,8 @@ type callmsg struct {
 // accessor boilerplate to implement core.Message
 func (m callmsg) From() (common.Address, error)         { return m.addr, nil }
 func (m callmsg) FromFrontier() (common.Address, error) { return m.addr, nil }
-func (m callmsg) Nonce() uint64                         { return m.nonce }
+func (m callmsg) Nonce() uint64                         { return 0 }
+func (m callmsg) CheckNonce() bool                      { return false }
 func (m callmsg) To() *common.Address                   { return m.to }
 func (m callmsg) GasPrice() *big.Int                    { return m.gasPrice }
 func (m callmsg) Gas() *big.Int                         { return m.gas }
diff --git a/tests/util.go b/tests/util.go
index abc67769d6673dae42bd7edee6f344d2ac2e8285..877e1acdb74f5fd960b6d07ce3959d6712542501 100644
--- a/tests/util.go
+++ b/tests/util.go
@@ -312,4 +312,5 @@ func (self Message) GasPrice() *big.Int                    { return self.price }
 func (self Message) Gas() *big.Int                         { return self.gas }
 func (self Message) Value() *big.Int                       { return self.value }
 func (self Message) Nonce() uint64                         { return self.nonce }
+func (self Message) CheckNonce() bool                      { return true }
 func (self Message) Data() []byte                          { return self.data }