diff --git a/ethcore/res/ethereum/tests b/ethcore/res/ethereum/tests
index 9b722a014..b6aa0947a 160000
--- a/ethcore/res/ethereum/tests
+++ b/ethcore/res/ethereum/tests
@@ -1 +1 @@
-Subproject commit 9b722a014a2b2c9ea6eac456fe01a5c3dd1042a8
+Subproject commit b6aa0947a8e20f4140dd2647882791be6ceb2ac5
diff --git a/ethcore/src/json_tests/difficulty.rs b/ethcore/src/json_tests/difficulty.rs
new file mode 100644
index 000000000..eb599ab83
--- /dev/null
+++ b/ethcore/src/json_tests/difficulty.rs
@@ -0,0 +1,71 @@
+// Copyright 2015-2017 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+use ethjson;
+use header::Header;
+use bigint::prelude::U256;
+use spec::Spec;
+
+pub fn json_difficulty_test(json_data: &[u8], spec: Spec) -> Vec {
+ ::ethcore_logger::init_log();
+ let tests = ethjson::test::DifficultyTest::load(json_data).unwrap();
+ let engine = &spec.engine;
+
+ for (name, test) in tests.into_iter() {
+ flush!(" - {}...", name);
+ println!(" - {}...", name);
+
+ let mut parent_header = Header::new();
+ let block_number: u64 = test.current_block_number.into();
+ parent_header.set_number(block_number - 1);
+ parent_header.set_gas_limit(0x20000.into());
+ parent_header.set_timestamp(test.parent_timestamp.into());
+ parent_header.set_difficulty(test.parent_difficulty.into());
+ parent_header.set_uncles_hash(test.parent_uncles.into());
+ let mut header = Header::new();
+ header.set_number(block_number);
+ header.set_timestamp(test.current_timestamp.into());
+ engine.populate_from_parent(&mut header, &parent_header);
+ let expected_difficulty: U256 = test.current_difficulty.into();
+ assert_eq!(header.difficulty(), &expected_difficulty);
+ flushln!("ok");
+ }
+ vec![]
+}
+
+mod difficulty_test_byzantium {
+ use super::json_difficulty_test;
+
+ fn do_json_test(json_data: &[u8]) -> Vec {
+ json_difficulty_test(json_data, ::ethereum::new_byzantium_test())
+ }
+
+ declare_test!{DifficultyTests_difficultyByzantium, "BasicTests/difficultyByzantium.json"}
+}
+
+
+mod difficulty_test_foundation {
+ use super::json_difficulty_test;
+
+ fn do_json_test(json_data: &[u8]) -> Vec {
+ json_difficulty_test(json_data, ::ethereum::new_foundation(&::std::env::temp_dir()))
+ }
+
+ declare_test!{DifficultyTests_difficultyMainNetwork, "BasicTests/difficultyMainNetwork.json"}
+}
+
+
+
diff --git a/ethcore/src/json_tests/mod.rs b/ethcore/src/json_tests/mod.rs
index ab3205d18..a0966a2d2 100644
--- a/ethcore/src/json_tests/mod.rs
+++ b/ethcore/src/json_tests/mod.rs
@@ -22,3 +22,4 @@ mod executive;
mod state;
mod chain;
mod trie;
+mod difficulty;
diff --git a/json/src/lib.rs b/json/src/lib.rs
index 4af7384a0..fffeb0824 100644
--- a/json/src/lib.rs
+++ b/json/src/lib.rs
@@ -31,3 +31,4 @@ pub mod maybe;
pub mod state;
pub mod transaction;
pub mod misc;
+pub mod test;
diff --git a/json/src/test/mod.rs b/json/src/test/mod.rs
new file mode 100644
index 000000000..1a6e4db7d
--- /dev/null
+++ b/json/src/test/mod.rs
@@ -0,0 +1,67 @@
+// Copyright 2015-2017 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+//! Additional test structures deserialization.
+
+use std::collections::BTreeMap;
+use std::io::Read;
+use serde_json;
+use serde_json::Error;
+use hash::H256;
+use uint::Uint;
+
+/// Blockchain test header deserializer.
+#[derive(Debug, PartialEq, Deserialize)]
+pub struct DifficultyTestCase {
+ /// Parent timestamp.
+ #[serde(rename="parentTimestamp")]
+ pub parent_timestamp: Uint,
+ /// Parent difficulty.
+ #[serde(rename="parentDifficulty")]
+ pub parent_difficulty: Uint,
+ /// Parent uncle hash.
+ #[serde(rename="parentUncles")]
+ pub parent_uncles: H256,
+ /// Current timestamp.
+ #[serde(rename="currentTimestamp")]
+ pub current_timestamp: Uint,
+ /// Current difficulty.
+ #[serde(rename="currentDifficulty")]
+ pub current_difficulty: Uint,
+ /// Current block number.
+ #[serde(rename="currentBlockNumber")]
+ pub current_block_number: Uint,
+}
+/// Blockchain test deserializer.
+#[derive(Debug, PartialEq, Deserialize)]
+pub struct DifficultyTest(BTreeMap);
+
+impl IntoIterator for DifficultyTest {
+ type Item = as IntoIterator>::Item;
+ type IntoIter = as IntoIterator>::IntoIter;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.0.into_iter()
+ }
+}
+
+impl DifficultyTest {
+ /// Loads test from json.
+ pub fn load(reader: R) -> Result where R: Read {
+ serde_json::from_reader(reader)
+ }
+}
+