diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py
index 4a5a93f6097e1255714a61007f4bc627b63558d6..4cb66713c8112569407f46302b899c766d05965e 100644
--- a/src/modules/bootloader/main.py
+++ b/src/modules/bootloader/main.py
@@ -136,7 +136,11 @@ def get_kernel_params(uuid):
 
     cryptdevice_params = []
 
-    have_dracut = libcalamares.utils.target_env_call(["sh", "-c", "which dracut"]) == 0
+    has_dracut = libcalamares.utils.target_env_call(["sh", "-c", "which dracut"]) == 0
+    uses_systemd_hook = libcalamares.utils.target_env_call(["sh", "-c",
+                                                            "grep -q \"^HOOKS.*systemd\" /etc/mkinitcpio.conf"]) == 0
+    use_systemd_naming = has_dracut or uses_systemd_hook
+
 
     # Take over swap settings:
     #  - unencrypted swap partition sets swap_uuid
@@ -154,7 +158,7 @@ def get_kernel_params(uuid):
             swap_outer_uuid = partition["luksUuid"]
 
         if partition["mountPoint"] == "/" and has_luks:
-            if have_dracut:
+            if use_systemd_naming or uses_sd_encrypt:
                 cryptdevice_params = [f"rd.luks.uuid={partition['luksUuid']}"]
             else:
                 cryptdevice_params = [f"cryptdevice=UUID={partition['luksUuid']}:{partition['luksMapperName']}"]
@@ -187,7 +191,7 @@ def get_kernel_params(uuid):
     if swap_uuid:
         kernel_params.append("resume=UUID={!s}".format(swap_uuid))
 
-    if have_dracut and swap_outer_uuid:
+    if use_systemd_naming and swap_outer_uuid:
         kernel_params.append(f"rd.luks.uuid={swap_outer_uuid}")
 
     if swap_outer_mappername:
diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py
index d325766f649e6b24f23c2644c503f4e1309365eb..82b1837f8f8084a13fa90aebc7d80ad4b92ee9bd 100644
--- a/src/modules/grubcfg/main.py
+++ b/src/modules/grubcfg/main.py
@@ -135,10 +135,12 @@ def modify_grub_default(partitions, root_mount_point, distributor):
     plymouth_bin = libcalamares.utils.target_env_call(
         ["sh", "-c", "which plymouth"]
         )
-
+    uses_systemd_hook = libcalamares.utils.target_env_call(
+        ["sh", "-c", "grep -q \"^HOOKS.*systemd\" /etc/mkinitcpio.conf"]
+        ) == 0
     # Shell exit value 0 means success
     have_plymouth = plymouth_bin == 0
-    have_dracut = dracut_bin == 0
+    use_systemd_naming = dracut_bin == 0 or uses_systemd_hook
 
     use_splash = ""
     swap_uuid = ""
@@ -159,7 +161,7 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 
     cryptdevice_params = []
 
-    if have_dracut:
+    if use_systemd_naming:
         for partition in partitions:
             if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
                 # Skip foreign swap
@@ -174,6 +176,8 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 
             if partition["mountPoint"] == "/" and has_luks:
                 cryptdevice_params = [f"rd.luks.uuid={partition['luksUuid']}"]
+                if not unencrypted_separate_boot and uses_systemd_hook:
+                    cryptdevice_params.append("rd.luks.key=/crypto_keyfile.bin")
     else:
         for partition in partitions:
             if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
@@ -210,7 +214,7 @@ def modify_grub_default(partitions, root_mount_point, distributor):
     if swap_uuid:
         kernel_params.append(f"resume=UUID={swap_uuid}")
 
-    if have_dracut and swap_outer_uuid:
+    if use_systemd_naming and swap_outer_uuid:
         kernel_params.append(f"rd.luks.uuid={swap_outer_uuid}")
     if swap_outer_mappername:
         kernel_params.append(f"resume=/dev/mapper/{swap_outer_mappername}")
diff --git a/src/modules/initcpiocfg/main.py b/src/modules/initcpiocfg/main.py
index 57dc5e432a144a86a18c26958a88ea5b96c0c0fd..821d6e5ee0e6665c484dfeddf96bc0b3eb8d2385 100644
--- a/src/modules/initcpiocfg/main.py
+++ b/src/modules/initcpiocfg/main.py
@@ -37,6 +37,16 @@ def detect_plymouth():
     return target_env_call(["sh", "-c", "which plymouth"]) == 0
 
 
