diff --git a/src/consensus/base.rs b/src/consensus/base.rs
index 2bd896f6c3bd052a7734d23974b6b283791c07d4..f17b9e54d24b4a08cabcaab050f498578d71c3bf 100644
--- a/src/consensus/base.rs
+++ b/src/consensus/base.rs
@@ -213,6 +213,11 @@ pub type BlockRewardSchedule = BlockSchedule<U256>;
 
 #[cfg(test)]
 mod tests {
+    use std::{
+        thread::sleep,
+        time::{Duration, UNIX_EPOCH},
+    };
+
     use crate::res::chainspec::MAINNET;
 
     use super::*;
@@ -334,4 +339,73 @@ mod tests {
             assert_eq!(schedule.for_block(BlockNumber(block)), expected_reward);
         }
     }
+
+    #[test]
+    fn validate_block_header_error_future_block_issue_123() {
+        // ARRANGE
+        let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None);
+
+        let now = SystemTime::now()
+            .duration_since(SystemTime::UNIX_EPOCH)
+            .unwrap()
+            .as_secs();
+
+        sleep(Duration::from_secs(3));
+
+        let mut header = BlockHeader::default();
+        header.timestamp = SystemTime::now()
+            .duration_since(UNIX_EPOCH)
+            .unwrap()
+            .as_secs()
+            + 5;
+        let parent = BlockHeader::default();
+
+        sleep(Duration::from_secs(3));
+
+        // ACT
+        let result = consensus_engine_base.validate_block_header(&header, &parent, true);
+
+        // ASSERT
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn validate_block_header_error_future_block() {
+        // ARRANGE
+        let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None);
+
+        let mut header = BlockHeader::default();
+        header.timestamp = SystemTime::now()
+            .duration_since(UNIX_EPOCH)
+            .unwrap()
+            .as_secs()
+            + 1_000_000;
+        let parent = BlockHeader::default();
+
+        // ACT
+        let result = consensus_engine_base.validate_block_header(&header, &parent, true);
+
+        // ASSERT
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn validate_block_header_should_work() {
+        // ARRANGE
+        let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None);
+
+        let mut header = BlockHeader::default();
+        header.timestamp = SystemTime::now()
+            .duration_since(UNIX_EPOCH)
+            .unwrap()
+            .as_secs()
+            - 3600;
+        let parent = BlockHeader::default();
+
+        // ACT
+        let result = consensus_engine_base.validate_block_header(&header, &parent, true);
+
+        // ASSERT
+        assert!(result.is_ok());
+    }
 }