diff --git a/README.md b/README.md
index 00454ca..e4cae43 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ Only [link](http://wiki.ros.org/urdf/XML/link) and [joint](http://wiki.ros.org/u
You can access urdf elements like below example.
```rust
-let urdf_robo = urdf_rs::read_file("sample.urdf").unwrap();
+let urdf_robo = urdf_rs::urdf::read_file("samples/sample.urdf").unwrap();
let links = urdf_robo.links;
println!("{:?}", links[0].visual[0].origin.xyz);
let joints = urdf_robo.joints;
diff --git a/samples/minimal.sdf b/samples/minimal.sdf
new file mode 100644
index 0000000..27ee29c
--- /dev/null
+++ b/samples/minimal.sdf
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample.urdf b/samples/sample.urdf
similarity index 100%
rename from sample.urdf
rename to samples/sample.urdf
diff --git a/src/common.rs b/src/common.rs
new file mode 100644
index 0000000..a4c3338
--- /dev/null
+++ b/src/common.rs
@@ -0,0 +1,5 @@
+mod elements;
+pub use elements::*;
+
+mod space_seperated_vectors;
+pub use space_seperated_vectors::*;
diff --git a/src/common/elements.rs b/src/common/elements.rs
new file mode 100644
index 0000000..e9c861a
--- /dev/null
+++ b/src/common/elements.rs
@@ -0,0 +1,38 @@
+use crate::common::space_seperated_vectors::*;
+use serde::Deserialize;
+
+#[derive(Debug, Deserialize, Default, Clone)]
+pub struct Mass {
+ pub value: f64,
+}
+
+#[derive(Deserialize, Debug, Clone)]
+pub struct Vec3 {
+ #[serde(with = "ss_vec3")]
+ pub data: [f64; 3],
+}
+
+#[derive(Debug, Deserialize, Default, Clone)]
+pub struct ColorRGBA {
+ #[serde(with = "ss_vec4")]
+ pub rgba: [f64; 4],
+}
+
+#[derive(Debug, Deserialize, Default, Clone)]
+pub struct ColorRGB {
+ #[serde(with = "ss_vec3")]
+ pub rgba: [f64; 3],
+}
+
+#[derive(Debug, Deserialize, Clone)]
+pub struct Texture {
+ pub filename: String,
+}
+
+impl Default for Texture {
+ fn default() -> Texture {
+ Texture {
+ filename: "".to_string(),
+ }
+ }
+}
diff --git a/src/common/space_seperated_vectors.rs b/src/common/space_seperated_vectors.rs
new file mode 100644
index 0000000..b7d3f5e
--- /dev/null
+++ b/src/common/space_seperated_vectors.rs
@@ -0,0 +1,68 @@
+pub mod ss_vec3 {
+ use serde::{self, Deserialize, Deserializer};
+ pub fn deserialize<'a, D>(deserializer: D) -> Result<[f64; 3], D::Error>
+ where
+ D: Deserializer<'a>,
+ {
+ let s = String::deserialize(deserializer)?;
+ let vec = s
+ .split(' ')
+ .filter_map(|x| x.parse::().ok())
+ .collect::>();
+ if vec.len() != 3 {
+ return Err(serde::de::Error::custom(format!(
+ "failed to parse float array in {s}"
+ )));
+ }
+ let mut arr = [0.0f64; 3];
+ arr.copy_from_slice(&vec);
+ Ok(arr)
+ }
+}
+
+pub mod ss_option_vec3 {
+ use serde::{self, Deserialize, Deserializer};
+ pub fn deserialize<'a, D>(deserializer: D) -> Result