diff --git a/Cargo.lock b/Cargo.lock
index 1de1627..2ad6567 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2494,6 +2494,15 @@ version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2"
+[[package]]
+name = "relative-path"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "reqwest"
version = "0.13.4"
@@ -2579,7 +2588,7 @@ dependencies = [
"proc-macro2",
"quote",
"regex",
- "relative-path",
+ "relative-path 1.9.3",
"rustc_version",
"syn 2.0.119",
"unicode-ident",
@@ -2629,6 +2638,7 @@ dependencies = [
"rand_chacha 0.10.0",
"rand_distr",
"rayon",
+ "relative-path 2.0.1",
"reqwest",
"serde",
"serde_json",
diff --git a/Cargo.toml b/Cargo.toml
index 8e8da1e..927d4e9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,6 +14,7 @@ periodic_table = "0.5"
proptest = "1"
rand = "0.10"
rayon = "1"
+relative-path = { version = "2", features = ["serde"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1.0.*"
sysinfo = { version = "0.39.6", default-features = false, features = ["system"] }
diff --git a/crates/rustiq-core/Cargo.toml b/crates/rustiq-core/Cargo.toml
index 703bbac..3d156b3 100644
--- a/crates/rustiq-core/Cargo.toml
+++ b/crates/rustiq-core/Cargo.toml
@@ -27,6 +27,7 @@ npyz = "0.9.1"
physical_constants = "0.5"
periodic_table.workspace = true
rayon.workspace = true
+relative-path.workspace = true
tokio = { workspace = true, features = ["fs", "io-util"], optional = true }
serde_json.workspace = true
serde.workspace = true
diff --git a/crates/rustiq-core/src/persistence/data.rs b/crates/rustiq-core/src/persistence/data.rs
new file mode 100644
index 0000000..86dccc8
--- /dev/null
+++ b/crates/rustiq-core/src/persistence/data.rs
@@ -0,0 +1,8 @@
+mod ao_eri_artifact;
+mod artifact;
+mod rustiq_data;
+
+pub use ao_eri_artifact::AoEriArtifact;
+pub use artifact::Artifact;
+pub use rustiq_data::RustiQData;
+pub(crate) use rustiq_data::AO_ERI_ARTIFACT;
diff --git a/crates/rustiq-core/src/persistence/data/ao_eri_artifact.rs b/crates/rustiq-core/src/persistence/data/ao_eri_artifact.rs
new file mode 100644
index 0000000..3e93b56
--- /dev/null
+++ b/crates/rustiq-core/src/persistence/data/ao_eri_artifact.rs
@@ -0,0 +1,29 @@
+use crate::{eri::CompactEri, persistence::ArtifactError};
+
+use super::{
+ artifact::{private, Artifact},
+ rustiq_data::{RustiQData, AO_ERI_ARTIFACT},
+};
+
+/// AO electron-repulsion integrals in compact storage order.
+pub struct AoEriArtifact;
+
+impl private::Sealed for AoEriArtifact {}
+
+impl Artifact for AoEriArtifact {
+ type Value = CompactEri;
+
+ fn get(data: &mut RustiQData) -> Result