diff --git a/Cargo.lock b/Cargo.lock
index cc3388b..927b763 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -126,7 +126,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
 name = "csdif-core"
-version = "0.1.1"
+version = "0.1.2"
 dependencies = [
  "env_logger",
  "log",
@@ -371,9 +371,9 @@ dependencies = [
 
 [[package]]
 name = "is_terminal_polyfill"
-version = "1.70.1"
+version = "1.70.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
 
 [[package]]
 name = "itoa"
@@ -456,9 +456,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
 
 [[package]]
 name = "once_cell_polyfill"
-version = "1.70.1"
+version = "1.70.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
 
 [[package]]
 name = "percent-encoding"
@@ -688,9 +688,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
 [[package]]
 name = "syn"
-version = "2.0.106"
+version = "2.0.107"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
+checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -740,9 +740,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.19"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
+checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
 
 [[package]]
 name = "url"
diff --git a/Cargo.toml b/Cargo.toml
index 042faae..70208f1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "csdif-core"
-version = "0.1.1"
+version = "0.1.2"
 edition = "2024"
 license = "MIT"
 description = "Core library for modeling, validating, and transforming CSDIF data"
diff --git a/src/error.rs b/src/error.rs
index 0c953b4..8c33c9e 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -27,3 +27,14 @@ impl fmt::Display for CsdifError {
     }
 }
 
+#[derive(Debug)]
+pub struct MappingError {
+    pub message: String,
+}
+
+#[derive(Debug)]
+pub enum ContextError {
+    NotFound,
+    InvalidFormat,
+}
+
diff --git a/src/mapper.rs b/src/forward_mapper.rs
similarity index 78%
rename from src/mapper.rs
rename to src/forward_mapper.rs
index ff5d293..f221b80 100644
--- a/src/mapper.rs
+++ b/src/forward_mapper.rs
@@ -2,6 +2,8 @@
 // SPDX-License-Identifier: MIT
 
 use sensorml::model::document::SensorMLDocument;
+use crate::error::ContextError;
+use crate::error::MappingError;
 
 pub trait InitiativeForwardMapper {
     fn map_to_sensorml(
@@ -16,17 +18,6 @@ pub trait ContextProvider {
     fn get_station_profile(&self, id: &str) -> Result<StationProfile, ContextError>;
 }
 
-#[derive(Debug)]
-pub struct MappingError {
-    pub message: String,
-}
-
-#[derive(Debug)]
-pub enum ContextError {
-    NotFound,
-    InvalidFormat,
-}
-
 #[derive(Debug)]
 pub struct StationProfile {
     pub id: String,
diff --git a/src/lib.rs b/src/lib.rs
index 659603a..e0136f1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: MIT
 
 pub mod error;
-pub mod mapper;
+pub mod forward_mapper;
+pub mod reverse_mapper;
 pub mod model;
 pub mod transform;
 pub mod validate;
diff --git a/src/reverse_mapper.rs b/src/reverse_mapper.rs
new file mode 100644
index 0000000..e0199cd
--- /dev/null
+++ b/src/reverse_mapper.rs
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+
+use sensorml::model::document::SensorMLDocument;
+
+/// Trait for mapping SensorML documents back into initiative-specific JSON.
+pub trait InitiativeReverseMapper {
+    fn map_from_sensorml(
+        &self,
+        input: &SensorMLDocument,
+    ) -> Result<serde_json::Value, crate::error::MappingError>;
+}
+
