diff --git a/.travis.yml b/.travis.yml
index e6890903552e030ed9d2b8d45a5f36799e320819..8d0c9aeffa2b3714358672200a76b1f61a966891 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -58,7 +58,7 @@ jobs:
     ## Define the rest of the matrix based on Kitchen testing
     # Make sure the instances listed below match up with
     # the `platforms` defined in `kitchen.yml`
-    # - env: INSTANCE=tomcat-install-debian-10-master-py3
+    - env: INSTANCE=tomcat-install-debian-10-master-py3
     - env: INSTANCE=tomcat-install-ubuntu-1804-master-py3
     # - env: INSTANCE=tomcat-extend-ubuntu-1804-master-py3
     # - env: INSTANCE=tomcat-install-centos-8-master-py3
diff --git a/.yamllint b/.yamllint
index 61c747d35fb2f361182bdf7a678379cb28898c21..e80ebacdf03ceb17b2b6f6e7812548b691605d69 100644
--- a/.yamllint
+++ b/.yamllint
@@ -12,7 +12,7 @@ ignore: |
   node_modules/
   test/**/states/**/*.sls
   .kitchen/
-  tomcat/osmap.yaml
+  tomcat/osfamilymap.yaml
 
 yaml-files:
   # Default settings
diff --git a/test/integration/tomcat_install/controls/packages_spec.rb b/test/integration/tomcat_install/controls/packages_spec.rb
index a5190b70d8e8f97401284367c1ed9fff1382876f..2a93d78ea169c11a89929e6b58be60d703130864 100644
--- a/test/integration/tomcat_install/controls/packages_spec.rb
+++ b/test/integration/tomcat_install/controls/packages_spec.rb
@@ -7,7 +7,12 @@ control 'Tomcat packages' do
   packages =
     case platform[:family]
     when 'debian'
-      %w[tomcat8 haveged]
+      case platform[:release]
+      when /^10/
+        %w[tomcat9 haveged]
+      else
+        %w[tomcat8 haveged]
+      end
     when 'redhat', 'fedora', 'suse'
       %w[tomcat]
     end
diff --git a/test/integration/tomcat_install/controls/services_spec.rb b/test/integration/tomcat_install/controls/services_spec.rb
index 088a70e63a4cb0fd90717259bfb752ee57a2a525..32b814de24a832fbbcd02f9eb36f9738d885a0f0 100644
--- a/test/integration/tomcat_install/controls/services_spec.rb
+++ b/test/integration/tomcat_install/controls/services_spec.rb
@@ -8,7 +8,12 @@ control 'Tomcat services' do
   services =
     case platform[:family]
     when 'debian'
-      %w[tomcat8 haveged]
+      case platform[:release]
+      when /^10/
+        %w[tomcat9 haveged]
+      else
+        %w[tomcat8 haveged]
+      end
     when 'redhat', 'fedora', 'suse'
       %w[tomcat]
     end
diff --git a/test/integration/tomcat_install/controls/yaml_dump_spec.rb b/test/integration/tomcat_install/controls/yaml_dump_spec.rb
index b27838a2e3445c141f91c3bec3f526f29620c1c6..7723adda660b4212d269315e2e1612980d2b355c 100644
--- a/test/integration/tomcat_install/controls/yaml_dump_spec.rb
+++ b/test/integration/tomcat_install/controls/yaml_dump_spec.rb
@@ -7,7 +7,28 @@ control 'Tomcat `map.jinja` YAML dump' do
   yaml_dump +=
     case platform[:family]
     when 'debian'
+      case platform[:release]
+      when /^10/
+        conf_dir = '/etc/tomcat9'
+        group = 'tomcat'
+        main_config = '/etc/default/tomcat9'
+        manager_pkg = 'tomcat9-admin'
+        pkg = 'tomcat9'
+        service = 'tomcat9'
+        user = 'tomcat'
+        ver = 9
+      else
+        conf_dir = '/etc/tomcat8'
+        group = 'tomcat8'
+        main_config = '/etc/default/tomcat8'
+        manager_pkg = 'tomcat8-admin'
+        pkg = 'tomcat8'
+        service = 'tomcat8'
+        user = 'tomcat8'
+        ver = 8
+      end
       <<~YAML_DUMP.chomp
+        arch: amd64
         authbind: 'no'
         catalina_base: /usr/share/tomcat
         catalina_home: /usr/share/tomcat
