diff --git a/data/common.css b/data/common.css
index 2f4d46c7..484f586c 100644
--- a/data/common.css
+++ b/data/common.css
@@ -11,6 +11,10 @@ sq_view.gr_polytonic {
     font-size: 2em;
 }
 
+sq_view.in_mal {
+    font-size: 1em;
+}
+
 sq_view.ir_azb {
     font-size: 1.368em;
 }
diff --git a/data/icons/zwj.svg b/data/icons/zwj.svg
new file mode 100644
index 00000000..3036b862
--- /dev/null
+++ b/data/icons/zwj.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/data/icons/zwsp.svg b/data/icons/zwsp.svg
new file mode 100644
index 00000000..e1bc1ad8
--- /dev/null
+++ b/data/icons/zwsp.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/data/keyboards/in+mal.yaml b/data/keyboards/in+mal.yaml
new file mode 100644
index 00000000..38bfc7d3
--- /dev/null
+++ b/data/keyboards/in+mal.yaml
@@ -0,0 +1,88 @@
+---
+outlines:
+    default:            { width: 29.44,  height: 44.5 }
+    altline:            { width: 58.88,  height: 44.5 }
+    change-view:        { width: 58.88,  height: 44.5 }
+    spaceline:          { width: 235.52, height: 44.5 }
+    special:            { width: 29.44,  height: 44.5 }
+    placeholder:        { width: 29.44,  height: 44.5 }
+
+views:
+    base:
+        - " ൊ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ ൦ - ൃ "
+        - " ൗ ൈ ാ ീ ൂ ബ ഹ ഗ ദ ജ ഡ zwj zwnj "
+        - " -- ോ േ ് ി ു പ ര ക ത ച ട zwsp "
+        - "Shift_L െ ം മ ന വ ല സ യ -- BackSpace"
+        - "show_numbers  preferences         space        Return"
+    upper:
+        - " ഒ ! @ # ₹ % ^ & ൾ ( ) ഃ ഋ "
+        - " ഔ ഐ ആ ഈ ഊ ഭ ങ ഘ ധ ഝ ഢ ഞ ർ "
+        - " -- ഓ ഏ അ ഇ ഉ ഫ റ ഖ ഥ ഛ ഠ -- "
+        - "Shift_L എ ൺ ണ ൻ ഴ ള ശ ഷ ൽ BackSpace"
+        - "show_numbers  preferences         space        Return"
+    numbers:
+        - " -- ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ ൦ -- -- "
+        - "-- 1 2 3 4 5 6 7 8 9 0 -- --"
+        - "-- @ # $ % & - _ + ( ) -- --"
+        - "show_symbols  ₹ , \" ' : ; ! ? --  BackSpace"
+        - "show_letters  preferences         space        Return"
+    symbols:
+        - "-- -- -- -- -- -- -- -- -- -- -- -- --"
+        - "-- ~ ` | · √ π τ ÷ × ¶ -- --"
+        - "-- © ® £ € ¥ ^ ° * { } -- --"
+        - "show_numbers  -- \\ / < > = [ ] -- BackSpace"
+        - "show_letters  preferences         space        Return"
+
+buttons:
+    Shift_L:
+        action:
+            locking:
+                lock_view: "upper"
+                unlock_view: "base"
+        outline: "change-view"
+        icon: "key-shift"
+    BackSpace:
+        outline: "altline"
+        icon: "edit-clear-symbolic"
+        action: "erase"
+    preferences:
+        action: "show_prefs"
+        outline: "special"
+        icon: "keyboard-mode-symbolic"
+    show_numbers:
+        action:
+            set_view: "numbers"
+        outline: "change-view"
+        label: "123"
+    show_letters:
+        action:
+            set_view: "base"
+        outline: "change-view"
+        label: "ABC"
+    show_symbols:
+        action:
+            set_view: "symbols"
+        outline: "change-view"
+        label: "*/="
+    space:
+        outline: "spaceline"
+        text: " "
+    Return:
+        outline: "altline"
+        icon: "key-enter"
+        keysym: "Return"
+    --:
+        outline: "placeholder"
+        text: ""
+# U+200B - zero-width-space
+    zwsp:
+        icon: "zwsp"
+        text: ""
+# U+200C - zero-width-non-joiner
+    zwnj:
+        icon: "zwnj"
+        text: ""
+# U+200D - zero-width-joiner
+    zwj:
+        icon: "zwj"
+        text: ""
diff --git a/data/keyboards/in+mal_wide.yaml b/data/keyboards/in+mal_wide.yaml
new file mode 100644
index 00000000..a92c5ab2
--- /dev/null
+++ b/data/keyboards/in+mal_wide.yaml
@@ -0,0 +1,88 @@
+---
+outlines:
+    default:            { width: 45.11,  height: 36.65 }
+    altline:            { width: 90.22,  height: 36.65 }
+    change-view:        { width: 90.22,  height: 36.65 }
+    spaceline:          { width: 360.88, height: 36.65 }
+    special:            { width: 45.11,  height: 36.65 }
+    placeholder:        { width: 45.11,  height: 36.65 }
+
+views:
+    base:
+        - " ൊ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ ൦ - ൃ "
+        - " ൗ ൈ ാ ീ ൂ ബ ഹ ഗ ദ ജ ഡ zwj zwnj "
+        - " -- ോ േ ് ി ു പ ര ക ത ച ട zwsp "
+        - "Shift_L െ ം മ ന വ ല സ യ -- BackSpace"
+        - "show_numbers  preferences         space        Return"
+    upper:
+        - " ഒ ! @ # ₹ % ^ & ൾ ( ) ഃ ഋ "
+        - " ഔ ഐ ആ ഈ ഊ ഭ ങ ഘ ധ ഝ ഢ ഞ ർ "
+        - " -- ഓ ഏ അ ഇ ഉ ഫ റ ഖ ഥ ഛ ഠ -- "
+        - "Shift_L എ ൺ ണ ൻ ഴ ള ശ ഷ ൽ BackSpace"
+        - "show_numbers  preferences         space        Return"
+    numbers:
+        - " -- ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ ൦ -- -- "
+        - "-- 1 2 3 4 5 6 7 8 9 0 -- --"
+        - "-- @ # $ % & - _ + ( ) -- --"
+        - "show_symbols  ₹ , \" ' : ; ! ? --  BackSpace"
+        - "show_letters  preferences         space        Return"
+    symbols:
+        - "-- -- -- -- -- -- -- -- -- -- -- -- --"
+        - "-- ~ ` | · √ π τ ÷ × ¶ -- --"
+        - "-- © ® £ € ¥ ^ ° * { } -- --"
+        - "show_numbers  -- \\ / < > = [ ] -- BackSpace"
+        - "show_letters  preferences         space        Return"
+
+buttons:
+    Shift_L:
+        action:
+            locking:
+                lock_view: "upper"
+                unlock_view: "base"
+        outline: "change-view"
+        icon: "key-shift"
+    BackSpace:
+        outline: "altline"
+        icon: "edit-clear-symbolic"
+        action: "erase"
+    preferences:
+        action: "show_prefs"
+        outline: "special"
+        icon: "keyboard-mode-symbolic"
+    show_numbers:
+        action:
+            set_view: "numbers"
+        outline: "change-view"
+        label: "123"
+    show_letters:
+        action:
+            set_view: "base"
+        outline: "change-view"
+        label: "ABC"
+    show_symbols:
+        action:
+            set_view: "symbols"
+        outline: "change-view"
+        label: "*/="
+    space:
+        outline: "spaceline"
+        text: " "
+    Return:
+        outline: "altline"
+        icon: "key-enter"
+        keysym: "Return"
+    --:
+        outline: "placeholder"
+        text: ""
+# U+200B - zero-width-space
+    zwsp:
+        icon: "zwsp"
+        text: ""
+# U+200C - zero-width-non-joiner
+    zwnj:
+        icon: "zwnj"
+        text: ""
+# U+200D - zero-width-joiner
+    zwj:
+        icon: "zwj"
+        text: ""
diff --git a/data/squeekboard.gresources.xml b/data/squeekboard.gresources.xml
index 71545134..0cc61e2c 100644
--- a/data/squeekboard.gresources.xml
+++ b/data/squeekboard.gresources.xml
@@ -8,6 +8,8 @@
    icons/key-enter.svg
    icons/key-shift.svg
    icons/keyboard-mode-symbolic.svg
