diff --git a/core/chain_manager.go b/core/chain_manager.go
index 9f62d3b47dabbb4258f79cf3533b22bbc5fe274a..80fd6cd713f12eebd8292232c71eaf1f4190c7a8 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -93,6 +93,7 @@ type ChainManager struct {
 	futureBlocks *BlockCache
 
 	quit chan struct{}
+	wg   sync.WaitGroup
 }
 
 func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *ChainManager {
@@ -482,6 +483,10 @@ func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
 
 func (bc *ChainManager) Stop() {
 	close(bc.quit)
+
+	bc.wg.Wait()
+
+	glog.V(logger.Info).Infoln("Chain manager stopped")
 }
 
 type queueEvent struct {
@@ -504,6 +509,9 @@ func (self *ChainManager) procFutureBlocks() {
 // InsertChain will attempt to insert the given chain in to the canonical chain or, otherwise, create a fork. It an error is returned
 // it will return the index number of the failing block as well an error describing what went wrong (for possible errors see core/errors.go).
 func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
+	self.wg.Add(1)
+	defer self.wg.Done()
+
 	// A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring.
 	var (
 		queue      = make([]interface{}, len(chain))
diff --git a/eth/backend.go b/eth/backend.go
index c5fa328b05754a7e92773ae11b135af2ca18ea49..11a63cca9fad8e7f6ddfb3c95c1907f591222077 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -454,6 +454,7 @@ func (self *Ethereum) SuggestPeer(nodeURL string) error {
 func (s *Ethereum) Stop() {
 	s.txSub.Unsubscribe() // quits txBroadcastLoop
 
+	s.chainManager.Stop()
 	s.protocolManager.Stop()
 	s.txPool.Stop()
 	s.eventMux.Stop()