diff --git a/Cargo.lock b/Cargo.lock
index 1de4b4ca4e..1d099b190a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -7430,13 +7430,17 @@ dependencies = [
"ic-stable-structures",
"msgpack",
"num-traits",
+ "proptest",
"rand 0.8.5",
"serde",
"serde_bytes",
"stable_memory",
+ "stable_memory_map",
"storage_bucket_canister",
"storage_index_canister",
"storage_index_canister_c2c_client",
+ "test-case",
+ "test-strategy",
"timer_job_queues",
"tracing",
"types",
diff --git a/backend/canisters/storage_bucket/CHANGELOG.md b/backend/canisters/storage_bucket/CHANGELOG.md
index fdae11b9eb..4b18955c85 100644
--- a/backend/canisters/storage_bucket/CHANGELOG.md
+++ b/backend/canisters/storage_bucket/CHANGELOG.md
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed
- Reduce storage bucket memory usage ([#7103](https://github.com/open-chat-labs/open-chat/pull/7103))
+- Move file metadata to stable memory ([#7120](https://github.com/open-chat-labs/open-chat/pull/7120))
## [[2.0.1532](https://github.com/open-chat-labs/open-chat/releases/tag/v2.0.1532-storage_bucket)] - 2024-12-19
diff --git a/backend/canisters/storage_bucket/impl/Cargo.toml b/backend/canisters/storage_bucket/impl/Cargo.toml
index 9916a44816..5c08883362 100644
--- a/backend/canisters/storage_bucket/impl/Cargo.toml
+++ b/backend/canisters/storage_bucket/impl/Cargo.toml
@@ -24,6 +24,7 @@ rand = { workspace = true }
serde = { workspace = true }
serde_bytes = { workspace = true }
stable_memory = { path = "../../../libraries/stable_memory" }
+stable_memory_map = { path = "../../../libraries/stable_memory_map" }
storage_bucket_canister = { path = "../api" }
storage_index_canister = { path = "../../storage_index/api" }
storage_index_canister_c2c_client = { path = "../../storage_index/c2c_client" }
@@ -31,3 +32,8 @@ timer_job_queues = { path = "../../../libraries/timer_job_queues" }
tracing = { workspace = true }
types = { path = "../../../libraries/types" }
utils = { path = "../../../libraries/utils" }
+
+[dev-dependencies]
+proptest = { workspace = true }
+test-case = { workspace = true }
+test-strategy = { workspace = true }
\ No newline at end of file
diff --git a/backend/canisters/storage_bucket/impl/src/jobs/migrate_data_to_stable_map.rs b/backend/canisters/storage_bucket/impl/src/jobs/migrate_data_to_stable_map.rs
new file mode 100644
index 0000000000..a8f2d257c3
--- /dev/null
+++ b/backend/canisters/storage_bucket/impl/src/jobs/migrate_data_to_stable_map.rs
@@ -0,0 +1,39 @@
+use crate::mutate_state;
+use ic_cdk_timers::TimerId;
+use std::cell::Cell;
+use std::time::Duration;
+use tracing::info;
+
+thread_local! {
+ static TIMER_ID: Cell