@@ -15,7 +36,7 @@ control 'Tomcat `map.jinja` YAML dump' do
         catalina_tmpdir: /var/cache/tomcat/temp
         cluster:
           simple: true
-        conf_dir: /etc/tomcat8
+        conf_dir: #{conf_dir}
         connectors:
           example_connector:
             port: 8443
@@ -72,7 +93,7 @@ control 'Tomcat `map.jinja` YAML dump' do
               global: simpleValue
               type: java.lang.Integer
         expires_when: 2 weeks
-        group: tomcat8
+        group: #{group}
         haveged_enabled: true
         id:
         - example.com
@@ -91,7 +112,7 @@ control 'Tomcat `map.jinja` YAML dump' do
           soft: 64000
         logfile_compress: 1
         logfile_days: 14
-        main_config: /etc/default/tomcat8
+        main_config: #{main_config}
         main_config_template: salt://tomcat/files/tomcat-default-Debian.template
         manager:
           roles:
@@ -110,7 +131,7 @@ control 'Tomcat `map.jinja` YAML dump' do
               - manager-script
               - manager-jmx
               - manager-status
-        manager_pkg: tomcat8-admin
+        manager_pkg: #{manager_pkg}
         native_pkg: libtcnative-1
         other_contexts:
           other-contexts:
@@ -137,10 +158,10 @@ control 'Tomcat `map.jinja` YAML dump' do
                   className: org.apache.catalina.webresources.DirResourceSet
                   base: /var/lib/tomcat8/appconfig
                   webAppMount: /WEB-INF/classes
-        pkg: tomcat8
+        pkg: #{pkg}
         resources: {}
         security: 'no'
-        service: tomcat8
+        service: #{service}
         service_enabled: true
         service_running: false
         sites:
@@ -175,12 +196,13 @@ control 'Tomcat `map.jinja` YAML dump' do
               pattern: '%h %l %u %t &quot;%m http://%v%U %H&quot; %s %b &quot;%{Referer}i&quot;
                 &quot;%{User-Agent}i&quot; %D'
             - className: org.apache.catalina.authenticator.SingleSignOn
-        user: tomcat8
-        ver: 8
+        user: #{user}
+        ver: #{ver}
         with_haveged: true
       YAML_DUMP
     when 'redhat', 'fedora'
       <<~YAML_DUMP.chomp
+        arch: amd64
         authbind: 'no'
         catalina_base: /usr/share/tomcat
         catalina_home: /usr/share/tomcat
@@ -354,6 +376,7 @@ control 'Tomcat `map.jinja` YAML dump' do
       YAML_DUMP
     when 'suse'
       <<~YAML_DUMP.chomp
+        arch: amd64
         authbind: 'no'
         catalina_base: /usr/share/tomcat
         catalina_home: /usr/share/tomcat
diff --git a/tomcat/codenamemap.yaml b/tomcat/codenamemap.yaml
deleted file mode 100644
index 9e4d14980c9383aee49e7d16c506cdcd757e1398..0000000000000000000000000000000000000000
--- a/tomcat/codenamemap.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: ft=yaml
----
-trusty:
-  ver: 7
-  pkg: tomcat7
-  manager_pkg: tomcat7-admin
-  conf_dir: /etc/tomcat7
-  main_config: /etc/default/tomcat7
-  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
-  service: tomcat7
-  user: tomcat7
-  group: tomcat7
-wheezy:
-  pkg: tomcat7
-  manager_pkg: tomcat7-admin
-  conf_dir: /etc/tomcat7
-  main_config: /etc/default/tomcat7
-  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
-  service: tomcat7
-  user: tomcat7
-  group: tomcat7
diff --git a/tomcat/map.jinja b/tomcat/map.jinja
index 987ca2423532d87a274a7f4b0e5f3d0a628578f2..d1fcea567b2e63cd9220453fa0bf3a4534a59245 100644
--- a/tomcat/map.jinja
+++ b/tomcat/map.jinja
@@ -1,25 +1,49 @@
 # -*- coding: utf-8 -*-
 # vim: ft=jinja
 
