diff --git a/data/keyboards/es+cat.yaml b/data/keyboards/es+cat.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9be5325808a8466b6a725567028216b4e04c238f
--- /dev/null
+++ b/data/keyboards/es+cat.yaml
@@ -0,0 +1,87 @@
+---
+outlines:
+    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:
+        - "q w e r t y u i o p"
+        - "a s d f g h j k l ç"
+        - "Shift_L   z x c v b n m  BackSpace"
+        - "show_numbers show_eschars preferences         space        ? period Return"
+    upper:
+        - "Q W E R T Y U I O P"
+        - "A S D F G H J K L Ç"
+        - "Shift_L   Z X C V B N M  BackSpace"
+        - "show_numbers show_eschars preferences         space        ¿ period Return"
+    numbers:
+        - "1 2 3 4 5 6 7 8 9 0"
+        - "@ # € % & - _ + ( )"
+        - "show_symbols   , \" ' colon ; ! = BackSpace"
+        - "show_letters show_eschars preferences         space        ? period Return"
+    symbols:
+        - "~ ` | · √ π τ ÷ × ¶"
+        - "© ® £ $ ¥ ^ ° * { }"
+        - "show_numbers   \\ / < > = [ ]  BackSpace"
+        - "show_letters show_eschars preferences         space        ? period Return"
+    eschars:
+        - "á é í ó ú Á É Í Ó Ú"
+        - "à è ì ò ù À È Ì Ò Ù"
+        - "show_numbers ü ç ï Ü Ç Ï ¡  BackSpace"
+        - "show_letters show_eschars preferences         space        « » Return"
+
+buttons:
+    Shift_L:
+        action:
+            locking:
+                lock_view: "upper"
+                unlock_view: "base"
+        outline: "altline"
+        icon: "key-shift"
+    BackSpace:
+        outline: "altline"
+        icon: "edit-clear-symbolic"
+        action: "erase"
+    preferences:
+        action: "show_prefs"
+        outline: "default"
+        icon: "keyboard-mode-symbolic"
+    show_numbers:
+        action:
+            set_view: "numbers"
+        outline: "altline"
+        label: "123"
+    show_letters:
+        action:
+            set_view: "base"
+        outline: "altline"
+        label: "abc"
+    show_symbols:
+        action:
+            set_view: "symbols"
+        outline: "altline"
+        label: "*/="
+    show_eschars:
+        action:
+            locking:
+                lock_view: "eschars"
+                unlock_view: "base"
+        outline: "altline"
+        label: "àÀ"
+
+    period:
+        outline: "default"
+        text: "."
+    space:
+        outline: "spaceline"
+        text: " "
+    Return:
+        outline: "altline"
+        icon: "key-enter"
+        keysym: "Return"
+    colon:
+        text: ":"
+
diff --git a/src/resources.rs b/src/resources.rs
index 298877a6f8c92d69dc8c8b9c6725e0be507dcafc..dc07ed6d07a5e1a8c881cbfffd28d1d7c050f2b5 100644
--- a/src/resources.rs
+++ b/src/resources.rs
@@ -39,6 +39,7 @@ const KEYBOARDS: &[(*const str, *const str)] = &[
     ("epo", include_str!("../data/keyboards/epo.yaml")),
 
     ("es", include_str!("../data/keyboards/es.yaml")),
+    ("es+cat", include_str!("../data/keyboards/es+cat.yaml")),
 
     ("fi", include_str!("../data/keyboards/fi.yaml")),
 
diff --git a/tests/meson.build b/tests/meson.build
index 01f0dbe25f04b50ab1c14f07d22847dc39f90277..1ff09448038a2d885a95f6da572842492349e502 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -67,6 +67,7 @@ foreach layout : [
     'dk',
     'epo',
     'es',
+    'es+cat',
     'fi',
     'fr', 'fr_wide',
     'gr',