diff --git a/core/types/block.go b/core/types/block.go
index 2034bb0ff76f449fb7f6ddcf73c9ebd7b6ed6241..1a2a1f2bda9b6fdd7e0134b0214f0c5242e4a1e1 100644
--- a/core/types/block.go
+++ b/core/types/block.go
@@ -423,9 +423,9 @@ func CalcUncleHash(uncles []*Header) common.Hash {
 
 // WithMiningResult returns a new block with the data from b
 // where nonce and mix digest are set to the provided values.
-func (b *Block) WithMiningResult(nonce uint64, mixDigest common.Hash) *Block {
+func (b *Block) WithMiningResult(nonce BlockNonce, mixDigest common.Hash) *Block {
 	cpy := *b.header
-	binary.BigEndian.PutUint64(cpy.Nonce[:], nonce)
+	cpy.Nonce = nonce
 	cpy.MixDigest = mixDigest
 	return &Block{
 		header:       &cpy,
diff --git a/eth/api.go b/eth/api.go
index d798c196e9c94d995ef2301e9e3e6c02f2b03861..023e9a9bba4e359d235b108335d9780e3243b776 100644
--- a/eth/api.go
+++ b/eth/api.go
@@ -96,8 +96,8 @@ func (s *PublicMinerAPI) Mining() bool {
 
 // SubmitWork can be used by external miner to submit their POW solution. It returns an indication if the work was
 // accepted. Note, this is not an indication if the provided work was valid!
-func (s *PublicMinerAPI) SubmitWork(nonce hexutil.Uint64, solution, digest common.Hash) bool {
-	return s.agent.SubmitWork(uint64(nonce), digest, solution)
+func (s *PublicMinerAPI) SubmitWork(nonce types.BlockNonce, solution, digest common.Hash) bool {
+	return s.agent.SubmitWork(nonce, digest, solution)
 }
 
 // GetWork returns a work package for external miner. The work package consists of 3 strings
diff --git a/miner/agent.go b/miner/agent.go
index 16f2a77230ed44868fdb6e54f5c821df1dbf251a..697e3971b7930534dbb91d73de5a71642c2513cf 100644
--- a/miner/agent.go
+++ b/miner/agent.go
@@ -22,6 +22,7 @@ import (
 	"sync/atomic"
 
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/pow"
@@ -112,7 +113,7 @@ func (self *CpuAgent) mine(work *Work, stop <-chan struct{}) {
 	// Mine
 	nonce, mixDigest := self.pow.Search(work.Block, stop, self.index)
 	if nonce != 0 {
-		block := work.Block.WithMiningResult(nonce, common.BytesToHash(mixDigest))
+		block := work.Block.WithMiningResult(types.EncodeNonce(nonce), common.BytesToHash(mixDigest))
 		self.returnCh <- &Result{work, block}
 	} else {
 		self.returnCh <- nil
diff --git a/miner/remote_agent.go b/miner/remote_agent.go
index f99f38b36d376c80c64ec64aae1caab5d7b6dcb8..23277bac8bb7d17e339898e2b4faaa938ae5dc91 100644
--- a/miner/remote_agent.go
+++ b/miner/remote_agent.go
@@ -25,6 +25,7 @@ import (
 
 	"github.com/ethereum/ethash"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/pow"
@@ -132,7 +133,7 @@ func (a *RemoteAgent) GetWork() ([3]string, error) {
 // SubmitWork tries to inject a PoW solution tinto the remote agent, returning
 // whether the solution was acceted or not (not can be both a bad PoW as well as
 // any other error, like no work pending).
-func (a *RemoteAgent) SubmitWork(nonce uint64, mixDigest, hash common.Hash) bool {
+func (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common.Hash) bool {
 	a.mu.Lock()
 	defer a.mu.Unlock()