diff --git a/openssh/map.jinja b/openssh/map.jinja
index 0a0fc88..b16d816 100644
--- a/openssh/map.jinja
+++ b/openssh/map.jinja
@@ -1,24 +1,28 @@
 {% if pillar.openssh.get('client', {}).get('enabled', False) %}
-{% set local_hosts = salt['pillar.get']('linux:network:host') %}  {# Get all defined hosts #}
-{% set root_public_key = salt['pillar.get']('_param:root_public_key')|replace('ssh-rsa', '') %}  {# Get root's public key #}
-{% set root = salt['pillar.get'](key='openssh:client:user:root', default={}) %} {# Get predefined root user pillar data if there are any #}
-{% if root.known_hosts is not defined %}
-  {% do root.update({'known_hosts': []}) %} {# Prepare empty list if missing so it can be appended later #}
-{% endif %}
-{% for host_name, host in local_hosts.iteritems() %}  {# Iterate through all defined hosts #}
-  {% if host.address is defined %}
-    {% set new_host = {'name': host.address, 'host_public_key': root_public_key, 'type': 'ssh-rsa'} %}
-    {% do root['known_hosts'].append(new_host) %} {# Add the host to the list of known hosts #}
-  {% endif %}
-  {% for hostname in host.get('names', []) %}  {# Do the same again, but this time with all hostnames instead of IP addresses #}
-    {% set new_host = {'name': hostname, 'host_public_key': root_public_key, 'type': 'ssh-rsa'} %}
-    {% do root['known_hosts'].append(new_host) %}
+  {% set root = {} %}
+  {% set local_nodes = {} %}
+  {% for node_name, node_grains in salt['mine.get']('*', 'grains.items').iteritems() %} {# Get all fingerprints from mine #}
+    {% if node_grains.ssh_fingerprints is defined and node_grains.ssh_fingerprints is mapping %}
+      {% do local_nodes.update({node_grains.fqdn: node_grains.ssh_fingerprints}) %} {# Add host record with its full hostname #}
+      {% for ip_addr in node_grains.fqdn_ip4 %}
+        {% do local_nodes.update({ip_addr: node_grains.ssh_fingerprints}) %} {# Add host record with its IP address #}
+      {% endfor %}
+      {% do local_nodes.update({node_grains.nodename: node_grains.ssh_fingerprints}) %} {# Add host record with its short hostname #}
+    {% endif %}
   {% endfor %}
-{% endfor %}
-{% if root['user'] is not defined %}
-  {% do root.update({'user': {}}) %}
-  {% do root['user'].update({'name': 'root', 'home': '/root'}) %}  {# If remaining required data is not configured yet, do it now. #}
-{% endif %}
+  {% if local_nodes|length > 0 %}
+    {% if root.known_hosts is not defined %}
+      {% do root.update({'known_hosts': []}) %} {# Prepare empty list if missing so it can be appended later #}
+    {% endif %}
+    {% for host_name, fingerprints in local_nodes.iteritems() %}  {# Iterate through all defined hosts #}
+      {% set new_host = {'name': host_name, 'type': 'ssh-rsa', 'fingerprint': fingerprints.rsa, 'fingerprint_hash_type': 'md5'} %} {# Prepare new host record #}
+      {% do root['known_hosts'].append(new_host) %} {# Add the new host to the list of known hosts #}
+    {% endfor %}
+  {% endif %}
+  {% if root['user'] is not defined %}
+    {% do root.update({'user': {}}) %}
+    {% do root['user'].update({'name': 'root', 'home': '/root'}) %}  {# If remaining required data is not configured yet, do it now. #}
+  {% endif %}
 {% endif %}
 
 {% set server = salt['grains.filter_by']({
