diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
index f29e7f3ed7c7c5eb55cbe80a2c428c112e58cd60..375553311ac2f1b462ee31997a40a050d4d67eb2 100644
--- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
+++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
@@ -380,6 +380,7 @@ fn build_polkadot_full_node(
 			prepare_workers_hard_max_num: None,
 			prepare_workers_soft_max_num: None,
 			enable_approval_voting_parallel: false,
+			keep_finalized_for: None,
 		},
 	)?;
 
diff --git a/polkadot/cli/src/cli.rs b/polkadot/cli/src/cli.rs
index 777bb9c60671244e56153cf666d8f4702d1abaf5..97081749996f819124640e27431eed3c556dede2 100644
--- a/polkadot/cli/src/cli.rs
+++ b/polkadot/cli/src/cli.rs
@@ -152,6 +152,11 @@ pub struct RunCmd {
 	/// explicitly advised to.
 	#[arg(long)]
 	pub enable_approval_voting_parallel: bool,
+
+	/// How long finalized data should be kept in the availability store (in hours).
+	/// Defaults to 25 hours for live networks and 1 hour for test networks.
+	#[arg(long)]
+	pub keep_finalized_for: Option<u32>,
 }
 
 #[allow(missing_docs)]
diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs
index 02c9b97150c2db9e831ad175da301d00a5c08a5f..6b716d48783bc29cc63d8d04fad7788d072d67ce 100644
--- a/polkadot/cli/src/command.rs
+++ b/polkadot/cli/src/command.rs
@@ -235,6 +235,7 @@ where
 				prepare_workers_hard_max_num: cli.run.prepare_workers_hard_max_num,
 				prepare_workers_soft_max_num: cli.run.prepare_workers_soft_max_num,
 				enable_approval_voting_parallel: cli.run.enable_approval_voting_parallel,
+				keep_finalized_for: cli.run.keep_finalized_for,
 			},
 		)
 		.map(|full| full.task_manager)?;
diff --git a/polkadot/node/core/av-store/src/lib.rs b/polkadot/node/core/av-store/src/lib.rs
index 9da2973773a01923b8108d73871f875fd1e96cb3..2621b13767171cc741b9cba7e008cf305d5f2985 100644
--- a/polkadot/node/core/av-store/src/lib.rs
+++ b/polkadot/node/core/av-store/src/lib.rs
@@ -75,9 +75,6 @@ const TOMBSTONE_VALUE: &[u8] = b" ";
 /// Unavailable blocks are kept for 1 hour.
 const KEEP_UNAVAILABLE_FOR: Duration = Duration::from_secs(60 * 60);
 
-/// Finalized data is kept for 25 hours.
-const KEEP_FINALIZED_FOR: Duration = Duration::from_secs(25 * 60 * 60);
-
 /// The pruning interval.
 const PRUNING_INTERVAL: Duration = Duration::from_secs(60 * 5);
 
@@ -423,16 +420,6 @@ struct PruningConfig {
 	pruning_interval: Duration,
 }
 
