diff --git a/core/chain_manager.go b/core/chain_manager.go
index 959bfd3986603e4aa5d9dff220f48b3ccc5396fe..81f085c4709c02d80ef0fa04a96e2e8dba2abdbf 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -15,6 +15,7 @@ import (
 )
 
 var chainlogger = logger.NewLogger("CHAIN")
+var jsonlogger = logger.NewJsonLogger()
 
 type ChainEvent struct {
 	Block *types.Block
@@ -122,7 +123,7 @@ func (self *ChainManager) Status() (td *big.Int, currentBlock []byte, genesisBlo
 	self.mu.RLock()
 	defer self.mu.RUnlock()
 
-	return self.td, self.currentBlock.Hash(), self.Genesis().Hash()
+	return self.td, self.currentBlock.Hash(), self.genesisBlock.Hash()
 }
 
 func (self *ChainManager) SetProcessor(proc types.BlockProcessor) {
@@ -395,11 +396,11 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
 
 		var canonical, split bool
 		self.mu.Lock()
+		cblock := self.currentBlock
 		{
 			// Write block to database. Eventually we'll have to improve on this and throw away blocks that are
 			// not in the canonical chain.
 			self.write(block)
-			cblock := self.currentBlock
 			// Compare the TD of the last known block in the canonical chain to make sure it's greater.
 			// At this point it's possible that a different chain (fork) becomes the new canonical chain.
 			if td.Cmp(self.td) > 0 {
@@ -417,6 +418,12 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
 		self.mu.Unlock()
 
 		if canonical {
+			jsonlogger.LogJson(&logger.EthChainNewHead{
+				BlockHash:     ethutil.Bytes2Hex(block.Hash()),
+				BlockNumber:   block.Number(),
+				ChainHeadHash: ethutil.Bytes2Hex(cblock.Hash()),
+				BlockPrevHash: ethutil.Bytes2Hex(block.ParentHash()),
+			})
 			self.setTransState(state.New(block.Root(), self.db))
 			self.eventMux.Post(ChainEvent{block, td})
 		}
diff --git a/eth/protocol.go b/eth/protocol.go
index a5cc8ee1a87f0136d914a1314bae29546d7e7337..ec5a5b6ba19abbc4af688ccf7fc8bc506fad6f04 100644
--- a/eth/protocol.go
+++ b/eth/protocol.go
@@ -224,6 +224,14 @@ func (self *ethProtocol) handle() error {
 			return self.protoError(ErrDecode, "msg %v: %v", msg, err)
 		}
 		hash := request.Block.Hash()
+		_, chainHead, _ := self.chainManager.Status()
+		jsonlogger.LogJson(&logger.EthChainReceivedNewBlock{
+			BlockHash:     ethutil.Bytes2Hex(hash),
+			BlockNumber:   request.Block.Number(), // this surely must be zero
+			ChainHeadHash: ethutil.Bytes2Hex(chainHead),
+			BlockPrevHash: ethutil.Bytes2Hex(request.Block.ParentHash()),
+			RemoteId:      self.peer.ID().String(),
+		})
 		// to simplify backend interface adding a new block
 		// uses AddPeer followed by AddHashes, AddBlock only if peer is the best peer
 		// (or selected as new best peer)
diff --git a/logger/types.go b/logger/types.go
index 86408620eda3e3ecc22eb51a5f2f4b0a8d02f7d4..d98f0874a5c7719df7625a065abb8e842caa6e0a 100644
--- a/logger/types.go
+++ b/logger/types.go
@@ -66,11 +66,11 @@ func (l *EthMinerNewBlock) EventName() string {
 }
 
 type EthChainReceivedNewBlock struct {
-	BlockHash     string `json:"block_hash"`
-	BlockNumber   int    `json:"block_number"`
-	ChainHeadHash string `json:"chain_head_hash"`
-	BlockPrevHash string `json:"block_prev_hash"`
-	RemoteId      int    `json:"remote_id"`
+	BlockHash     string   `json:"block_hash"`
+	BlockNumber   *big.Int `json:"block_number"`
+	ChainHeadHash string   `json:"chain_head_hash"`
+	BlockPrevHash string   `json:"block_prev_hash"`
+	RemoteId      string   `json:"remote_id"`
 	LogEvent
 }
 
@@ -79,10 +79,10 @@ func (l *EthChainReceivedNewBlock) EventName() string {
 }
 
 type EthChainNewHead struct {
-	BlockHash     string `json:"block_hash"`
-	BlockNumber   int    `json:"block_number"`
-	ChainHeadHash string `json:"chain_head_hash"`
-	BlockPrevHash string `json:"block_prev_hash"`
+	BlockHash     string   `json:"block_hash"`
+	BlockNumber   *big.Int `json:"block_number"`
+	ChainHeadHash string   `json:"chain_head_hash"`
+	BlockPrevHash string   `json:"block_prev_hash"`
 	LogEvent
 }