diff --git a/src/gemini.rs b/src/gemini.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c88e78e0b4b9b7563e7075cfe79bd6986b0b9fb7
--- /dev/null
+++ b/src/gemini.rs
@@ -0,0 +1,59 @@
+pub use crate::bindings::gemini::*;
+
+impl crate::Timestamp for MavMessage {
+    fn timestamp(&self) -> Option<u64> {
+        // NOTE: The following match statement is explicitly written to be
+        // exhaustive (if a new message is added, the compiler will complain)
+        match self {
+            MavMessage::IMU_TM(data) => Some(data.timestamp),
+            MavMessage::ADC_TM(data) => Some(data.timestamp),
+            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
+            MavMessage::GPS_TM(data) => Some(data.timestamp),
+            MavMessage::TEMP_TM(data) => Some(data.timestamp),
+            MavMessage::ADA_TM(data) => Some(data.timestamp),
+            MavMessage::LOAD_TM(data) => Some(data.timestamp),
+            MavMessage::PING_TC(data) => Some(data.timestamp),
+            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
+            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
+            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
+            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::MEA_TM(data) => Some(data.timestamp),
+            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::PIN_TM(data) => Some(data.timestamp),
+            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
+            MavMessage::NAS_TM(data) => Some(data.timestamp),
+            MavMessage::FSM_TM(data) => Some(data.timestamp),
+            MavMessage::GSE_TM(data) => Some(data.timestamp),
+            MavMessage::SYS_TM(data) => Some(data.timestamp),
+            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
+            MavMessage::WIGGLE_SERVO_TC(_) => None,
+            MavMessage::RAW_EVENT_TC(_) => None,
+            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
+            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_ATOMIC_VALVE_TIMING_TC(_) => None,
+            MavMessage::SENSOR_STATE_TM(_) => None,
+            MavMessage::SET_COORDINATES_TC(_) => None,
+            MavMessage::SERVO_TM(_) => None,
+            MavMessage::PAYLOAD_STATS_TM(_) => None,
+            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
+            MavMessage::CONRIG_STATE_TC(_) => None,
+            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
+            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_ORIENTATION_TC(_) => None,
+            MavMessage::COMMAND_TC(_) => None,
+            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_VALVE_MAXIMUM_APERTURE_TC(_) => None,
+            MavMessage::MOTOR_TM(_) => None,
+            MavMessage::RESET_SERVO_TC(_) => None,
+            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
+            MavMessage::SET_ALGORITHM_TC(_) => None,
+            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
+            MavMessage::ROCKET_STATS_TM(_) => None,
+            MavMessage::ACK_TM(_) => None,
+            MavMessage::NACK_TM(_) => None,
+            MavMessage::SET_IGNITION_TIME_TC(_) => None,
+        }
+    }
+}
diff --git a/src/hermes.rs b/src/hermes.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6b29eb200ffe358a726fc8ad7b258ed3cc9962d4
--- /dev/null
+++ b/src/hermes.rs
@@ -0,0 +1,34 @@
+pub use crate::bindings::hermes::*;
+
+impl crate::Timestamp for MavMessage {
+    fn timestamp(&self) -> Option<u64> {
+        // NOTE: The following match statement is explicitly written to be
+        // exhaustive (if a new message is added, the compiler will complain)
+        match self {
+            MavMessage::TMTC_TM(data) => Some(data.timestamp),
+            MavMessage::ADA_TM(data) => Some(data.timestamp),
+            MavMessage::IGN_TM(data) => Some(data.timestamp),
+            MavMessage::FMM_TM(data) => Some(data.timestamp),
+            MavMessage::SM_TM(data) => Some(data.timestamp),
+            MavMessage::PING_TC(data) => Some(data.timestamp),
+            MavMessage::GPS_TM(data) => Some(data.timestamp),
+            MavMessage::TEST_TM(data) => Some(data.timestamp.into()),
+            MavMessage::ADIS_TM(data) => Some(data.timestamp),
+            MavMessage::MPU_TM(data) => Some(data.timestamp),
+            MavMessage::SYS_TM(data) => Some(data.timestamp),
+            MavMessage::ADC_TM(data) => Some(data.timestamp),
+            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
+            MavMessage::DPL_TM(data) => Some(data.timestamp),
+            MavMessage::START_LAUNCH_TC(_) => None,
+            MavMessage::CAN_TM(_) => None,
+            MavMessage::UPLOAD_SETTING_TC(_) => None,
+            MavMessage::NOARG_TC(_) => None,
+            MavMessage::NACK_TM(_) => None,
+            MavMessage::RAW_EVENT_TC(_) => None,
+            MavMessage::ACK_TM(_) => None,
+            MavMessage::HR_TM(_) => None,
+            MavMessage::LR_TM(_) => None,
+            MavMessage::TELEMETRY_REQUEST_TC(_) => None,
+        }
+    }
+}
diff --git a/src/lib.rs b/src/lib.rs
index a68d27603996a32e400a2ec105089a8f3c1367d0..fdd5702f7254969269431ba99375bdeeb20099fd 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,9 +1,18 @@
 mod bindings {
     include!(concat!(env!("OUT_DIR"), "/mod.rs"));
 }
