diff --git a/lib/constants.py b/lib/constants.py
index 4b73be2b03d610f5114d597abf2ac983b75ff398..d26507345b0660c5f35e2d71a055ec97cf734c87 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -583,8 +583,11 @@ ENFORCEABLE_TYPES = frozenset([
 # HV parameter names (global namespace)
 HV_BOOT_ORDER = "boot_order"
 HV_CDROM_IMAGE_PATH = "cdrom_image_path"
+HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
+HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
 HV_NIC_TYPE = "nic_type"
 HV_DISK_TYPE = "disk_type"
+HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
 HV_VNC_BIND_ADDRESS = "vnc_bind_address"
 HV_VNC_PASSWORD_FILE = "vnc_password_file"
 HV_VNC_TLS = "vnc_tls"
@@ -620,9 +623,12 @@ HV_BLOCKDEV_PREFIX = "blockdev_prefix"
 
 HVS_PARAMETER_TYPES = {
   HV_BOOT_ORDER: VTYPE_STRING,
+  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
   HV_CDROM_IMAGE_PATH: VTYPE_STRING,
+  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
   HV_NIC_TYPE: VTYPE_STRING,
   HV_DISK_TYPE: VTYPE_STRING,
+  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
   HV_VNC_PASSWORD_FILE: VTYPE_STRING,
   HV_VNC_BIND_ADDRESS: VTYPE_STRING,
   HV_VNC_TLS: VTYPE_BOOL,
@@ -822,11 +828,13 @@ HT_MOUSE_TABLET = "tablet"
 HT_KVM_VALID_MOUSE_TYPES = frozenset([HT_MOUSE_MOUSE, HT_MOUSE_TABLET])
 
 # Boot order
+HT_BO_FLOPPY = "floppy"
 HT_BO_CDROM = "cdrom"
 HT_BO_DISK = "disk"
 HT_BO_NETWORK = "network"
 
-HT_KVM_VALID_BO_TYPES = frozenset([HT_BO_CDROM, HT_BO_DISK, HT_BO_NETWORK])
+HT_KVM_VALID_BO_TYPES = frozenset([HT_BO_FLOPPY, HT_BO_CDROM,
+                                   HT_BO_DISK, HT_BO_NETWORK])
 
 # Security models
 HT_SM_NONE = "none"
@@ -1118,10 +1126,13 @@ HVC_DEFAULTS = {
     HV_VNC_X509: '',
     HV_VNC_X509_VERIFY: False,
     HV_VNC_PASSWORD_FILE: '',
+    HV_KVM_FLOPPY_IMAGE_PATH: '',
     HV_CDROM_IMAGE_PATH: '',
+    HV_KVM_CDROM2_IMAGE_PATH: '',
     HV_BOOT_ORDER: HT_BO_DISK,
     HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
     HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
+    HV_KVM_CDROM_DISK_TYPE: '',
     HV_USB_MOUSE: '',
     HV_MIGRATION_PORT: 8102,
     HV_MIGRATION_BANDWIDTH: 32, # MiB/s
diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py
index 3e9e0250b76930958bb62ae51185e17e185dc7ba..290a2e866ee082757819b36592b13a7fa28ae8de 100644
--- a/lib/hypervisor/hv_kvm.py
+++ b/lib/hypervisor/hv_kvm.py
@@ -164,13 +164,17 @@ class KVMHypervisor(hv_base.BaseHypervisor):
     constants.HV_VNC_X509: hv_base.OPT_DIR_CHECK,
     constants.HV_VNC_X509_VERIFY: hv_base.NO_CHECK,
     constants.HV_VNC_PASSWORD_FILE: hv_base.OPT_FILE_CHECK,
+    constants.HV_KVM_FLOPPY_IMAGE_PATH: hv_base.OPT_FILE_CHECK,
     constants.HV_CDROM_IMAGE_PATH: hv_base.OPT_FILE_CHECK,
+    constants.HV_KVM_CDROM2_IMAGE_PATH: hv_base.OPT_FILE_CHECK,
     constants.HV_BOOT_ORDER:
       hv_base.ParamInSet(True, constants.HT_KVM_VALID_BO_TYPES),
     constants.HV_NIC_TYPE:
       hv_base.ParamInSet(True, constants.HT_KVM_VALID_NIC_TYPES),
     constants.HV_DISK_TYPE:
       hv_base.ParamInSet(True, constants.HT_KVM_VALID_DISK_TYPES),
+    constants.HV_KVM_CDROM_DISK_TYPE:
+      hv_base.ParamInSet(False, constants.HT_KVM_VALID_DISK_TYPES),
     constants.HV_USB_MOUSE:
       hv_base.ParamInSet(False, constants.HT_KVM_VALID_MOUSE_TYPES),
     constants.HV_MIGRATION_PORT: hv_base.NET_PORT_CHECK,
@@ -517,6 +521,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
     hvp = instance.hvparams
     boot_disk = hvp[constants.HV_BOOT_ORDER] == constants.HT_BO_DISK
     boot_cdrom = hvp[constants.HV_BOOT_ORDER] == constants.HT_BO_CDROM
+    boot_floppy = hvp[constants.HV_BOOT_ORDER] == constants.HT_BO_FLOPPY
     boot_network = hvp[constants.HV_BOOT_ORDER] == constants.HT_BO_NETWORK
 
     if hvp[constants.HV_KVM_FLAG] == constants.HT_KVM_ENABLED:
@@ -558,22 +563,51 @@ class KVMHypervisor(hv_base.BaseHypervisor):
                                                 cache_val)
       kvm_cmd.extend(['-drive', drive_val])
 
+    #Now we can specify a different device type for CDROM devices.
+    cdrom_disk_type = hvp[constants.HV_KVM_CDROM_DISK_TYPE]
+    if not cdrom_disk_type:
+      cdrom_disk_type = disk_type
+
     iso_image = hvp[constants.HV_CDROM_IMAGE_PATH]
     if iso_image:
       options = ',format=raw,media=cdrom'
       if boot_cdrom:
         kvm_cmd.extend(['-boot', 'd'])
-        if disk_type != constants.HT_DISK_IDE:
+        if cdrom_disk_type != constants.HT_DISK_IDE:
+          options = '%s,boot=on,if=%s' % (options, constants.HT_DISK_IDE)
+        else:
           options = '%s,boot=on' % options
       else:
-        if disk_type == constants.HT_DISK_PARAVIRTUAL:
+        if cdrom_disk_type == constants.HT_DISK_PARAVIRTUAL:
           if_val = ',if=virtio'
         else:
-          if_val = ',if=%s' % disk_type
+          if_val = ',if=%s' % cdrom_disk_type
         options = '%s%s' % (options, if_val)
       drive_val = 'file=%s%s' % (iso_image, options)
       kvm_cmd.extend(['-drive', drive_val])
 
+    iso_image2 = hvp[constants.HV_KVM_CDROM2_IMAGE_PATH]
+    if iso_image2:
+      options = ',format=raw,media=cdrom'
+      if cdrom_disk_type == constants.HT_DISK_PARAVIRTUAL:
+        if_val = ',if=virtio'
+      else:
+        if_val = ',if=%s' % cdrom_disk_type
+      options = '%s%s' % (options, if_val)
+      drive_val = 'file=%s%s' % (iso_image2, options)
+      kvm_cmd.extend(['-drive', drive_val])
+
+    floppy_image = hvp[constants.HV_KVM_FLOPPY_IMAGE_PATH]
+    if floppy_image:
+      options = ',format=raw,media=disk'
+      if boot_floppy:
+        kvm_cmd.extend(['-boot', 'a'])
+        options = '%s,boot=on' % options
+      if_val = ',if=floppy'
+      options = '%s%s' % (options, if_val)
+      drive_val = 'file=%s%s' % (floppy_image, options)
+      kvm_cmd.extend(['-drive', drive_val])
+
     kernel_path = hvp[constants.HV_KERNEL_PATH]
     if kernel_path:
       kvm_cmd.extend(['-kernel', kernel_path])