-{% import_yaml "tomcat/defaults.yaml" as defaults %}
-{% import_yaml "tomcat/osmap.yaml" as osmap %}
-{% import_yaml "tomcat/codenamemap.yaml" as codemap %}
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{#- Start imports as #}
+{%- import_yaml tplroot ~ "/defaults.yaml" as default_settings %}
+{%- import_yaml tplroot ~ "/osarchmap.yaml" as osarchmap %}
+{%- import_yaml tplroot ~ "/osfamilymap.yaml" as osfamilymap %}
+{%- import_yaml tplroot ~ "/osmap.yaml" as osmap %}
+{%- import_yaml tplroot ~ "/osfingermap.yaml" as osfingermap %}
 
-{# get the settings for the os_family grain #}
-{% set osfam = salt['grains.filter_by'](osmap) or {} %}
-{# get the settings for the oscodename grain, os_family data will override
-    oscodename data #}
-{% set oscode = salt['grains.filter_by'](codemap,
-                                         grain='oscodename',
-                                         merge=osfam) or {} %}
+{#- Retrieve the config dict only once #}
+{%- set _config = salt['config.get'](tplroot, default={}) %}
 
-{# merge the os family/codename specific data over the defaults #}
-{% do defaults.tomcat.update(oscode) %}
+{%- set defaults = salt['grains.filter_by'](
+      default_settings,
+      default=tplroot,
+      merge=salt['grains.filter_by'](
+        osarchmap,
+        grain='osarch',
+        merge=salt['grains.filter_by'](
+          osfamilymap,
+          grain='os_family',
+          merge=salt['grains.filter_by'](
+            osmap,
+            grain='os',
+            merge=salt['grains.filter_by'](
+              osfingermap,
+              grain='osfinger',
+              merge=salt['grains.filter_by'](
+                _config,
+                default='lookup'
+              )
+            )
+          )
+        )
+      )
+    )
+%}
 
-{# merge the pillar:lookup dict into the defaults/os specific dict #}
-{% set lookup = salt['pillar.get']('tomcat:lookup',
-                                   default=defaults.tomcat,
-                                   merge=True) %}
+{%- set config = salt['grains.filter_by'](
+      {'defaults': defaults},
+      default='defaults',
+      merge=_config
+    )
+%}
 
-{# merge the actual tomcat pillar into the above combined dict #}
-{% set tomcat = salt['pillar.get']('tomcat', default=lookup, merge=True) %}
+{%- set tomcat = config %}
diff --git a/tomcat/osarchmap.yaml b/tomcat/osarchmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ab3bc1f4b23ddbb5eecb9b2a9bc18102e1215227
--- /dev/null
+++ b/tomcat/osarchmap.yaml
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+#
+# Setup variables using grains['osarch'] based logic.
+# You just need to add the key:values for an `osarch` that differ
+# from `defaults.yaml`.
+# Only add an `osarch` which is/will be supported by the formula.
+#
+# If you do not need to provide defaults via the `osarch` grain,
+# you will need to provide at least an empty dict in this file, e.g.
+# osarch: {}
+---
+amd64:
+  arch: amd64
+
+x86_64:
+  arch: amd64
+
+386:
+  arch: 386
+
+arm64:
+  arch: arm64
+
+armv6l:
+  arch: armv6l
+
+armv7l:
+  arch: armv7l
+
+ppc64le:
+  arch: ppc64le
+
+s390x:
+  arch: s390x
diff --git a/tomcat/osfamilymap.yaml b/tomcat/osfamilymap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bdec0c6466ab473c54b234d7e26201c6a7cacada
--- /dev/null
+++ b/tomcat/osfamilymap.yaml
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+Debian:
+  ver: 8
+  pkg: tomcat8
+  native_pkg: libtcnative-1
+  manager_pkg: tomcat8-admin
+  with_haveged: true
+  haveged_enabled: true
+  conf_dir: /etc/tomcat8
+  main_config: /etc/default/tomcat8
+  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
+  service: tomcat8
+  user: tomcat8
+  group: tomcat8
+  java_home: /usr/lib/jvm/default-java
+
+RedHat:
+  native_pkg: tomcat-native
+  manager_pkg: tomcat-admin-webapps
+  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
+
+Suse:
+  ver: 8
+  native_pkg: libtcnative-1-0
+  manager_pkg: tomcat-admin-webapps
+  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
+
+Gentoo: {}
+
+Arch:
+  pkg: tomcat8
+  ver: 8
+  service: tomcat8
+  native_pkg: tomcat-native
+  conf_dir: /etc/tomcat8
+  main_config: /usr/lib/systemd/system/tomcat8.service
+  main_config_template: salt://tomcat/files/tomcat-default-Arch.template
+  user: tomcat8
+  group: tomcat8
+  java_home: /usr/lib/jvm/default-runtime
+  jvm_tmp: /var/tmp/tomcat8/temp
+  catalina_pid: /var/run/tomcat8.pid
+  catalina_base: /usr/share/tomcat8
+  catalina_home: /usr/share/tomcat8
+  # Not used on Arch
+  manager_pkg: ''
+
+Alpine: {}
+
+FreeBSD:
+  native_pkg: tomcat-native
+  ini_config: /etc/rc.conf
+  java_home: /usr
+
+OpenBSD: {}
+
+Solaris: {}
+
+Windows: {}
+
+{%- if grains.os == 'MacOS' %}
+{%-   if salt['cmd.run']('/usr/libexec/java_home -F', output_loglevel="quiet") == 0 %}
+{%-     set darwin_javahome = salt['cmd.run']('/usr/libexec/java_home') %}
+{%-   else %}
+{%-     set darwin_javahome = "" %}
+{%-   endif %}
+MacOS:
+  # yamllint disable rule:line-length
+  user: {{ salt['pillar.get']('tomcat:user', salt['cmd.run']("stat -f '%Su' /dev/console")) }}
+  group: {{ salt['pillar.get']('tomcat:group', salt['cmd.run']("stat -f '%Sg' /dev/console")) }}
+  # yamllint enable rule:line-length
+
+  java_home: {{ darwin_javahome }}
+  service: homebrew.mxcl.tomcat
+  ver: 8
+  pkg: tomcat
+  native_pkg: tomcat-native
+  conf_dir: /usr/local/opt/tomcat/libexec/conf
+  main_config: /usr/local/opt/tomcat/libexec/bin/setenv.sh
+  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
+  limits_prefix: /Library/LaunchAgents/maxfiles.plist
+  jvm_tmp: /usr/local/opt/tomcat/libexec/temp
+  catalina_base: /usr/local/opt/tomcat/libexec
+  catalina_home: /usr/local/opt/tomcat/libexec
+  catalina_tmpdir: /usr/local/opt/tomcat/libexec/temp
+
+  # Not used on Darwin
+  manager_pkg: ''
+  with_haveged: false
+  haveged_enabled: false
+
+  # Not verified on Darwin
+  cluster:
+    simple: false
+
+{%- endif %}
diff --git a/tomcat/osfingermap.yaml b/tomcat/osfingermap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f1e70a6695d4317092d47cb2c94fb0ac71406bc2
--- /dev/null
+++ b/tomcat/osfingermap.yaml
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# os: Debian
+Debian-10:
+  ver: 9
+  pkg: tomcat9
+  manager_pkg: tomcat9-admin
+  conf_dir: /etc/tomcat9
+  main_config: /etc/default/tomcat9
+  service: tomcat9
+  user: tomcat
+  group: tomcat
+Debian-9: {}
+Debian-8: {}
+Debian-7:
+  pkg: tomcat7
+  manager_pkg: tomcat7-admin
+  conf_dir: /etc/tomcat7
+  main_config: /etc/default/tomcat7
+  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
+  service: tomcat7
+  user: tomcat7
+  group: tomcat7
+
+# os: Ubuntu
+Ubuntu-18.04: {}
+Ubuntu-16.04: {}
+Ubuntu-14.04:
+  ver: 7
+  pkg: tomcat7
+  manager_pkg: tomcat7-admin
+  conf_dir: /etc/tomcat7
+  main_config: /etc/default/tomcat7
+  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
+  service: tomcat7
+  user: tomcat7
+  group: tomcat7
+
+# os: Fedora
+Fedora-31: {}
+Fedora-30: {}
+
+# os: CentOS
+CentOS Linux-8: {}
+CentOS Linux-7: {}
+CentOS-6: {}
+
+# os: Amazon
+Amazon Linux-2: {}
+Amazon Linux AMI-2018: {}
+
+# os: SUSE
+Leap-15: {}
+
+# os: FreeBSD
+FreeBSD-12: {}
+
+# os: Windows
+Windows-8.1: {}
+
+# os: Gentoo
+Gentoo-2: {}
diff --git a/tomcat/osmap.yaml b/tomcat/osmap.yaml
index bc5bcd983540044fb1224970fb8d29a7afb96279..de11a67327c8df5c87f623d5f594bfd8ea414ed4 100644
--- a/tomcat/osmap.yaml
+++ b/tomcat/osmap.yaml
@@ -1,93 +1,33 @@
 # -*- coding: utf-8 -*-
 # vim: ft=yaml
+#
+# Setup variables using grains['os'] based logic.
+# You just need to add the key:values for an `os` that differ
+# from `defaults.yaml` + `osarch.yaml` + `os_family.yaml`.
+# Only add an `os` which is/will be supported by the formula.
+#
+# If you do not need to provide defaults via the `os` grain,
+# you will need to provide at least an empty dict in this file, e.g.
+# osmap: {}
 ---
-Debian:
-  ver: 8
-  pkg: tomcat8
-  native_pkg: libtcnative-1
-  manager_pkg: tomcat8-admin
-  with_haveged: true
-  haveged_enabled: true
-  conf_dir: /etc/tomcat8
-  main_config: /etc/default/tomcat8
-  main_config_template: salt://tomcat/files/tomcat-default-Debian.template
-  service: tomcat8
-  user: tomcat8
-  group: tomcat8
-  java_home: /usr/lib/jvm/default-java
-RedHat:
-  native_pkg: tomcat-native
-  manager_pkg: tomcat-admin-webapps
-  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
-CentOS:
-  native_pkg: tomcat-native
-  manager_pkg: tomcat-admin-webapps
-  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
-openSUSE:
-  ver: 8
-  native_pkg: libtcnative-1-0
-  manager_pkg: tomcat-admin-webapps
-  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
-Suse:
-  ver: 8
-  native_pkg: libtcnative-1-0
-  manager_pkg: tomcat-admin-webapps
-  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
-FreeBSD:
-  native_pkg: tomcat-native
-  ini_config: /etc/rc.conf
-  java_home: /usr
-Arch:
-  pkg: tomcat8
-  ver: 8
-  service: tomcat8
-  native_pkg: tomcat-native
-  conf_dir: /etc/tomcat8
-  main_config: /usr/lib/systemd/system/tomcat8.service
-  main_config_template: salt://tomcat/files/tomcat-default-Arch.template
-  user: tomcat8
-  group: tomcat8
-  java_home: /usr/lib/jvm/default-runtime
-  jvm_tmp: /var/tmp/tomcat8/temp
-  catalina_pid: /var/run/tomcat8.pid
-  catalina_base: /usr/share/tomcat8
-  catalina_home: /usr/share/tomcat8
-  # Not used on Arch
-  manager_pkg: ''
+# os_family: Debian
+Ubuntu: {}
+Raspbian: {}
 
-{%- if grains.os == 'MacOS' %}
-{%-   if salt['cmd.run']('/usr/libexec/java_home -F', output_loglevel="quiet") == 0 %}
-{%-     set darwin_javahome = salt['cmd.run']('/usr/libexec/java_home') %}
-{%-   else %}
-{%-     set darwin_javahome = "" %}
-{%-   endif %}
-MacOS:
-  # yamllint disable rule:line-length
-  user: {{ salt['pillar.get']('tomcat:user', salt['cmd.run']("stat -f '%Su' /dev/console")) }}
-  group: {{ salt['pillar.get']('tomcat:group', salt['cmd.run']("stat -f '%Sg' /dev/console")) }}
-  # yamllint enable rule:line-length
+# os_family: RedHat
+Fedora: {}
+CentOS: {}
+Amazon: {}
 
-  java_home: {{ darwin_javahome }}
-  service: homebrew.mxcl.tomcat
-  ver: 8
-  pkg: tomcat
-  native_pkg: tomcat-native
-  conf_dir: /usr/local/opt/tomcat/libexec/conf
-  main_config: /usr/local/opt/tomcat/libexec/bin/setenv.sh
-  main_config_template: salt://tomcat/files/tomcat-default-CentOS.template
-  limits_prefix: /Library/LaunchAgents/maxfiles.plist
-  jvm_tmp: /usr/local/opt/tomcat/libexec/temp
-  catalina_base: /usr/local/opt/tomcat/libexec
-  catalina_home: /usr/local/opt/tomcat/libexec
-  catalina_tmpdir: /usr/local/opt/tomcat/libexec/temp
+# os_family: Suse
+SUSE: {}
+openSUSE: {}
 
-  # Not used on Darwin
-  manager_pkg: ''
-  with_haveged: false
-  haveged_enabled: false
+# os_family: Gentoo
+Funtoo: {}
 
-  # Not verified on Darwin
-  cluster:
-    simple: false
+# os_family: Arch
+Manjaro: {}
 
-{%- endif %}
+# os_family: Solaris
+SmartOS: {}