+#[cfg(feature = "gemini")]
+pub mod gemini;
+#[cfg(feature = "hermes")]
+pub mod hermes;
+#[cfg(feature = "lynx")]
+pub mod lynx;
+#[cfg(feature = "lyra")]
+pub mod lyra;
+#[cfg(feature = "pyxis")]
+pub mod pyxis;
 
-// Re-export the generated bindings
-pub use bindings::*;
+pub use bindings::{r2a, test};
 pub use mavlink_core as mavlink;
 
 pub mod prelude {
@@ -17,266 +26,3 @@ pub trait Timestamp {
     /// Get the timestamp of the message, if it has one, or None otherwise.
     fn timestamp(&self) -> Option<u64>;
 }
-
-#[cfg(feature = "lyra")]
-impl Timestamp for lyra::MavMessage {
-    fn timestamp(&self) -> Option<u64> {
-        use bindings::lyra::MavMessage;
-
-        // NOTE: The following match statement is explicitly written to be
-        // exhaustive (if a new message is added, the compiler will complain)
-        match self {
-            MavMessage::IMU_TM(data) => Some(data.timestamp),
-            MavMessage::ADC_TM(data) => Some(data.timestamp),
-            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
-            MavMessage::GPS_TM(data) => Some(data.timestamp),
-            MavMessage::TEMP_TM(data) => Some(data.timestamp),
-            MavMessage::ADA_TM(data) => Some(data.timestamp),
-            MavMessage::LOAD_TM(data) => Some(data.timestamp),
-            MavMessage::PING_TC(data) => Some(data.timestamp),
-            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
-            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
-            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
-            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::MEA_TM(data) => Some(data.timestamp),
-            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::PIN_TM(data) => Some(data.timestamp),
-            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
-            MavMessage::ARP_TM(data) => Some(data.timestamp),
-            MavMessage::NAS_TM(data) => Some(data.timestamp),
-            MavMessage::FSM_TM(data) => Some(data.timestamp),
-            MavMessage::GSE_TM(data) => Some(data.timestamp),
-            MavMessage::SYS_TM(data) => Some(data.timestamp),
-            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
-            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
-            MavMessage::RAW_EVENT_TC(_) => None,
-            MavMessage::SET_ORIENTATION_TC(_) => None,
-            MavMessage::CONRIG_STATE_TC(_) => None,
-            MavMessage::SET_ALGORITHM_TC(_) => None,
-            MavMessage::ROCKET_STATS_TM(_) => None,
-            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_STEPPER_STEPS_TC(_) => None,
-            MavMessage::ACK_TM(_) => None,
-            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
-            MavMessage::PAYLOAD_STATS_TM(_) => None,
-            MavMessage::COMMAND_TC(_) => None,
-            MavMessage::SERVO_TM(_) => None,
-            MavMessage::SET_ATOMIC_VALVE_TIMING_TC(_) => None,
-            MavMessage::WIGGLE_SERVO_TC(_) => None,
-            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
-            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
-            MavMessage::NACK_TM(_) => None,
-            MavMessage::RESET_SERVO_TC(_) => None,
-            MavMessage::SET_STEPPER_ANGLE_TC(_) => None,
-            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_COORDINATES_TC(_) => None,
-            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
-            MavMessage::SET_IGNITION_TIME_TC(_) => None,
-            MavMessage::SET_ANTENNA_COORDINATES_ARP_TC(_) => None,
-            MavMessage::SET_ROCKET_COORDINATES_ARP_TC(_) => None,
-            MavMessage::MOTOR_TM(_) => None,
-            MavMessage::SENSOR_STATE_TM(_) => None,
-            MavMessage::SET_VALVE_MAXIMUM_APERTURE_TC(_) => None,
-        }
-    }
-}
-
-#[cfg(feature = "gemini")]
-impl Timestamp for gemini::MavMessage {
-    fn timestamp(&self) -> Option<u64> {
-        use bindings::gemini::MavMessage;
-
-        // NOTE: The following match statement is explicitly written to be
-        // exhaustive (if a new message is added, the compiler will complain)
-        match self {
-            MavMessage::IMU_TM(data) => Some(data.timestamp),
-            MavMessage::ADC_TM(data) => Some(data.timestamp),
-            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
-            MavMessage::GPS_TM(data) => Some(data.timestamp),
-            MavMessage::TEMP_TM(data) => Some(data.timestamp),
-            MavMessage::ADA_TM(data) => Some(data.timestamp),
-            MavMessage::LOAD_TM(data) => Some(data.timestamp),
-            MavMessage::PING_TC(data) => Some(data.timestamp),
-            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
-            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
-            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
-            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::MEA_TM(data) => Some(data.timestamp),
-            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::PIN_TM(data) => Some(data.timestamp),
-            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
-            MavMessage::NAS_TM(data) => Some(data.timestamp),
-            MavMessage::FSM_TM(data) => Some(data.timestamp),
-            MavMessage::GSE_TM(data) => Some(data.timestamp),
-            MavMessage::SYS_TM(data) => Some(data.timestamp),
-            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
-            MavMessage::WIGGLE_SERVO_TC(_) => None,
-            MavMessage::RAW_EVENT_TC(_) => None,
-            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
-            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_ATOMIC_VALVE_TIMING_TC(_) => None,
-            MavMessage::SENSOR_STATE_TM(_) => None,
-            MavMessage::SET_COORDINATES_TC(_) => None,
-            MavMessage::SERVO_TM(_) => None,
-            MavMessage::PAYLOAD_STATS_TM(_) => None,
-            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
-            MavMessage::CONRIG_STATE_TC(_) => None,
-            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
-            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_ORIENTATION_TC(_) => None,
-            MavMessage::COMMAND_TC(_) => None,
-            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
-            MavMessage::SET_VALVE_MAXIMUM_APERTURE_TC(_) => None,
-            MavMessage::MOTOR_TM(_) => None,
-            MavMessage::RESET_SERVO_TC(_) => None,
-            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
-            MavMessage::SET_ALGORITHM_TC(_) => None,
-            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
-            MavMessage::ROCKET_STATS_TM(_) => None,
-            MavMessage::ACK_TM(_) => None,
-            MavMessage::NACK_TM(_) => None,
-            MavMessage::SET_IGNITION_TIME_TC(_) => None,
-        }
-    }
-}
-
-#[cfg(feature = "pyxis")]
-impl Timestamp for pyxis::MavMessage {
-    fn timestamp(&self) -> Option<u64> {
-        use bindings::pyxis::MavMessage;
-
-        // NOTE: The following match statement is explicitly written to be
-        // exhaustive (if a new message is added, the compiler will complain)
-        match self {
-            MavMessage::LOAD_TM(data) => Some(data.timestamp),
-            MavMessage::ADA_TM(data) => Some(data.timestamp),
-            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
-            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
-            MavMessage::SYS_TM(data) => Some(data.timestamp),
-            MavMessage::ADC_TM(data) => Some(data.timestamp),
-            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
-            MavMessage::IMU_TM(data) => Some(data.timestamp),
-            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::FSM_TM(data) => Some(data.timestamp),
-            MavMessage::PING_TC(data) => Some(data.timestamp),
-            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
-            MavMessage::GPS_TM(data) => Some(data.timestamp),
-            MavMessage::PIN_TM(data) => Some(data.timestamp),
-            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
-            MavMessage::NAS_TM(data) => Some(data.timestamp),
-            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
-            MavMessage::TEMP_TM(data) => Some(data.timestamp),
-            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
-            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
-            MavMessage::SET_COORDINATES_TC(_) => None,
-            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
-            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
-            MavMessage::SET_ALGORITHM_TC(_) => None,
-            MavMessage::COMMAND_TC(_) => None,
-            MavMessage::SET_ORIENTATION_TC(_) => None,
-            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
-            MavMessage::WIGGLE_SERVO_TC(_) => None,
-            MavMessage::SENSOR_STATE_TM(_) => None,
-            MavMessage::RAW_EVENT_TC(_) => None,
-            MavMessage::RESET_SERVO_TC(_) => None,
-            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
-            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
-            MavMessage::ACK_TM(_) => None,
-            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
-            MavMessage::SERVO_TM(_) => None,
-            MavMessage::PAYLOAD_STATS_TM(_) => None,
-            MavMessage::NACK_TM(_) => None,
-            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
-            MavMessage::ROCKET_STATS_TM(_) => None,
-        }
-    }
-}
-
-#[cfg(feature = "lynx")]
-impl Timestamp for lynx::MavMessage {
-    fn timestamp(&self) -> Option<u64> {
-        use bindings::lynx::MavMessage;
-
-        // NOTE: The following match statement is explicitly written to be
-        // exhaustive (if a new message is added, the compiler will complain)
-        match self {
-            MavMessage::FMM_TM(data) => Some(data.timestamp),
-            MavMessage::GPS_TM(data) => Some(data.timestamp),
-            MavMessage::TMTC_TM(data) => Some(data.timestamp),
-            MavMessage::TEST_TM(data) => Some(data.timestamp),
-            MavMessage::PIN_OBS_TM(data) => Some(data.timestamp),
-            MavMessage::PING_TC(data) => Some(data.timestamp),
-            MavMessage::HR_TM(data) => Some(data.timestamp),
-            MavMessage::SYS_TM(data) => Some(data.timestamp),
-            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
-            MavMessage::MS5803_TM(data) => Some(data.timestamp),
-            MavMessage::SENSORS_TM(data) => Some(data.timestamp),
-            MavMessage::NAS_TM(data) => Some(data.timestamp),
-            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
-            MavMessage::DPL_TM(data) => Some(data.timestamp),
-            MavMessage::ABK_TM(data) => Some(data.timestamp),
-            MavMessage::LIS3MDL_TM(data) => Some(data.timestamp),
-            MavMessage::BMX160_TM(data) => Some(data.timestamp),
-            MavMessage::ADA_TM(data) => Some(data.timestamp),
-            MavMessage::WINDTUNNEL_TM(data) => Some(data.timestamp),
-            MavMessage::ADC_TM(data) => Some(data.timestamp),
-            MavMessage::UPLOAD_SETTING_TC(_) => None,
-            MavMessage::ACK_TM(_) => None,
-            MavMessage::LR_TM(_) => None,
-            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
-            MavMessage::SET_REFERENCE_ALTITUDE(_) => None,
-            MavMessage::SET_INITIAL_ORIENTATION_TC(_) => None,
-            MavMessage::SET_AEROBRAKE_ANGLE_TC(_) => None,
-            MavMessage::SET_INITIAL_COORDINATES_TC(_) => None,
-            MavMessage::RAW_EVENT_TC(_) => None,
-            MavMessage::TELEMETRY_REQUEST_TC(_) => None,
-            MavMessage::START_LAUNCH_TC(_) => None,
-            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
-            MavMessage::NOARG_TC(_) => None,
-            MavMessage::NACK_TM(_) => None,
-        }
-    }
-}
-
-#[cfg(feature = "hermes")]
-impl Timestamp for hermes::MavMessage {
-    fn timestamp(&self) -> Option<u64> {
-        use bindings::hermes::MavMessage;
-
-        // NOTE: The following match statement is explicitly written to be
-        // exhaustive (if a new message is added, the compiler will complain)
-        match self {
-            MavMessage::TMTC_TM(data) => Some(data.timestamp),
-            MavMessage::ADA_TM(data) => Some(data.timestamp),
-            MavMessage::IGN_TM(data) => Some(data.timestamp),
-            MavMessage::FMM_TM(data) => Some(data.timestamp),
-            MavMessage::SM_TM(data) => Some(data.timestamp),
-            MavMessage::PING_TC(data) => Some(data.timestamp),
-            MavMessage::GPS_TM(data) => Some(data.timestamp),
-            MavMessage::TEST_TM(data) => Some(data.timestamp.into()),
-            MavMessage::ADIS_TM(data) => Some(data.timestamp),
-            MavMessage::MPU_TM(data) => Some(data.timestamp),
-            MavMessage::SYS_TM(data) => Some(data.timestamp),
-            MavMessage::ADC_TM(data) => Some(data.timestamp),
-            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
-            MavMessage::DPL_TM(data) => Some(data.timestamp),
-            MavMessage::START_LAUNCH_TC(_) => None,
-            MavMessage::CAN_TM(_) => None,
-            MavMessage::UPLOAD_SETTING_TC(_) => None,
-            MavMessage::NOARG_TC(_) => None,
-            MavMessage::NACK_TM(_) => None,
-            MavMessage::RAW_EVENT_TC(_) => None,
-            MavMessage::ACK_TM(_) => None,
-            MavMessage::HR_TM(_) => None,
-            MavMessage::LR_TM(_) => None,
-            MavMessage::TELEMETRY_REQUEST_TC(_) => None,
-        }
-    }
-}
diff --git a/src/lynx.rs b/src/lynx.rs
new file mode 100644
index 0000000000000000000000000000000000000000..914e9b54601a7e74fe7022453ba21fe2e055afc5
--- /dev/null
+++ b/src/lynx.rs
@@ -0,0 +1,44 @@
+pub use crate::bindings::lynx::*;
+
+impl crate::Timestamp for MavMessage {
+    fn timestamp(&self) -> Option<u64> {
+        // NOTE: The following match statement is explicitly written to be
+        // exhaustive (if a new message is added, the compiler will complain)
+        match self {
+            MavMessage::FMM_TM(data) => Some(data.timestamp),
+            MavMessage::GPS_TM(data) => Some(data.timestamp),
+            MavMessage::TMTC_TM(data) => Some(data.timestamp),
+            MavMessage::TEST_TM(data) => Some(data.timestamp),
+            MavMessage::PIN_OBS_TM(data) => Some(data.timestamp),
+            MavMessage::PING_TC(data) => Some(data.timestamp),
+            MavMessage::HR_TM(data) => Some(data.timestamp),
+            MavMessage::SYS_TM(data) => Some(data.timestamp),
+            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
+            MavMessage::MS5803_TM(data) => Some(data.timestamp),
+            MavMessage::SENSORS_TM(data) => Some(data.timestamp),
+            MavMessage::NAS_TM(data) => Some(data.timestamp),
+            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::DPL_TM(data) => Some(data.timestamp),
+            MavMessage::ABK_TM(data) => Some(data.timestamp),
+            MavMessage::LIS3MDL_TM(data) => Some(data.timestamp),
+            MavMessage::BMX160_TM(data) => Some(data.timestamp),
+            MavMessage::ADA_TM(data) => Some(data.timestamp),
+            MavMessage::WINDTUNNEL_TM(data) => Some(data.timestamp),
+            MavMessage::ADC_TM(data) => Some(data.timestamp),
+            MavMessage::UPLOAD_SETTING_TC(_) => None,
+            MavMessage::ACK_TM(_) => None,
+            MavMessage::LR_TM(_) => None,
+            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
+            MavMessage::SET_REFERENCE_ALTITUDE(_) => None,
+            MavMessage::SET_INITIAL_ORIENTATION_TC(_) => None,
+            MavMessage::SET_AEROBRAKE_ANGLE_TC(_) => None,
+            MavMessage::SET_INITIAL_COORDINATES_TC(_) => None,
+            MavMessage::RAW_EVENT_TC(_) => None,
+            MavMessage::TELEMETRY_REQUEST_TC(_) => None,
+            MavMessage::START_LAUNCH_TC(_) => None,
+            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
+            MavMessage::NOARG_TC(_) => None,
+            MavMessage::NACK_TM(_) => None,
+        }
+    }
+}
diff --git a/src/lyra.rs b/src/lyra.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b3b46accb61351492084c3f1367d2f17bc48c93e
--- /dev/null
+++ b/src/lyra.rs
@@ -0,0 +1,64 @@
+pub use crate::bindings::lyra::*;
+
+impl crate::Timestamp for MavMessage {
+    fn timestamp(&self) -> Option<u64> {
+        // NOTE: The following match statement is explicitly written to be
+        // exhaustive (if a new message is added, the compiler will complain)
+        match self {
+            MavMessage::IMU_TM(data) => Some(data.timestamp),
+            MavMessage::ADC_TM(data) => Some(data.timestamp),
+            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
+            MavMessage::GPS_TM(data) => Some(data.timestamp),
+            MavMessage::TEMP_TM(data) => Some(data.timestamp),
+            MavMessage::ADA_TM(data) => Some(data.timestamp),
+            MavMessage::LOAD_TM(data) => Some(data.timestamp),
+            MavMessage::PING_TC(data) => Some(data.timestamp),
+            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
+            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
+            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
+            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::MEA_TM(data) => Some(data.timestamp),
+            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::PIN_TM(data) => Some(data.timestamp),
+            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
+            MavMessage::ARP_TM(data) => Some(data.timestamp),
+            MavMessage::NAS_TM(data) => Some(data.timestamp),
+            MavMessage::FSM_TM(data) => Some(data.timestamp),
+            MavMessage::GSE_TM(data) => Some(data.timestamp),
+            MavMessage::SYS_TM(data) => Some(data.timestamp),
+            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
+            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
+            MavMessage::RAW_EVENT_TC(_) => None,
+            MavMessage::SET_ORIENTATION_TC(_) => None,
+            MavMessage::CONRIG_STATE_TC(_) => None,
+            MavMessage::SET_ALGORITHM_TC(_) => None,
+            MavMessage::ROCKET_STATS_TM(_) => None,
+            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_STEPPER_STEPS_TC(_) => None,
+            MavMessage::ACK_TM(_) => None,
+            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
+            MavMessage::PAYLOAD_STATS_TM(_) => None,
+            MavMessage::COMMAND_TC(_) => None,
+            MavMessage::SERVO_TM(_) => None,
+            MavMessage::SET_ATOMIC_VALVE_TIMING_TC(_) => None,
+            MavMessage::WIGGLE_SERVO_TC(_) => None,
+            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
+            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
+            MavMessage::NACK_TM(_) => None,
+            MavMessage::RESET_SERVO_TC(_) => None,
+            MavMessage::SET_STEPPER_ANGLE_TC(_) => None,
+            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
+            MavMessage::SET_COORDINATES_TC(_) => None,
+            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
+            MavMessage::SET_IGNITION_TIME_TC(_) => None,
+            MavMessage::SET_ANTENNA_COORDINATES_ARP_TC(_) => None,
+            MavMessage::SET_ROCKET_COORDINATES_ARP_TC(_) => None,
+            MavMessage::MOTOR_TM(_) => None,
+            MavMessage::SENSOR_STATE_TM(_) => None,
+            MavMessage::SET_VALVE_MAXIMUM_APERTURE_TC(_) => None,
+        }
+    }
+}
diff --git a/src/pyxis.rs b/src/pyxis.rs
new file mode 100644
index 0000000000000000000000000000000000000000..304828dce0710bbdeb4ad9dc94b5289cdd7efbb4
--- /dev/null
+++ b/src/pyxis.rs
@@ -0,0 +1,52 @@
+pub use crate::bindings::pyxis::*;
+
+impl crate::Timestamp for MavMessage {
+    fn timestamp(&self) -> Option<u64> {
+        // NOTE: The following match statement is explicitly written to be
+        // exhaustive (if a new message is added, the compiler will complain)
+        match self {
+            MavMessage::LOAD_TM(data) => Some(data.timestamp),
+            MavMessage::ADA_TM(data) => Some(data.timestamp),
+            MavMessage::PRESSURE_TM(data) => Some(data.timestamp),
+            MavMessage::CURRENT_TM(data) => Some(data.timestamp),
+            MavMessage::SYS_TM(data) => Some(data.timestamp),
+            MavMessage::ADC_TM(data) => Some(data.timestamp),
+            MavMessage::MAVLINK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::ATTITUDE_TM(data) => Some(data.timestamp),
+            MavMessage::IMU_TM(data) => Some(data.timestamp),
+            MavMessage::ROCKET_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::FSM_TM(data) => Some(data.timestamp),
+            MavMessage::PING_TC(data) => Some(data.timestamp),
+            MavMessage::LOGGER_TM(data) => Some(data.timestamp),
+            MavMessage::GPS_TM(data) => Some(data.timestamp),
+            MavMessage::PIN_TM(data) => Some(data.timestamp),
+            MavMessage::PAYLOAD_FLIGHT_TM(data) => Some(data.timestamp),
+            MavMessage::NAS_TM(data) => Some(data.timestamp),
+            MavMessage::VOLTAGE_TM(data) => Some(data.timestamp),
+            MavMessage::TEMP_TM(data) => Some(data.timestamp),
+            MavMessage::RECEIVER_TM(data) => Some(data.timestamp),
+            MavMessage::TASK_STATS_TM(data) => Some(data.timestamp),
+            MavMessage::SET_SERVO_ANGLE_TC(_) => None,
+            MavMessage::SET_COORDINATES_TC(_) => None,
+            MavMessage::SET_TARGET_COORDINATES_TC(_) => None,
+            MavMessage::SET_REFERENCE_TEMPERATURE_TC(_) => None,
+            MavMessage::SET_ALGORITHM_TC(_) => None,
+            MavMessage::COMMAND_TC(_) => None,
+            MavMessage::SET_ORIENTATION_TC(_) => None,
+            MavMessage::SERVO_TM_REQUEST_TC(_) => None,
+            MavMessage::WIGGLE_SERVO_TC(_) => None,
+            MavMessage::SENSOR_STATE_TM(_) => None,
+            MavMessage::RAW_EVENT_TC(_) => None,
+            MavMessage::RESET_SERVO_TC(_) => None,
+            MavMessage::SET_REFERENCE_ALTITUDE_TC(_) => None,
+            MavMessage::SYSTEM_TM_REQUEST_TC(_) => None,
+            MavMessage::ACK_TM(_) => None,
+            MavMessage::SENSOR_TM_REQUEST_TC(_) => None,
+            MavMessage::SERVO_TM(_) => None,
+            MavMessage::PAYLOAD_STATS_TM(_) => None,
+            MavMessage::NACK_TM(_) => None,
+            MavMessage::SET_DEPLOYMENT_ALTITUDE_TC(_) => None,
+            MavMessage::ROCKET_STATS_TM(_) => None,
+        }
+    }
+}