diff --git a/substrate/core/network/src/protocol/sync.rs b/substrate/core/network/src/protocol/sync.rs
index d4ecd0e1dcb0347772e295ab39cf0fa1de8c3720..c9465e4b74131f540148c911d219b299d07883b7 100644
--- a/substrate/core/network/src/protocol/sync.rs
+++ b/substrate/core/network/src/protocol/sync.rs
@@ -1037,7 +1037,7 @@ impl<B: BlockT> ChainSync<B> {
 			peer.recently_announced.pop_front();
 		}
 		peer.recently_announced.push_back(hash.clone());
-		if is_best && number > peer.best_number {
+		if is_best {
 			// update their best block
 			peer.best_number = number;
 			peer.best_hash = hash;
diff --git a/substrate/core/network/src/test/sync.rs b/substrate/core/network/src/test/sync.rs
index dd9185373f062a41b1ea3f2e9fa393c73deaf238..768ee1c34ebc90f653843e7dbaf3d47436254466 100644
--- a/substrate/core/network/src/test/sync.rs
+++ b/substrate/core/network/src/test/sync.rs
@@ -633,3 +633,21 @@ fn syncs_header_only_forks() {
 	})).unwrap();
 }
 
+#[test]
+fn does_not_sync_announced_old_best_block() {
+	let _ = ::env_logger::try_init();
+	let mut runtime = current_thread::Runtime::new().unwrap();
+	let mut net = TestNet::new(3);
+
+	let old_hash = net.peer(0).push_blocks(1, false);
+	net.peer(0).push_blocks(19, true);
+	net.peer(1).push_blocks(20, true);
+
+	net.peer(0).announce_block(old_hash, Vec::new());
+	runtime.block_on(futures::future::poll_fn::<(), (), _>(|| -> Result<_, ()> {
+		// poll once to import announcement
+		net.poll();
+		Ok(Async::Ready(()))
+	})).unwrap();
+	assert!(!net.peer(1).is_major_syncing());
+}