-impl Default for PruningConfig {
-	fn default() -> Self {
-		Self {
-			keep_unavailable_for: KEEP_UNAVAILABLE_FOR,
-			keep_finalized_for: KEEP_FINALIZED_FOR,
-			pruning_interval: PRUNING_INTERVAL,
-		}
-	}
-}
-
 /// Configuration for the availability store.
 #[derive(Debug, Clone, Copy)]
 pub struct Config {
@@ -440,6 +427,8 @@ pub struct Config {
 	pub col_data: u32,
 	/// The column family for availability store meta information.
 	pub col_meta: u32,
+	/// How long finalized data should be kept (in hours).
+	pub keep_finalized_for: u32,
 }
 
 trait Clock: Send + Sync {
@@ -475,10 +464,16 @@ impl AvailabilityStoreSubsystem {
 		sync_oracle: Box<dyn SyncOracle + Send + Sync>,
 		metrics: Metrics,
 	) -> Self {
+		let pruning_config = PruningConfig {
+			keep_unavailable_for: KEEP_UNAVAILABLE_FOR,
+			keep_finalized_for: Duration::from_secs(config.keep_finalized_for as u64 * 3600),
+			pruning_interval: PRUNING_INTERVAL,
+		};
+		
 		Self::with_pruning_config_and_clock(
 			db,
 			config,
-			PruningConfig::default(),
+			pruning_config,
 			Box::new(SystemClock),
 			sync_oracle,
 			metrics,
diff --git a/polkadot/node/core/av-store/src/tests.rs b/polkadot/node/core/av-store/src/tests.rs
index 80043e56976b1b75c76894f664d54c20d0813107..28b97c425b60d4d6365f3cd91318c551d7257e55 100644
--- a/polkadot/node/core/av-store/src/tests.rs
+++ b/polkadot/node/core/av-store/src/tests.rs
@@ -43,7 +43,7 @@ mod columns {
 	pub const NUM_COLUMNS: u32 = 2;
 }
 
-const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META };
+const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META, keep_finalized_for: 1 };
 
 type VirtualOverseer =
 	polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle<AvailabilityStoreMessage>;
diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs
index 820cce8d083a63903d7887247990545bce114315..26d70f47a84c855ead5f9e7a9a6f95c216bcf3b9 100644
--- a/polkadot/node/service/src/lib.rs
+++ b/polkadot/node/service/src/lib.rs
@@ -99,6 +99,7 @@ pub use sc_service::{
 	ChainSpec, Configuration, Error as SubstrateServiceError, PruningMode, Role, TFullBackend,
 	TFullCallExecutor, TFullClient, TaskManager, TransactionPoolOptions,
 };
+use sc_chain_spec::ChainType;
 pub use sp_api::{ApiRef, ConstructRuntimeApi, Core as CoreApi, ProvideRuntimeApi};
 pub use sp_consensus::{Proposal, SelectChain};
 use sp_consensus_beefy::ecdsa_crypto;
@@ -628,6 +629,8 @@ pub struct NewFullParams<OverseerGenerator: OverseerGen> {
 	pub prepare_workers_soft_max_num: Option<usize>,
 	/// An optional absolute number of pvf workers that can be spawned in the pvf prepare pool.
 	pub prepare_workers_hard_max_num: Option<usize>,
+	/// How long finalized data should be kept in the availability store (in hours)
+	pub keep_finalized_for: Option<u32>,
 	pub overseer_gen: OverseerGenerator,
 	pub overseer_message_channel_capacity_override: Option<usize>,
 	#[allow(dead_code)]
@@ -691,11 +694,6 @@ impl IsParachainNode {
 	}
 }
 
-pub const AVAILABILITY_CONFIG: AvailabilityConfig = AvailabilityConfig {
-	col_data: parachains_db::REAL_COLUMNS.col_availability_data,
-	col_meta: parachains_db::REAL_COLUMNS.col_availability_meta,
-};
-
 /// Create a new full node of arbitrary runtime and executor.
 ///
 /// This is an advanced feature and not recommended for general use. Generally, `build_full` is
@@ -727,6 +725,7 @@ pub fn new_full<
 		execute_workers_max_num,
 		prepare_workers_soft_max_num,
 		prepare_workers_hard_max_num,
+		keep_finalized_for,
 		enable_approval_voting_parallel,
 	}: NewFullParams<OverseerGenerator>,
 ) -> Result<NewFull, Error> {
@@ -979,11 +978,23 @@ pub fn new_full<
 		let fetch_chunks_threshold =
 			if config.chain_spec.is_polkadot() { None } else { Some(FETCH_CHUNKS_THRESHOLD) };
 
+		let availability_config = AvailabilityConfig {
+			col_data: parachains_db::REAL_COLUMNS.col_availability_data,
+			col_meta: parachains_db::REAL_COLUMNS.col_availability_meta,
+			keep_finalized_for: keep_finalized_for.unwrap_or_else(|| {
+				if matches!(config.chain_spec.chain_type(), ChainType::Live) {
+					25
+				} else {
+					1
+				}
+			}),
+		};
+
 		Some(ExtendedOverseerGenArgs {
 			keystore,
 			parachains_db,
 			candidate_validation_config,
-			availability_config: AVAILABILITY_CONFIG,
+			availability_config,
 			pov_req_receiver,
 			chunk_req_v1_receiver,
 			chunk_req_v2_receiver,
diff --git a/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs
index 3300def2235ee0ea90f466316f9bc5a7a965869c..56332ee75a60e8ad24e78fc2340868036e5c60b6 100644
--- a/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs
+++ b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs
@@ -26,7 +26,11 @@ mod columns {
 	pub const NUM_COLUMNS: u32 = 2;
 }
 
-const TEST_CONFIG: Config = Config { col_data: columns::DATA, col_meta: columns::META };
+const TEST_CONFIG: Config = Config {
+	col_data: columns::DATA,
+	col_meta: columns::META,
+	keep_finalized_for: 1,
+};
 
 pub fn new_av_store(dependencies: &TestEnvironmentDependencies) -> AvailabilityStoreSubsystem {
 	let metrics = Metrics::try_register(&dependencies.registry).unwrap();
diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs
index 75fd0d9af3013c944a7feaf85a884ba212f42f23..dea2682b61b6db3e985db6f4f7ebb6097283c6a0 100644
--- a/polkadot/node/test/service/src/lib.rs
+++ b/polkadot/node/test/service/src/lib.rs
@@ -101,6 +101,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 					prepare_workers_hard_max_num: None,
 					prepare_workers_soft_max_num: None,
 					enable_approval_voting_parallel: false,
+					keep_finalized_for: None,
 				},
 			),
 		sc_network::config::NetworkBackendType::Litep2p =>
@@ -123,6 +124,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 					prepare_workers_hard_max_num: None,
 					prepare_workers_soft_max_num: None,
 					enable_approval_voting_parallel: false,
+					keep_finalized_for: None,
 				},
 			),
 	}
diff --git a/polkadot/parachain/test-parachains/adder/collator/src/main.rs b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
index 416e58b0a8ac6868213a2b0f165a934ad5357c66..58fa3e841ef8ee68c57e02e39802b1b5787e24c8 100644
--- a/polkadot/parachain/test-parachains/adder/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
@@ -98,6 +98,7 @@ fn main() -> Result<()> {
 						prepare_workers_hard_max_num: None,
 						prepare_workers_soft_max_num: None,
 						enable_approval_voting_parallel: false,
+						keep_finalized_for: None,
 					},
 				)
 				.map_err(|e| e.to_string())?;
diff --git a/polkadot/parachain/test-parachains/undying/collator/src/main.rs b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
index 017eefe5ee31e1695272ac63ad43567604152f03..c77a7697a562633539a2ac301c7a9addf895c516 100644
--- a/polkadot/parachain/test-parachains/undying/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
@@ -100,6 +100,7 @@ fn main() -> Result<()> {
 						prepare_workers_hard_max_num: None,
 						prepare_workers_soft_max_num: None,
 						enable_approval_voting_parallel: false,
+						keep_finalized_for: None,
 					},
 				)
 				.map_err(|e| e.to_string())?;