diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py
index 013f34a41e77916d6017c29428925c67ec080ecf..9a207b64c730c31a3ca4ca9bd6664d0618ab4f5b 100644
--- a/lib/client/gnt_instance.py
+++ b/lib/client/gnt_instance.py
@@ -1298,10 +1298,6 @@ def _ConvertNicDiskModifications(mods):
 
       assert not (constants.DDMS_VALUES_WITH_MODIFY & set(params.keys()))
 
-    if action == constants.DDM_REMOVE and params:
-      raise errors.OpPrereqError("Not accepting parameters on removal",
-                                 errors.ECODE_INVAL)
-
     result.append((action, identifier, params))
 
   return result
diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py
index 609741fa341ba59eeb6079e641f2f21d24a38033..1b8f7a869dd9987b3f123777bffc18da07d88b44 100644
--- a/lib/cmdlib/instance.py
+++ b/lib/cmdlib/instance.py
@@ -64,7 +64,7 @@ from ganeti.cmdlib.instance_storage import CreateDisks, \
   IsExclusiveStorageEnabledNodeUuid, CreateSingleBlockDev, ComputeDisks, \
   CheckRADOSFreeSpace, ComputeDiskSizePerVG, GenerateDiskTemplate, \
   StartInstanceDisks, ShutdownInstanceDisks, AssembleInstanceDisks, \
-  CheckSpindlesExclusiveStorage
+  CheckSpindlesExclusiveStorage, ExtractDiskParams
 from ganeti.cmdlib.instance_utils import BuildInstanceHookEnvByObject, \
   GetClusterDomainSecret, BuildInstanceHookEnv, NICListToTuple, \
   NICToTuple, CheckNodeNotDrained, RemoveInstance, CopyLockList, \
@@ -2288,12 +2288,11 @@ def _ApplyContainerMods(kind, container, chgdesc, mods,
       (absidx, item) = GetItemFromContainer(identifier, kind, container)
 
       if op == constants.DDM_REMOVE:
-        assert not params
 
         changes = [("%s/%s" % (kind, absidx), "remove")]
 
         if remove_fn is not None:
-          msg = remove_fn(absidx, item, private)
+          msg = remove_fn(absidx, item, private, params)
           if msg:
             changes.append(("%s/%s" % (kind, absidx), msg))
 
@@ -2369,12 +2368,8 @@ class LUInstanceSetParams(LogicalUnit):
       if key_types:
         utils.ForceDictType(params, key_types)
 
-      if op == constants.DDM_REMOVE:
-        if params:
-          raise errors.OpPrereqError("No settings should be passed when"
-                                     " removing a %s" % kind,
-                                     errors.ECODE_INVAL)
-      elif op in (constants.DDM_ADD, constants.DDM_MODIFY):
+
+      if op in (constants.DDM_ADD, constants.DDM_MODIFY, constants.DDM_REMOVE):
         item_fn(op, params)
       else:
         raise errors.ProgrammerError("Unhandled operation '%s'" % op)
@@ -3449,10 +3444,16 @@ class LUInstanceSetParams(LogicalUnit):
 
     return changes
 
-  def _RemoveDisk(self, idx, root, _):
+  def _RemoveDisk(self, idx, root, _, params):
     """Removes a disk.
 
     """
+    disk_params = ExtractDiskParams(params, self.instance.disk_template)
+    if root.params is None:
+      root.params = disk_params
+    else:
+      root.params.update(disk_params)
+
     hotmsg = ""
     if self.op.hotplug:
       hotmsg = self._HotplugDevice(constants.HOTPLUG_ACTION_REMOVE,
@@ -3539,7 +3540,7 @@ class LUInstanceSetParams(LogicalUnit):
 
     return changes
 
-  def _RemoveNic(self, idx, nic, _):
+  def _RemoveNic(self, idx, nic, _, __):
     if self.op.hotplug:
       return self._HotplugDevice(constants.HOTPLUG_ACTION_REMOVE,
                                  constants.HOTPLUG_TARGET_NIC,
diff --git a/lib/cmdlib/instance_storage.py b/lib/cmdlib/instance_storage.py
index 8075458b8ef86fe29793a960bba25b3d5d83ff47..0a19529839295dd1d3b6f900244d245d30e35733 100644
--- a/lib/cmdlib/instance_storage.py
+++ b/lib/cmdlib/instance_storage.py
@@ -385,6 +385,24 @@ def CheckRADOSFreeSpace():
   pass
 
 
+def ExtractDiskParams(disk, template_name):
+  """Extract disk parameters from the provided disk information."""
+  params = {}
+  # Only for the Ext template add disk_info to params
+  if template_name == constants.DT_EXT:
+    # FIXME: Check if the disk provider exists first
+    params[constants.IDISK_PROVIDER] = disk[constants.IDISK_PROVIDER]
+    for key in disk:
+      if key not in constants.IDISK_PARAMS:
+        params[key] = disk[key]
+  # Add IDISK_ACCESS param to disk params
+  if (template_name in constants.DTS_HAVE_ACCESS and
+      constants.IDISK_ACCESS in disk):
+    params[constants.IDISK_ACCESS] = disk[constants.IDISK_ACCESS]
+
+  return params
+
+
 def _GenerateDRBD8Branch(lu, primary_uuid, secondary_uuid, size, vgnames, names,
                          iv_name, p_minor, s_minor):
   """Generate a drbd8 device complete with its children.
@@ -500,17 +518,7 @@ def GenerateDiskTemplate(
     dev_type = template_name
 
     for idx, disk in enumerate(disk_info):
-      params = {}
-      # Only for the Ext template add disk_info to params
-      if template_name == constants.DT_EXT:
-        params[constants.IDISK_PROVIDER] = disk[constants.IDISK_PROVIDER]
-        for key in disk:
-          if key not in constants.IDISK_PARAMS:
-            params[key] = disk[key]
-      # Add IDISK_ACCESS param to disk params
-      if (template_name in constants.DTS_HAVE_ACCESS and
-          constants.IDISK_ACCESS in disk):
-        params[constants.IDISK_ACCESS] = disk[constants.IDISK_ACCESS]
+      params = ExtractDiskParams(disk, template_name)
       disk_index = idx + base_index
       size = disk[constants.IDISK_SIZE]
       feedback_fn("* disk %s, size %s" %