diff --git a/miner/miner.go b/miner/miner.go
index ec5b4cc085ce58a1ed1d19a77951256ea8c92fa6..8cbd70b424b54e98208ad217f72645e3855e70a8 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -88,6 +88,7 @@ func (miner *Miner) update() {
 	defer events.Unsubscribe()
 
 	shouldStart := false
+	canStart := true
 	for {
 		select {
 		case ev := <-events.Chan():
@@ -98,21 +99,27 @@ func (miner *Miner) update() {
 			case downloader.StartEvent:
 				wasMining := miner.Mining()
 				miner.worker.stop()
+				canStart = false
 				if wasMining {
 					// Resume mining after sync was finished
 					shouldStart = true
 					log.Info("Mining aborted due to sync")
 				}
 			case downloader.DoneEvent, downloader.FailedEvent:
+				canStart = true
 				if shouldStart {
 					miner.SetEtherbase(miner.coinbase)
 					miner.worker.start()
 				}
 			}
 		case addr := <-miner.startCh:
-			miner.SetEtherbase(addr)
-			miner.worker.start()
+			if canStart {
+				miner.SetEtherbase(addr)
+				miner.worker.start()
+			}
+			shouldStart = true
 		case <-miner.stopCh:
+			shouldStart = false
 			miner.worker.stop()
 		case <-miner.exitCh:
 			miner.worker.close()
diff --git a/miner/miner_test.go b/miner/miner_test.go
index 447892b198c24648b27b175de26251e5efd66b95..2ed03a2397a9378130eceb116c0fe3efe687ac64 100644
--- a/miner/miner_test.go
+++ b/miner/miner_test.go
@@ -97,6 +97,19 @@ func TestMiner(t *testing.T) {
 	waitForMiningState(t, miner, true)
 }
 
+func TestStartWhileDownload(t *testing.T) {
+	miner, mux := createMiner(t)
+	waitForMiningState(t, miner, false)
+	miner.Start(common.HexToAddress("0x12345"))
+	waitForMiningState(t, miner, true)
+	// Stop the downloader and wait for the update loop to run
+	mux.Post(downloader.StartEvent{})
+	waitForMiningState(t, miner, false)
+	// Starting the miner after the downloader should not work
+	miner.Start(common.HexToAddress("0x12345"))
+	waitForMiningState(t, miner, false)
+}
+
 func TestStartStopMiner(t *testing.T) {
 	miner, _ := createMiner(t)
 	waitForMiningState(t, miner, false)