diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index 2e2b627df7de5bcb22368d3ed17d54ace76ba12c..2a5e2ec6ad8738f05e4e8ab1c09958f70864a2b0 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -204,12 +204,11 @@ func ImportChain(chain *core.ChainManager, fn string) error {
 	defer fh.Close()
 	stream := rlp.NewStream(fh, 0)
 
-	// Remove all existing blocks and start the import.
-	chain.Reset()
+	// Run actual the import.
 	batchSize := 2500
 	blocks := make(types.Blocks, batchSize)
 	n := 0
-	for {
+	for batch := 0; ; batch++ {
 		// Load a batch of RLP blocks.
 		if checkInterrupt() {
 			return fmt.Errorf("interrupted")
@@ -232,6 +231,11 @@ func ImportChain(chain *core.ChainManager, fn string) error {
 		if checkInterrupt() {
 			return fmt.Errorf("interrupted")
 		}
+		if hasAllBlocks(chain, blocks[:i]) {
+			glog.Infof("skipping batch %d, all blocks present [%x / %x]",
+				batch, blocks[0].Hash().Bytes()[:4], blocks[i-1].Hash().Bytes()[:4])
+			continue
+		}
 		if _, err := chain.InsertChain(blocks[:i]); err != nil {
 			return fmt.Errorf("invalid block %d: %v", n, err)
 		}
@@ -239,6 +243,15 @@ func ImportChain(chain *core.ChainManager, fn string) error {
 	return nil
 }
 
+func hasAllBlocks(chain *core.ChainManager, bs []*types.Block) bool {
+	for _, b := range bs {
+		if !chain.HasBlock(b.Hash()) {
+			return false
+		}
+	}
+	return true
+}
+
 func ExportChain(chainmgr *core.ChainManager, fn string) error {
 	glog.Infoln("Exporting blockchain to", fn)
 	fh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)