diff --git a/Makefile.am b/Makefile.am
index bc41c353dbe11639d256d7819e23ad907da02cb3..9d693566a35832a489311581b8b6ca181d7d310d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -377,6 +377,7 @@ lib/_autoconf.py: Makefile stamp-directories
 	  echo "SSH_INITD_SCRIPT = '$(SSH_INITD_SCRIPT)'"; \
 	  echo "EXPORT_DIR = '$(EXPORT_DIR)'"; \
 	  echo "OS_SEARCH_PATH = [$(OS_SEARCH_PATH)]"; \
+	  echo "XEN_BOOTLOADER = '$(XEN_BOOTLOADER)'"; \
 	  echo "XEN_KERNEL = '$(XEN_KERNEL)'"; \
 	  echo "XEN_INITRD = '$(XEN_INITRD)'"; \
 	  echo "FILE_STORAGE_DIR = '$(FILE_STORAGE_DIR)'"; \
@@ -397,6 +398,7 @@ $(REPLACE_VARS_SED): Makefile stamp-directories
 	  echo 's#@BINDIR@#$(bindir)#g'; \
 	  echo 's#@SBINDIR@#$(sbindir)#g'; \
 	  echo 's#@GANETI_VERSION@#$(PACKAGE_VERSION)#g'; \
+	  echo 's#@CUSTOM_XEN_BOOTLOADER@#$(XEN_BOOTLOADER)#g'; \
 	  echo 's#@CUSTOM_XEN_KERNEL@#$(XEN_KERNEL)#g'; \
 	  echo 's#@CUSTOM_XEN_INITRD@#$(XEN_INITRD)#g'; \
 	  echo 's#@RPL_FILE_STORAGE_DIR@#$(FILE_STORAGE_DIR)#g'; \
diff --git a/configure.ac b/configure.ac
index ac5f265e3fa670dfb24f749ba8269e636392b356..9f5660655c352b497c57182626b5018ffa2b974c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,6 +61,15 @@ AC_ARG_WITH([iallocator-search-path],
   [iallocator_search_path="'$libdir/$PACKAGE_NAME/iallocators'"])
 AC_SUBST(IALLOCATOR_SEARCH_PATH, $iallocator_search_path)
 
+# --with-xen-bootloader=...
+AC_ARG_WITH([xen-bootloader],
+  [AS_HELP_STRING([--with-xen-bootloader=PATH],
+    [bootloader for Xen hypervisor (default is empty)]
+  )],
+  [xen_bootloader="$withval"],
+  [xen_bootloader=])
+AC_SUBST(XEN_BOOTLOADER, $xen_bootloader)
+
 # --with-xen-kernel=...
 AC_ARG_WITH([xen-kernel],
   [AS_HELP_STRING([--with-xen-kernel=PATH],
diff --git a/lib/constants.py b/lib/constants.py
index b71348a240989e6b9c91bab07b785a8ccb966b5d..0278cfeee5479dad652458ea9ac9ea84eb4be67b 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -159,6 +159,7 @@ EXPORT_DIR = _autoconf.EXPORT_DIR
 
 EXPORT_CONF_FILE = "config.ini"
 
+XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
 XEN_KERNEL = _autoconf.XEN_KERNEL
 XEN_INITRD = _autoconf.XEN_INITRD
 
@@ -368,6 +369,9 @@ HV_VNC_X509 = "vnc_x509_path"
 HV_VNC_X509_VERIFY = "vnc_x509_verify"
 HV_ACPI = "acpi"
 HV_PAE = "pae"
+HV_USE_BOOTLOADER = "use_bootloader"
+HV_BOOTLOADER_ARGS = "bootloader_args"
+HV_BOOTLOADER_PATH = "bootloader_path"
 HV_KERNEL_ARGS = "kernel_args"
 HV_KERNEL_PATH = "kernel_path"
 HV_INITRD_PATH = "initrd_path"
@@ -388,6 +392,9 @@ HVS_PARAMETER_TYPES = {
   HV_VNC_X509_VERIFY: VTYPE_BOOL,
   HV_ACPI: VTYPE_BOOL,
   HV_PAE: VTYPE_BOOL,
+  HV_USE_BOOTLOADER: VTYPE_BOOL,
+  HV_BOOTLOADER_PATH: VTYPE_STRING,
+  HV_BOOTLOADER_ARGS: VTYPE_STRING,
   HV_KERNEL_PATH: VTYPE_STRING,
   HV_KERNEL_ARGS: VTYPE_STRING,
   HV_INITRD_PATH: VTYPE_STRING,
@@ -580,6 +587,9 @@ DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
 
 HVC_DEFAULTS = {
   HT_XEN_PVM: {
+    HV_USE_BOOTLOADER: False,
+    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
+    HV_BOOTLOADER_ARGS: '',
     HV_KERNEL_PATH: "/boot/vmlinuz-2.6-xenU",
     HV_INITRD_PATH: '',
     HV_ROOT_PATH: '/dev/sda1',
diff --git a/lib/hypervisor/hv_xen.py b/lib/hypervisor/hv_xen.py
index e266461424d920a8da48a3880f5b3445d6d33c8f..c82c344598b71bfea5f9204009b2b998a0aa1fab 100644
--- a/lib/hypervisor/hv_xen.py
+++ b/lib/hypervisor/hv_xen.py
@@ -424,6 +424,9 @@ class XenPvmHypervisor(XenHypervisor):
   """Xen PVM hypervisor interface"""
 
   PARAMETERS = {
+    constants.HV_USE_BOOTLOADER: hv_base.NO_CHECK,
+    constants.HV_BOOTLOADER_PATH: hv_base.OPT_FILE_CHECK,
+    constants.HV_BOOTLOADER_ARGS: hv_base.NO_CHECK,
     constants.HV_KERNEL_PATH: hv_base.REQ_FILE_CHECK,
     constants.HV_INITRD_PATH: hv_base.OPT_FILE_CHECK,
     constants.HV_ROOT_PATH: hv_base.REQUIRED_CHECK,
@@ -439,14 +442,29 @@ class XenPvmHypervisor(XenHypervisor):
     config = StringIO()
     config.write("# this is autogenerated by Ganeti, please do not edit\n#\n")
 
-    # kernel handling
-    kpath = hvp[constants.HV_KERNEL_PATH]
-    config.write("kernel = '%s'\n" % kpath)
+    # if bootloader is True, use bootloader instead of kernel and ramdisk
+    # parameters.
+    if hvp[constants.HV_USE_BOOTLOADER]:
+      # bootloader handling
+      bootloader_path = hvp[constants.HV_BOOTLOADER_PATH]
+      if bootloader_path:
+        config.write("bootloader = '%s'\n" % bootloader_path)
+      else:
+        raise errors.HypervisorError("Bootloader enabled, but missing"
+                                     " bootloader path")
 
-    # initrd handling
-    initrd_path = hvp[constants.HV_INITRD_PATH]
-    if initrd_path:
-      config.write("ramdisk = '%s'\n" % initrd_path)
+      bootloader_args = hvp[constants.HV_BOOTLOADER_ARGS]
+      if bootloader_args:
+        config.write("bootargs = '%s'\n" % bootloader_args)
+    else:
+      # kernel handling
+      kpath = hvp[constants.HV_KERNEL_PATH]
+      config.write("kernel = '%s'\n" % kpath)
+
+      # initrd handling
+      initrd_path = hvp[constants.HV_INITRD_PATH]
+      if initrd_path:
+        config.write("ramdisk = '%s'\n" % initrd_path)
 
     # rest of the settings
     config.write("memory = %d\n" % instance.beparams[constants.BE_MEMORY])