diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b57687e9dfc5e5f3ab3e419f12bcb66bfacf221..83a04f3f62dae193e9ff485f06556b1f254dd64e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 - `Tileset::source` for obtaining where the tileset actually came from.
 - `Tileset::columns`.
-- `Layer::id`, `Layer::width` and `Layer::height`.
+- `Layer::id`, `Layer::width`, `Layer::height`, `Layer::parallax_x` and `Layer::parallax_y`.
 - Support for 'object'-type properties.
 - Support for multiline string properties.
 - Documentation for map members.
diff --git a/assets/tiled_parallax.tmx b/assets/tiled_parallax.tmx
new file mode 100644
index 0000000000000000000000000000000000000000..c0d811d63cbf4254b8fc6195b610f5458e025c0c
--- /dev/null
+++ b/assets/tiled_parallax.tmx
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.5" tiledversion="1.7.1" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="4" nextobjectid="1">
+ <tileset firstgid="1" source="tilesheet.tsx"/>
+ <layer id="3" name="Background" width="10" height="10" parallaxx="0.5" parallaxy="0.75">
+  <data encoding="csv">
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+48,49,50,48,49,50,48,49,50,0,
+62,63,64,62,63,64,62,63,64,0,
+76,77,78,76,77,78,76,77,78,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0
+</data>
+ </layer>
+ <layer id="2" name="Middle" width="10" height="10">
+  <data encoding="csv">
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,6,7,8,0,0,0,0,0,
+0,0,20,21,22,0,6,7,8,0,
+0,0,34,35,36,0,20,21,22,0,
+0,0,0,0,0,0,34,35,36,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0
+</data>
+ </layer>
+ <layer id="1" name="Foreground" width="10" height="10" parallaxx="2" parallaxy="2">
+  <data encoding="csv">
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0
+</data>
+ </layer>
+</map>
\ No newline at end of file
diff --git a/src/layers.rs b/src/layers.rs
index faa5f601af59604d7c81405d346af52c86622c75..b5c0b653a8064a0029a1731567b63abd66370ad8 100644
--- a/src/layers.rs
+++ b/src/layers.rs
@@ -65,6 +65,8 @@ pub struct Layer {
     pub visible: bool,
     pub offset_x: f32,
     pub offset_y: f32,
+    pub parallax_x: f32,
+    pub parallax_y: f32,
     pub opacity: f32,
     pub properties: Properties,
     pub layer_type: LayerType,
@@ -78,13 +80,15 @@ impl Layer {
         infinite: bool,
         path_relative_to: Option<&Path>,
     ) -> Result<Self, TiledError> {
-        let ((opacity, visible, offset_x, offset_y, name, id), ()) = get_attrs!(
+        let ((opacity, visible, offset_x, offset_y, parallax_x, parallax_y, name, id), ()) = get_attrs!(
             attrs,
             optionals: [
                 ("opacity", opacity, |v:String| v.parse().ok()),
                 ("visible", visible, |v:String| v.parse().ok().map(|x:i32| x == 1)),
                 ("offsetx", offset_x, |v:String| v.parse().ok()),
                 ("offsety", offset_y, |v:String| v.parse().ok()),
+                ("parallaxx", parallax_x, |v:String| v.parse().ok()),
+                ("parallaxy", parallax_y, |v:String| v.parse().ok()),
                 ("name", name, |v| Some(v)),
                 ("id", id, |v:String| v.parse().ok()),
             ],
@@ -113,6 +117,8 @@ impl Layer {
             visible: visible.unwrap_or(true),
             offset_x: offset_x.unwrap_or(0.0),
             offset_y: offset_y.unwrap_or(0.0),
+            parallax_x: parallax_x.unwrap_or(1.0),
+            parallax_y: parallax_y.unwrap_or(1.0),
             opacity: opacity.unwrap_or(1.0),
             name: name.unwrap_or_default(),
             id: id.unwrap_or(0),
diff --git a/tests/lib.rs b/tests/lib.rs
index 46bb347c91bf980896ca748b59934aaf8fc339be..4954b84a8bc2ba2b4d41567b43a4888b8c89738f 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -217,6 +217,31 @@ fn test_ldk_export() {
     }
 }
 
+#[test]
+fn test_parallax_layers() {
+    let r = Map::parse_file("assets/tiled_parallax.tmx").unwrap();
+    for (i, layer) in r.layers.iter().enumerate() {
+        match i {
+            0 => {
+                assert_eq!(layer.name, "Background");
+                assert_eq!(layer.parallax_x, 0.5);
+                assert_eq!(layer.parallax_y, 0.75);
+            }
+            1 => {
+                assert_eq!(layer.name, "Middle");
+                assert_eq!(layer.parallax_x, 1.0);
+                assert_eq!(layer.parallax_y, 1.0);
+            }
+            2 => {
+                assert_eq!(layer.name, "Foreground");
+                assert_eq!(layer.parallax_x, 2.0);
+                assert_eq!(layer.parallax_y, 2.0);
+            }
+            _ => panic!("unexpected layer"),
+        }
+    }
+}
+
 #[test]
 fn test_object_property() {
     let r = parse_map_without_source(&Path::new("assets/tiled_object_property.tmx")).unwrap();