diff --git a/lib/cli.py b/lib/cli.py
index ce9f04b6f584dd04058ac8a96b62a2e0717416fb..d084c9c32b49e1809beda296c4aa42eee69ab9c6 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -111,6 +111,7 @@ __all__ = [
   "ON_PRIMARY_OPT",
   "ON_SECONDARY_OPT",
   "OFFLINE_OPT",
+  "OSPARAMS_OPT",
   "OS_OPT",
   "OS_SIZE_OPT",
   "RAPI_CERT_OPT",
@@ -616,6 +617,10 @@ OS_OPT = cli_option("-o", "--os-type", dest="os", help="What OS to run",
                     metavar="<os>",
                     completion_suggest=OPT_COMPL_ONE_OS)
 
+OSPARAMS_OPT = cli_option("-O", "--os-parameters", dest="osparams",
+                         type="keyval", default={},
+                         help="OS parameters")
+
 FORCE_VARIANT_OPT = cli_option("--force-variant", dest="force_variant",
                                action="store_true", default=False,
                                help="Force an unknown variant")
@@ -1833,6 +1838,7 @@ def GenericInstanceCreate(mode, opts, args):
                                 hypervisor=hypervisor,
                                 hvparams=hvparams,
                                 beparams=opts.beparams,
+                                osparams=opts.osparams,
                                 mode=mode,
                                 start=start,
                                 os_type=os_type,
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index e921553e583fb32f5a09074e5df32868776e37f6..33050d4414d5245ce05a754a1de1f4c3b8b721bc 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -6130,7 +6130,7 @@ class LUCreateInstance(LogicalUnit):
   _OP_REQP = ["instance_name", "disks",
               "mode", "start",
               "wait_for_sync", "ip_check", "nics",
-              "hvparams", "beparams"]
+              "hvparams", "beparams", "osparams"]
   REQ_BGL = False
 
   def CheckArguments(self):
@@ -6580,6 +6580,9 @@ class LUCreateInstance(LogicalUnit):
     utils.ForceDictType(self.op.beparams, constants.BES_PARAMETER_TYPES)
     self.be_full = cluster.SimpleFillBE(self.op.beparams)
 
+    # build os parameters
+    self.os_full = cluster.SimpleFillOS(self.op.os_type, self.op.osparams)
+
     # now that hvp/bep are in final format, let's reset to defaults,
     # if told to do so
     if self.op.identify_defaults:
@@ -6807,6 +6810,8 @@ class LUCreateInstance(LogicalUnit):
     _CheckHVParams(self, nodenames, self.op.hypervisor, self.op.hvparams)
 
     _CheckNodeHasOS(self, pnode.name, self.op.os_type, self.op.force_variant)
+    # check OS parameters (remotely)
+    _CheckOSParams(self, True, nodenames, self.op.os_type, self.os_full)
 
     _CheckNicsBridgesExist(self, self.nics, self.pnode.name)
 
@@ -6863,6 +6868,7 @@ class LUCreateInstance(LogicalUnit):
                             beparams=self.op.beparams,
                             hvparams=self.op.hvparams,
                             hypervisor=self.op.hypervisor,
+                            osparams=self.op.osparams,
                             )
 
     if self.adopt_disks:
diff --git a/lib/opcodes.py b/lib/opcodes.py
index a0f7f836cbc82dfa4613a7c16f24cc0f8e7bb193..bbc4b26372f452ae439e58cd87e938ac039e30fe 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -480,7 +480,7 @@ class OpCreateInstance(OpCode):
     "wait_for_sync", "ip_check", "name_check",
     "file_storage_dir", "file_driver",
     "iallocator",
-    "hypervisor", "hvparams", "beparams",
+    "hypervisor", "hvparams", "beparams", "osparams",
     "source_handshake",
     "source_x509_ca",
     "source_instance_name",
diff --git a/scripts/gnt-backup b/scripts/gnt-backup
index b47d7587602ce01b7051c853cbf43597637adb3f..b7e49d1eb0af3e06dfec0e98b4574ca4cdb677ba 100755
--- a/scripts/gnt-backup
+++ b/scripts/gnt-backup
@@ -144,6 +144,7 @@ import_opts = [
   NONAMECHECK_OPT,
   NONICS_OPT,
   NWSYNC_OPT,
+  OSPARAMS_OPT,
   OS_SIZE_OPT,
   SRC_DIR_OPT,
   SRC_NODE_OPT,
diff --git a/scripts/gnt-instance b/scripts/gnt-instance
index 2b68d10a543a5b42414fc034cc2d8b72ff6b996b..55c472c00b5481129cce77c66e725df5c2e54270 100755
--- a/scripts/gnt-instance
+++ b/scripts/gnt-instance
@@ -1367,6 +1367,7 @@ add_opts = [
   NONICS_OPT,
   NOSTART_OPT,
   NWSYNC_OPT,
+  OSPARAMS_OPT,
   OS_OPT,
   FORCE_VARIANT_OPT,
   NO_INSTALL_OPT,
diff --git a/tools/burnin b/tools/burnin
index 17e58500105a558eac84964b9af246346bb5ec15..db610e002bf4736e29cd49486ee4d23c3f9ca901 100755
--- a/tools/burnin
+++ b/tools/burnin
@@ -114,6 +114,7 @@ OPTIONS = [
                  metavar="<OS>",
                  completion_suggest=cli.OPT_COMPL_ONE_OS),
   cli.HYPERVISOR_OPT,
+  cli.OSPARAMS_OPT,
   cli.cli_option("--disk-size", dest="disk_size",
                  help="Disk size (determines disk count)",
                  default="128m", type="string", metavar="<size,size,...>",
@@ -570,6 +571,7 @@ class Burner(object):
                                     beparams=self.bep,
                                     hvparams=self.hvp,
                                     hypervisor=self.hypervisor,
+                                    osparams=self.opts.osparams,
                                     )
       remove_instance = lambda name: lambda: self.to_rem.append(name)
       self.ExecOrQueue(instance, [op], post_process=remove_instance(instance))
@@ -722,6 +724,7 @@ class Burner(object):
                                         iallocator=self.opts.iallocator,
                                         beparams=self.bep,
                                         hvparams=self.hvp,
+                                        osparams=self.opts.osparams,
                                         )
 
       erem_op = opcodes.OpRemoveExport(instance_name=instance)