diff --git a/data/keyboards/de.yaml b/data/keyboards/de.yaml
index 2021f7d28b0390929a0995207f49412734f585db..66566289609a1fd4074bfe01b6bcb8e6546bb111 100644
--- a/data/keyboards/de.yaml
+++ b/data/keyboards/de.yaml
@@ -1,18 +1,11 @@
 # Maintained by: Mark Müller <markmueller86@gmail.com>
 ---
-bounds: { x: 0, y: 1, width: 360, height: 208 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 35.33, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 52.67, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 99.67, height: 52 }
-    special:
-        bounds: { x: 0, y: 0, width: 35.33, height: 52 }
+    default: { width: 35.33, height: 52 }
+    altline: { width: 52.67, height: 52 }
+    wide: { width: 62, height: 52 }
+    spaceline: { width: 99.67, height: 52 }
+    special: { width: 35.33, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/de_wide.yaml b/data/keyboards/de_wide.yaml
index a96596f9d1c54a337a1d4bd59f6d3cdc3c681567..1f6385573cb6de8f4048c58e2a3cabdf0ab7aa11 100644
--- a/data/keyboards/de_wide.yaml
+++ b/data/keyboards/de_wide.yaml
@@ -1,18 +1,11 @@
 # Maintained by: Mark Müller <markmueller86@gmail.com>
 ---
-bounds: { x: 0, y: 1, width: 540, height: 168 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 48, height: 42 }
-    altline:
-        bounds: { x: 0, y: 0, width: 81, height: 42 }
-    wide:
-        bounds: { x: 0, y: 0, width: 108, height: 42 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 216, height: 42 }
-    special:
-        bounds: { x: 0, y: 0, width: 48, height: 42 }
+    default: { width: 48, height: 42 }
+    altline: { width: 81, height: 42 }
+    wide: { width: 108, height: 42 }
+    spaceline: { width: 216, height: 42 }
+    special: { width: 48, height: 42 }
 
 views:
     base:
diff --git a/data/keyboards/el.yaml b/data/keyboards/el.yaml
index 70ec7be51c550a722814a37c091aa6ae4764d1b7..f24b207a72decce25510735c67a4eeb98816007a 100644
--- a/data/keyboards/el.yaml
+++ b/data/keyboards/el.yaml
@@ -2,19 +2,12 @@
 # University of the Aegean, Department of Mathematics, atsol@aegean.gr
 # Sep 2019
 ---
-bounds: { x: 0, y: 0.33, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 32, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    outline7:
-        bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
+    default: { width: 32, height: 52 }
+    altline: { width: 48.39024, height: 52 }
+    wide: { width: 62, height: 52 }
+    outline7: { width: 88.97561, height: 52 }
+    spaceline: { width: 150.5853, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/es.yaml b/data/keyboards/es.yaml
index 2d0212020c17a6228cb5a87c0d86ce66c3553ec5..bc7ba73f74a402d7f055eccc07d1d203bac7764f 100644
--- a/data/keyboards/es.yaml
+++ b/data/keyboards/es.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 1, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 35.33, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 52.67, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 99.67, height: 52 }
-    special:
-        bounds: { x: 0, y: 0, width: 44, height: 52 }
+    default: { width: 35.33, height: 52 }
+    altline: { width: 52.67, height: 52 }
+    wide: { width: 62, height: 52 }
+    spaceline: { width: 99.67, height: 52 }
+    special: { width: 44, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/fi.yaml b/data/keyboards/fi.yaml
index ce38007d5aad2a4a2cf577fe9c6877f8f9ecce76..ec972f47eeb4401cee7e585e8cc537af78efe830 100644
--- a/data/keyboards/fi.yaml
+++ b/data/keyboards/fi.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 0.33, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 32, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    outline7:
-        bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
+    default: { width: 32, height: 52 }
+    altline: { width: 48.39024, height: 52 }
+    wide: { width: 62, height: 52 }
+    outline7: { width: 88.97561, height: 52 }
+    spaceline: { width: 150.5853, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/it.yaml b/data/keyboards/it.yaml
index 54b6f19f67c18135952049ed6cc001ad18b46343..7a05ed461d9cc2cbe60f14958905bff7027ed1eb 100644
--- a/data/keyboards/it.yaml
+++ b/data/keyboards/it.yaml
@@ -1,19 +1,12 @@
 # Italian layout created by Antonio Pandolfo
 # 03 october 2019
 ---
-bounds: { x: 0, y: 1, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 35.33, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 52.67, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 99.67, height: 52 }
-    special:
-        bounds: { x: 0, y: 0, width: 44, height: 52 }
+    default: { width: 35.33, height: 52 }
+    altline: { width: 52.67, height: 52 }
+    wide: { width: 62, height: 52 }
+    spaceline: { width: 99.67, height: 52 }
+    special: { width: 44, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/jp+kana.yaml b/data/keyboards/jp+kana.yaml
index b20d2bf95015ce804b3f331d1f236c4598de708a..076a7db1c0aea08b5fc82073c38264841f574d25 100644
--- a/data/keyboards/jp+kana.yaml
+++ b/data/keyboards/jp+kana.yaml
@@ -1,18 +1,11 @@
 # Maintained by: Mark Müller <markmueller86@gmail.com>
 ---
-bounds: { x: 0, y: 1, width: 360, height: 208 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    default-wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    special:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
+    default: { width: 62, height: 52 }
+    default-wide: { width: 62, height: 52 }
+    altline: { width: 62, height: 52 }
+    wide: { width: 62, height: 52 }
+    special: { width: 62, height: 52 }
 
 views:
     base: # hiragana
diff --git a/data/keyboards/jp+kana_wide.yaml b/data/keyboards/jp+kana_wide.yaml
index de1635d6d2d876d8cc627ebf558da24dd26f02be..684cedfc3f790d30352ab1c274c944c1f35bdd71 100644
--- a/data/keyboards/jp+kana_wide.yaml
+++ b/data/keyboards/jp+kana_wide.yaml
@@ -1,18 +1,11 @@
 # Maintained by: Mark Müller <markmueller86@gmail.com>
 ---
-bounds: { x: 0, y: 1, width: 540, height: 168 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 62, height: 42 }
-    default-wide:
-        bounds: { x: 0, y: 0, width: 62, height: 42 }
-    altline:
-        bounds: { x: 0, y: 0, width: 62, height: 42 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 42 }
-    special:
-        bounds: { x: 0, y: 0, width: 62, height: 42 }
+    default: { width: 62, height: 42 }
+    default-wide: { width: 62, height: 42 }
+    altline: { width: 62, height: 42 }
+    wide: { width: 62, height: 42 }
+    special: { width: 62, height: 42 }
 
 views:
     base: # hiragana
diff --git a/data/keyboards/no.yaml b/data/keyboards/no.yaml
index 7a502501be9ffbbeda4fd3421561990ba641f9a5..27ff21ff2b8745ea4102172196ff77dc015bdac2 100644
--- a/data/keyboards/no.yaml
+++ b/data/keyboards/no.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 0.33, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 32, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    outline7:
-        bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
+    default: { width: 32, height: 52 }
+    altline: { width: 48.39024, height: 52 }
+    wide: { width: 62, height: 52 }
+    outline7: { width: 88.97561, height: 52 }
+    spaceline: { width: 150.5853, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/number.yaml b/data/keyboards/number.yaml
index 2f145aeb246137a877dc07b4bd7fc4786f621d93..3f672cd4b84f76fc36d46e701c4bd5f583a6508d 100644
--- a/data/keyboards/number.yaml
+++ b/data/keyboards/number.yaml
@@ -1,15 +1,9 @@
 ---
-bounds: { x: 0, y: 0.33, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 37.46341, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
-    outline7:
-        bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 120.5853, height: 52 }
+    default: { width: 37.46341, height: 52 }
+    altline: { width: 48.39024, height: 52 }
+    outline7: { width: 88.97561, height: 52 }
+    spaceline: { width: 120.5853, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/se.yaml b/data/keyboards/se.yaml
index dae7663fb9c35169150653ad62c572adee2904bb..0a0a127fd359b99d70400fc35b973de4b372a7b2 100644
--- a/data/keyboards/se.yaml
+++ b/data/keyboards/se.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 0.33, width: 360, height: 210 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 32, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 48.39024, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    outline7:
-        bounds: { x: 0, y: 0, width: 88.97561, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 150.5853, height: 52 }
+    default: { width: 32, height: 52 }
+    altline: { width: 48.39024, height: 52 }
+    wide: { width: 62, height: 52 }
+    outline7: { width: 88.97561, height: 52 }
+    spaceline: { width: 150.5853, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/us.yaml b/data/keyboards/us.yaml
index 4d195ba156a4bf8d8fa1da2f14bec60ff0aae26d..d150c48099eee8a949b3e1c7deaa8a35fd280b22 100644
--- a/data/keyboards/us.yaml
+++ b/data/keyboards/us.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 1, width: 360, height: 208 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 35.33, height: 52 }
-    altline:
-        bounds: { x: 0, y: 0, width: 52.67, height: 52 }
-    wide:
-        bounds: { x: 0, y: 0, width: 62, height: 52 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 142, height: 52 }
-    special:
-        bounds: { x: 0, y: 0, width: 44, height: 52 }
+    default: { width: 35.33, height: 52 }
+    altline: { width: 52.67, height: 52 }
+    wide: { width: 62, height: 52 }
+    spaceline: { width: 142, height: 52 }
+    special: { width: 44, height: 52 }
 
 views:
     base:
diff --git a/data/keyboards/us_wide.yaml b/data/keyboards/us_wide.yaml
index 1c1cc54ee3218ed708c63df57aad5833f2385a63..654db8f881e5be7fb024661ea30633eb010cf4f7 100644
--- a/data/keyboards/us_wide.yaml
+++ b/data/keyboards/us_wide.yaml
@@ -1,17 +1,10 @@
 ---
-bounds: { x: 0, y: 1, width: 540, height: 168 }
-
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 54, height: 42 }
-    altline:
-        bounds: { x: 0, y: 0, width: 81, height: 42 }
-    wide:
-        bounds: { x: 0, y: 0, width: 108, height: 42 }
-    spaceline:
-        bounds: { x: 0, y: 0, width: 216, height: 42 }
-    special:
-        bounds: { x: 0, y: 0, width: 54, height: 42 }
+    default: { width: 54, height: 42 }
+    altline: { width: 81, height: 42 }
+    wide: { width: 108, height: 42 }
+    spaceline: { width: 216, height: 42 }
+    special: { width: 54, height: 42 }
 
 views:
     base:
diff --git a/src/data.rs b/src/data.rs
index 54636f5703451bd69c1fec9f8b25ca3d383296b0..9aa1fc4b890cb43a3f481091fd83511889ecbbff 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -1,5 +1,7 @@
 /**! The parsing of the data files for layouts */
 
+// TODO: find a nice way to make sure non-positive sizes don't break layouts
+
 use std::cell::RefCell;
 use std::collections::{ HashMap, HashSet };
 use std::env;
@@ -216,21 +218,20 @@ fn load_layout_data_with_fallback(
 #[derive(Debug, Deserialize, PartialEq)]
 #[serde(deny_unknown_fields)]
 pub struct Layout {
-    /// FIXME: deprecate in favor of margins
-    bounds: Bounds,
+    #[serde(default)]
+    margins: Margins,
     views: HashMap<String, Vec<ButtonIds>>,
     #[serde(default)] 
     buttons: HashMap<String, ButtonMeta>,
     outlines: HashMap<String, Outline>
 }
 
-#[derive(Debug, Clone, Deserialize, PartialEq)]
+#[derive(Debug, Clone, Deserialize, PartialEq, Default)]
 #[serde(deny_unknown_fields)]
-struct Bounds {
-    x: f64,
-    y: f64,
-    width: f64,
-    height: f64,
+struct Margins {
+    top: f64,
+    bottom: f64,
+    side: f64,
 }
 
 /// Buttons are embedded in a single string
@@ -271,8 +272,8 @@ enum Action {
 #[derive(Debug, Clone, Deserialize, PartialEq)]
 #[serde(deny_unknown_fields)]
 struct Outline {
-    /// FIXME: replace with Size
-    bounds: Bounds,
+    width: f64,
+    height: f64,
 }
 
 /// Errors encountered loading the layout into yaml
@@ -460,10 +461,10 @@ impl Layout {
                 },
                 // FIXME: use a dedicated field
                 margins: layout::Margins {
-                    top: self.bounds.x,
-                    left: self.bounds.y,
-                    bottom: 0.0,
-                    right: self.bounds.y,
+                    top: self.margins.top,
+                    left: self.margins.side,
+                    bottom: self.margins.bottom,
+                    right: self.margins.side,
                 },
             }),
             warning_handler,
@@ -649,9 +650,7 @@ fn create_button<H: WarningHandler>(
             warning_handler.handle(
                 &format!("No default outline defined! Using 1x1!")
             );
-            Outline {
-                bounds: Bounds { x: 0f64, y: 0f64, width: 1f64, height: 1f64 },
-            }
+            Outline { width: 1f64, height: 1f64 }
         });
 
     layout::Button {
@@ -659,8 +658,8 @@ fn create_button<H: WarningHandler>(
         outline_name: CString::new(outline_name).expect("Bad outline"),
         // TODO: do layout before creating buttons
         size: layout::Size {
-            width: outline.bounds.width,
-            height: outline.bounds.height,
+            width: outline.width,
+            height: outline.height,
         },
         label: label,
         state: state,
@@ -686,7 +685,7 @@ mod tests {
         assert_eq!(
             Layout::from_file(PathBuf::from("tests/layout.yaml")).unwrap(),
             Layout {
-                bounds: Bounds { x: 0f64, y: 0f64, width: 0f64, height: 0f64 },
+                margins: Margins { top: 0f64, bottom: 0f64, side: 0f64 },
                 views: hashmap!(
                     "base".into() => vec!("test".into()),
                 ),
@@ -701,11 +700,7 @@ mod tests {
                     }
                 },
                 outlines: hashmap!{
-                    "default".into() => Outline {
-                        bounds: Bounds {
-                            x: 0f64, y: 0f64, width: 0f64, height: 0f64
-                        }, 
-                    }
+                    "default".into() => Outline { width: 0f64, height: 0f64 }, 
                 },
             }
         );
@@ -855,4 +850,21 @@ mod tests {
             },
         );
     }
+
+    #[test]
+    fn test_layout_margins() {
+        let out = Layout::from_file(PathBuf::from("tests/layout_margins.yaml"))
+            .unwrap()
+            .build(PanicWarn).0
+            .unwrap();
+        assert_eq!(
+            out.margins,
+            layout::Margins {
+                top: 1.0,
+                bottom: 3.0,
+                left: 2.0,
+                right: 2.0,
+            }
+        );
+    }
 }
diff --git a/src/layout.rs b/src/layout.rs
index b1d654fd6b83f52bfae3269f7ac637396b5a9862..950b234946e9626ec8b99b78fcd026c32a757118 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -99,7 +99,7 @@ pub mod c {
         }
     }
 
-    /// Scale + translate
+    /// Translate and then scale
     #[repr(C)]
     pub struct Transformation {
         pub origin_x: f64,
@@ -108,6 +108,14 @@ pub mod c {
     }
 
     impl Transformation {
+        /// Applies the new transformation after this one
+        pub fn chain(self, next: Transformation) -> Transformation {
+            Transformation {
+                origin_x: self.origin_x + self.scale * next.origin_x,
+                origin_y: self.origin_y + self.scale * next.origin_y,
+                scale: self.scale * next.scale,
+            }
+        }
         fn forward(&self, p: Point) -> Point {
             Point {
                 x: (p.x - self.origin_x) / self.scale,
@@ -195,7 +203,8 @@ pub mod c {
         println!("{:?}", button);
     }
     
-    /// Positions the layout within the available space
+    /// Positions the layout contents within the available space.
+    /// The origin of the transformation is the point inside the margins.
     #[no_mangle]
     pub extern "C"
     fn squeek_layout_calculate_transformation(
@@ -204,15 +213,10 @@ pub mod c {
         allocation_height: f64,
     ) -> Transformation {
         let layout = unsafe { &*layout };
-        let size = layout.calculate_size();
-        let h_scale = allocation_width / size.width;
-        let v_scale = allocation_height / size.height;
-        let scale = if h_scale < v_scale { h_scale } else { v_scale };
-        Transformation {
-            origin_x: (allocation_width - (scale * size.width)) / 2.0,
-            origin_y: (allocation_height - (scale * size.height)) / 2.0,
-            scale: scale,
-        }
+        layout.calculate_transformation(Size {
+            width: allocation_width,
+            height: allocation_height,
+        })
     }
     
     #[no_mangle]
@@ -427,7 +431,7 @@ pub struct ButtonPlace<'a> {
     offset: c::Point,
 }
 
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct Size {
     pub width: f64,
     pub height: f64,
@@ -560,6 +564,7 @@ pub enum ArrangementKind {
     Wide = 1,
 }
 
+#[derive(Debug, PartialEq)]
 pub struct Margins {
     pub top: f64,
     pub bottom: f64,
@@ -713,7 +718,8 @@ impl Layout {
         };
     }
 
-    fn calculate_size(&self) -> Size {
+    /// Calculates size without margins
+    fn calculate_inner_size(&self) -> Size {
         Size {
             height: find_max_double(
                 self.views.iter(),
@@ -725,6 +731,39 @@ impl Layout {
             ),
         }
     }
+
+    /// Size including margins
+    fn calculate_size(&self) -> Size {
+        let inner_size = self.calculate_inner_size();
+        Size {
+            width: self.margins.left + inner_size.width + self.margins.right,
+            height: (
+                self.margins.top
+                + inner_size.height
+                + self.margins.bottom
+            ),
+        }
+    }
+    
+    pub fn calculate_transformation(
+        &self,
+        available: Size,
+    ) -> c::Transformation {
+        let size = self.calculate_size();
+        let h_scale = available.width / size.width;
+        let v_scale = available.height / size.height;
+        let scale = if h_scale < v_scale { h_scale } else { v_scale };
+        let outside_margins = c::Transformation {
+            origin_x: (available.width - (scale * size.width)) / 2.0,
+            origin_y: (available.height - (scale * size.height)) / 2.0,
+            scale: scale,
+        };
+        outside_margins.chain(c::Transformation {
+            origin_x: self.margins.left,
+            origin_y: self.margins.top,
+            scale: 1.0,
+        })
+    }
 }
 
 mod procedures {
@@ -907,4 +946,58 @@ mod test {
                 .is_none()
         );
     }
+
+    #[test]
+    fn check_bottom_margin() {
+        // just one button
+        let view = View::new(vec![
+            (
+                0.0,
+                Row {
+                    angle: 0,
+                    buttons: vec![(
+                        0.0,
+                        Box::new(Button {
+                            size: Size { width: 1.0, height: 1.0 },
+                            ..*make_button_with_state("foo".into(), make_state())
+                        }),
+                    )]
+                },
+            ),
+        ]);
+        let layout = Layout {
+            current_view: String::new(),
+            keymap_str: CString::new("").unwrap(),
+            kind: ArrangementKind::Base,
+            locked_keys: HashSet::new(),
+            pressed_keys: HashSet::new(),
+            // Lots of bottom margin
+            margins: Margins {
+                top: 0.0,
+                left: 0.0,
+                right: 0.0,
+                bottom: 1.0,
+            },
+            views: hashmap! {
+                String::new() => view,
+            },
+        };
+        assert_eq!(
+            layout.calculate_inner_size(),
+            Size { width: 1.0, height: 1.0 }
+        );
+        assert_eq!(
+            layout.calculate_size(),
+            Size { width: 1.0, height: 2.0 }
+        );
+        // Don't change those values randomly!
+        // They take advantage of incidental precise float representation
+        // to even be comparable.
+        let transformation = layout.calculate_transformation(
+            Size { width: 2.0, height: 2.0 }
+        );
+        assert_eq!(transformation.scale, 1.0);
+        assert_eq!(transformation.origin_x, 0.5);
+        assert_eq!(transformation.origin_y, 0.0);
+    }
 }
diff --git a/tests/layout.yaml b/tests/layout.yaml
index d7ccc7b9abd6376151e63886a0e7bd1d6bb1ce8b..c750510a07b09101d4b12319cd1507c250be87d2 100644
--- a/tests/layout.yaml
+++ b/tests/layout.yaml
@@ -1,15 +1,9 @@
 ---
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 views:
     base:
         - "test"
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
 buttons:
     test:
diff --git a/tests/layout2.yaml b/tests/layout2.yaml
index f8610ddbc20b9405952b3824c5ac36e0d13d233d..de72bb84e89200041aed575c5fa248590c2cac53 100644
--- a/tests/layout2.yaml
+++ b/tests/layout2.yaml
@@ -1,11 +1,5 @@
 ---
 # missing views
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
diff --git a/tests/layout3.yaml b/tests/layout3.yaml
index 8065d4d02c4ec1bf83d2150c842a76eceac40ac9..75c67bf6e5305d25c76939c75c754ba719da84b2 100644
--- a/tests/layout3.yaml
+++ b/tests/layout3.yaml
@@ -1,15 +1,9 @@
 ---
 # extra field
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 views:
     base:
         - "test"
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
 bad_field: false
diff --git a/tests/layout_key1.yaml b/tests/layout_key1.yaml
index 89de08c6de8ec715a04ac62416b7316428ddcae7..2c67ff907a3a4916e4f60e873cc177ff9a1b6954 100644
--- a/tests/layout_key1.yaml
+++ b/tests/layout_key1.yaml
@@ -1,16 +1,10 @@
 ---
 # punctuation
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 views:
     base:
         - "."
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
 buttons:
     ".":
diff --git a/tests/layout_key2.yaml b/tests/layout_key2.yaml
index a8372fc8c88a3ed1147211968a6b912cfda98524..8a50415a420ee2b499b687a393412e6ebb9300d6 100644
--- a/tests/layout_key2.yaml
+++ b/tests/layout_key2.yaml
@@ -1,16 +1,10 @@
 ---
 # punctuation
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 views:
     base:
         - "Ã¥"
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
 buttons:
     å:
diff --git a/tests/layout_key3.yaml b/tests/layout_key3.yaml
index 34383848c570423dbcb283937bc635f2024c41d1..6a4586e5a886a0d84c912d0126038359a952d2ee 100644
--- a/tests/layout_key3.yaml
+++ b/tests/layout_key3.yaml
@@ -1,14 +1,8 @@
 ---
 # punctuation
-bounds:
-    x: 0
-    y: 0
-    width: 0
-    height: 0
 views:
     base:
         - "か゚" # 2 codepoints
 outlines:
-    default:
-        bounds: { x: 0, y: 0, width: 0, height: 0 }
+    default: { width: 0, height: 0 }
 
diff --git a/tests/layout_margins.yaml b/tests/layout_margins.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3a704da733f93bf0affa6649ae30a77c6fafab20
--- /dev/null
+++ b/tests/layout_margins.yaml
@@ -0,0 +1,9 @@
+---
+# Margins present
+margins: { top: 1, side: 2, bottom: 3 }
+views:
+    base:
+        - "test"
+outlines:
+    default: { width: 1, height: 1 }
+
diff --git a/tests/layout_position.yaml b/tests/layout_position.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3a704da733f93bf0affa6649ae30a77c6fafab20
--- /dev/null
+++ b/tests/layout_position.yaml
@@ -0,0 +1,9 @@
+---
+# Margins present
+margins: { top: 1, side: 2, bottom: 3 }
+views:
+    base:
+        - "test"
+outlines:
+    default: { width: 1, height: 1 }
+