+def detect_setfont():
+    """
+    Checks existence (runnability) of setfont in the target system.
+
+    @return True if setfont exists in the target, False otherwise
+    """
+    # Used to only check existence of path /usr/bin/setfont in target
+    return target_env_call(["sh", "-c", "which setfont"]) == 0
+
+
 class cpuinfo(object):
     """
     Object describing the current CPU's characteristics. It may be
@@ -108,7 +118,7 @@ def get_host_initcpio():
     return mklins
 
 
-def write_mkinitcpio_lines(hooks, modules, files, root_mount_point):
+def write_mkinitcpio_lines(hooks, modules, files, binaries, root_mount_point):
     """
     Set up mkinitcpio.conf.
 
@@ -122,10 +132,12 @@ def write_mkinitcpio_lines(hooks, modules, files, root_mount_point):
     target_path = os.path.join(root_mount_point, "etc/mkinitcpio.conf")
     with open(target_path, "w") as mkinitcpio_file:
         for line in mklins:
-            # Replace HOOKS, MODULES and FILES lines with what we
+            # Replace HOOKS, MODULES, BINARIES and FILES lines with what we
             # have found via find_initcpio_features()
             if line.startswith("HOOKS"):
                 line = 'HOOKS="{!s}"'.format(' '.join(hooks))
+            elif line.startswith("BINARIES"):
+                line = 'BINARIES="{!s}"'.format(' '.join(binaries))
             elif line.startswith("MODULES"):
                 line = 'MODULES="{!s}"'.format(' '.join(modules))
             elif line.startswith("FILES"):
@@ -145,18 +157,30 @@ def find_initcpio_features(partitions, root_mount_point):
     :return 3-tuple of lists
     """
     hooks = [
-        "base",
-        "udev",
         "autodetect",
         "kms",
         "modconf",
         "block",
         "keyboard",
-        "keymap",
-        "consolefont",
     ]
+    uses_systemd = target_env_call(["sh", "-c", "which systemd-cat"]) == 0
+
+    if uses_systemd:
+        hooks.insert(0, "systemd")
+        hooks.append("sd-vconsole")
+    else:
+        hooks.insert(0, "udev")
+        hooks.insert(0, "base")
+        hooks.append("keymap")
+        hooks.append("consolefont")
+
     modules = []
     files = []
+    binaries = []
+
+    if detect_setfont():
+        # Fixes "setfont: KDFONTOP: Function not implemented" error
+        binaries.append("setfont")
 
     swap_uuid = ""
     uses_btrfs = False
@@ -193,22 +217,19 @@ def find_initcpio_features(partitions, root_mount_point):
         if partition["mountPoint"] == "/" and "luksMapperName" in partition:
             encrypt_hook = True
 
-        if (partition["mountPoint"] == "/boot" and "luksMapperName" not in partition):
+        if partition["mountPoint"] == "/boot" and "luksMapperName" not in partition:
             unencrypted_separate_boot = True
 
         if partition["mountPoint"] == "/usr":
             hooks.append("usr")
 
     if encrypt_hook:
-        if detect_plymouth() and unencrypted_separate_boot:
-            hooks.append("plymouth-encrypt")
+        if uses_systemd:
+            hooks.append("sd-encrypt")
         else:
             hooks.append("encrypt")
         crypto_file = "crypto_keyfile.bin"
-        if not unencrypted_separate_boot and \
-           os.path.isfile(
-               os.path.join(root_mount_point, crypto_file)
-               ):
+        if not unencrypted_separate_boot and os.path.isfile(os.path.join(root_mount_point, crypto_file)):
             files.append(f"/{crypto_file}")
 
     if uses_lvm2:
@@ -229,7 +250,7 @@ def find_initcpio_features(partitions, root_mount_point):
     else:
         hooks.append("fsck")
 
-    return (hooks, modules, files)
+    return (hooks, modules, files, binaries)
 
 
 def run():
@@ -250,7 +271,7 @@ def run():
         return (_("Configuration Error"),
                 _("No root mount point for <pre>initcpiocfg</pre>."))
 
-    hooks, modules, files = find_initcpio_features(partitions, root_mount_point)
-    write_mkinitcpio_lines(hooks, modules, files, root_mount_point)
+    hooks, modules, files, binaries = find_initcpio_features(partitions, root_mount_point)
+    write_mkinitcpio_lines(hooks, modules, files, binaries, root_mount_point)
 
     return None