diff --git a/.gitignore b/.gitignore
index 45f7d5708d689f77c2f325da11361bb2cbfbaf8e..1b68824dff166d8db16494aa0f99c6a9486f21cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,4 +33,8 @@
 
 # ide folder & virtual environments
 .venv/
-.vscode
\ No newline at end of file
+.vscode
+
+# rust specific
+target
+Cargo.lock
diff --git a/README.md b/README.md
index 622286ba057250f524a39886e45bf59f856541b3..4ba347a48251bcd2fa652e74a3696afd6f4b5a6a 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,7 @@
 # mavlink_skyward_lib
+
 Repo containing Skyward's implementation of the Mavlink protocol:
 
 * `message_definitions` - XML files describing the available messages
-
 * `mavlink_lib ` - corresponding C header files, generated with `pymavlink`
-
-
-
+* `mavlink_rust` - Rust library of the Mavlink protocol
diff --git a/mavlink_rust/Cargo.toml b/mavlink_rust/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..7533590ca562b050fa597ecd00247d5b8745d428
--- /dev/null
+++ b/mavlink_rust/Cargo.toml
@@ -0,0 +1,32 @@
+[package]
+name = "skyward_mavlink"
+version = "0.1.0"
+authors = ["Federico Lolli <federico.lolli@skywarder.eu>"]
+edition = "2021"
+license = "MIT"
+
+[dependencies]
+num-traits = { version = "0.2.18", default-features = false }
+num-derive = "0.4.2"
+bitflags = "2.4.2"
+serde = { version = "1.0.197", optional = true }
+serde_arrays = { version = "0.1.0", optional = true }
+
+[dependencies.mavlink-core]
+git = "https://github.com/mavlink/rust-mavlink.git"
+rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f"
+
+[build-dependencies.mavlink-bindgen]
+git = "https://github.com/mavlink/rust-mavlink.git"
+rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f"
+
+[features]
+default = ["lyra"]
+lyra = []
+gemini = []
+pyxis = []
+lynx = []
+hermes = []
+r2a = []
+test = []
+serde = ["dep:serde", "dep:serde_arrays"]
diff --git a/mavlink_rust/build.rs b/mavlink_rust/build.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7090f512a3ebdf919faba1e10cdddf2a5256830a
--- /dev/null
+++ b/mavlink_rust/build.rs
@@ -0,0 +1,13 @@
+#![recursion_limit = "256"]
+
+use std::env;
+
+pub fn main() {
+    let out_path = env::var("OUT_DIR").unwrap();
+
+    let result = mavlink_bindgen::generate("../message_definitions", out_path)
+        .expect("Failed to generate Rust MAVLink bindings");
+
+    mavlink_bindgen::format_generated_code(&result);
+    mavlink_bindgen::emit_cargo_build_messages(&result);
+}
diff --git a/mavlink_rust/src/lib.rs b/mavlink_rust/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7269b9ae4c6dbeea97db4ec83f28fefbf0251567
--- /dev/null
+++ b/mavlink_rust/src/lib.rs
@@ -0,0 +1,6 @@
+mod bindings {
+    include!(concat!(env!("OUT_DIR"), "/mod.rs"));
+}
+
+pub use bindings::*;
+pub use mavlink_core as mavlink;