+   icons/zwj.svg
    icons/zwnj.svg
+   icons/zwsp.svg
   
 
diff --git a/src/resources.rs b/src/resources.rs
index f241e9b4..c00d232f 100644
--- a/src/resources.rs
+++ b/src/resources.rs
@@ -87,6 +87,9 @@ static KEYBOARDS: &[(&'static str, &'static str)] = &[
     ("il", include_str!("../data/keyboards/il.yaml")),
     ("il_wide", include_str!("../data/keyboards/il_wide.yaml")),
     
+    ("in+mal", include_str!("../data/keyboards/in+mal.yaml")),
+    ("in+mal_wide", include_str!("../data/keyboards/in+mal_wide.yaml")),
+
     ("ir", include_str!("../data/keyboards/ir.yaml")),
     ("ir_wide", include_str!("../data/keyboards/ir_wide.yaml")),
 
diff --git a/tests/meson.build b/tests/meson.build
index d77f5f5d..75a1fa9b 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -80,12 +80,13 @@ foreach layout : [
     'es+cat', 'es+cat_wide',
     'fi', 'fi_wide',
     'fr', 'fr_wide',
+    'fr+bepo', 'fr+bepo_wide',
     'ge', 'ge_wide',
     'gr', 'gr_wide',
     'gr+polytonic', 'gr+polytonic_wide',
-    'fr+bepo', 'fr+bepo_wide',
     'hu', 'hu_wide',
     'il', 'il_wide',
+    'in+mal', 'in+mal_wide',
     'ir', 'ir_wide',
     'it', 'it_wide',
     'it+fur', 'it+fur_wide',