diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py
index 386eaad2b5963a7751fc42e69f8d4c72479b7126..e0125ee64e7ac3f20f31255958037b12af21f993 100644
--- a/src/modules/bootloader/main.py
+++ b/src/modules/bootloader/main.py
@@ -9,6 +9,7 @@
 #   Copyright 2014, Benjamin Vaudour <benjamin.vaudour@yahoo.fr>
 #   Copyright 2014, Kevin Kofler <kevin.kofler@chello.at>
 #   Copyright 2015, Philip Mueller <philm@manjaro.org>
+#   Copyright 2016, Teo Mrnjavac <teo@kde.org>
 #
 #   Calamares is free software: you can redistribute it and/or modify
 #   it under the terms of the GNU General Public License as published by
@@ -23,11 +24,11 @@
 #   You should have received a copy of the GNU General Public License
 #   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
 
-import libcalamares
-
 import os
 import subprocess
 
+import libcalamares
+
 from libcalamares.utils import check_target_env_call
 
 
@@ -192,8 +193,9 @@ def install_grub(efi_directory, fw_type):
     """
     if fw_type == "efi":
         print("Bootloader: grub (efi)")
-        efi_directory_firmware = efi_directory + "/EFI"
-        check_target_env_call(["mkdir", "-p", "{!s}".format(efi_directory)])
+
+        if not os.path.isdir(efi_directory):
+            check_target_env_call(["mkdir", "-p", "{!s}".format(efi_directory)])
 
         if "efiBootloaderId" in libcalamares.job.configuration:
             efi_bootloader_id = libcalamares.job.configuration["efiBootloaderId"]
@@ -216,11 +218,23 @@ def install_grub(efi_directory, fw_type):
                                "--efi-directory={!s}".format(efi_directory),
                                "--bootloader-id={!s}".format(efi_bootloader_id),
                                "--force"])
+
+        # VFAT is weird, see issue CAL-385
+        efi_directory_firmware = case_insensitive_subdir(efi_directory,
+                                                         ["EFI", "Efi", "efi"])
+        if not efi_directory_firmware:
+            efi_directory_firmware = os.path.join(efi_directory, "EFI")
+
+        efi_boot_directory = case_insensitive_subdir(efi_directory_firmware,
+                                                     ["Boot", "boot", "BOOT"])
+        if not efi_boot_directory:
+            efi_boot_directory = os.path.join(efi_directory_firmware, "boot")
+            check_target_env_call(["mkdir", "-p", efi_boot_directory])
+
         # Workaround for some UEFI firmwares
-        check_target_env_call(["mkdir", "-p", "{!s}/boot".format(efi_directory_firmware)])
-        check_target_env_call(["cp", "{!s}/{!s}/grubx64.efi".format(efi_directory_firmware,
-                                                                    efi_bootloader_id),
-                               "{!s}/boot/bootx64.efi".format(efi_directory_firmware)])
+        check_target_env_call(["cp",
+                               os.path.join(efi_directory_firmware, efi_bootloader_id, "grubx64.efi"),
+                               os.path.join(efi_boot_directory, "bootx64.efi")])
     else:
         print("Bootloader: grub (bios)")
         boot_loader = libcalamares.globalstorage.value("bootLoader")
@@ -237,6 +251,13 @@ def install_grub(efi_directory, fw_type):
                            libcalamares.job.configuration["grubCfg"]])
 
 
+def case_insensitive_subdir(parent, candidate_dirnames):
+    for dirname in candidate_dirnames:
+        if os.path.isdir(os.path.join(parent, dirname)):
+            return os.path.join(parent, dirname)
+    return ""
+
+
 def prepare_bootloader(fw_type):
     """ Prepares bootloader and set proper flags to EFI boot partition (esp,boot).
     Based on value 'efi_boot_loader', it either calls systemd-boot or grub to be installed.