diff --git a/Cargo.lock b/Cargo.lock
index 86d06a3f286f..af76d864c61d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -14973,6 +14973,34 @@ dependencies = [
"tempfile",
]
+[[package]]
+name = "ic-subnet-merging"
+version = "0.9.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "futures",
+ "ic-base-types",
+ "ic-cup-explorer",
+ "ic-protobuf",
+ "ic-recovery",
+ "ic-registry-client-helpers",
+ "ic-registry-routing-table",
+ "ic-registry-subnet-type",
+ "ic-state-layout",
+ "ic-subnet-tools",
+ "ic-test-utilities-tmpdir",
+ "ic-types",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "slog",
+ "strum 0.26.3",
+ "strum_macros 0.26.4",
+ "tokio",
+ "url",
+]
+
[[package]]
name = "ic-subnet-splitting"
version = "0.9.0"
@@ -14981,11 +15009,7 @@ dependencies = [
"candid",
"clap",
"csv",
- "hex",
- "ic-agent",
"ic-base-types",
- "ic-crypto-utils-threshold-sig",
- "ic-crypto-utils-threshold-sig-der",
"ic-management-canister-types-private",
"ic-metrics",
"ic-protobuf",
@@ -14996,6 +15020,7 @@ dependencies = [
"ic-state-machine-tests",
"ic-state-manager",
"ic-state-tool",
+ "ic-subnet-tools",
"ic-test-utilities-logger",
"ic-test-utilities-tmpdir",
"ic-test-utilities-types",
@@ -15004,13 +15029,33 @@ dependencies = [
"ic-universal-canister",
"proxy_canister",
"serde",
- "serde_cbor",
"slog",
"strum 0.26.3",
"strum_macros 0.26.4",
"url",
]
+[[package]]
+name = "ic-subnet-tools"
+version = "0.9.0"
+dependencies = [
+ "hex",
+ "ic-agent",
+ "ic-base-types",
+ "ic-crypto-utils-threshold-sig",
+ "ic-crypto-utils-threshold-sig-der",
+ "ic-protobuf",
+ "ic-recovery",
+ "ic-registry-routing-table",
+ "ic-registry-subnet-type",
+ "ic-state-manager",
+ "ic-state-tool",
+ "ic-types",
+ "serde_cbor",
+ "slog",
+ "url",
+]
+
[[package]]
name = "ic-sys"
version = "0.9.0"
@@ -18230,20 +18275,29 @@ dependencies = [
"candid",
"canister-test",
"dfn_candid",
+ "hex",
"ic-agent",
"ic-base-types",
"ic-management-canister-types 0.8.0",
+ "ic-nns-governance-api",
+ "ic-recovery",
"ic-registry-subnet-type",
+ "ic-state-layout",
+ "ic-subnet-merging",
"ic-system-test-driver",
"ic-types",
+ "ic-universal-canister",
"ic-utils 0.49.1",
+ "ic_consensus_system_test_utils",
"itertools 0.12.1",
"rand 0.8.6",
"rand_chacha 0.3.1",
+ "registry-canister",
"rejoin-test-lib",
"slog",
"tempfile",
"tokio",
+ "url",
"xnet-test",
]
diff --git a/Cargo.toml b/Cargo.toml
index ba21cb9ee93e..f497c666c00a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -341,7 +341,9 @@ members = [
"rs/protobuf/generator",
"rs/query_stats",
"rs/recovery",
+ "rs/recovery/subnet_merging",
"rs/recovery/subnet_splitting",
+ "rs/recovery/subnet_tools",
"rs/registry/admin",
"rs/registry/admin-derive",
"rs/registry/canister",
diff --git a/rs/cup_explorer/src/lib.rs b/rs/cup_explorer/src/lib.rs
index 295e5c133dee..dd7b8367f985 100644
--- a/rs/cup_explorer/src/lib.rs
+++ b/rs/cup_explorer/src/lib.rs
@@ -43,7 +43,7 @@ pub async fn get_catchup_content(url: &Url) -> Result