diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index 1cc2822048b9a5b79e5d25e4c95a80bfc4308b2e..e9fea3187b898773e6dd6ddcdb96b708ab95d5f1 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -105,7 +105,8 @@ class R_2_os(baserlib.R_Generic):
 
     """
     cl = baserlib.GetClient()
-    op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
+    op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "variants"],
+                              names=[])
     job_id = baserlib.SubmitJob([op], cl)
     # we use custom feedback function, instead of print we log the status
     result = cli.PollJob(job_id, cl, feedback_fn=baserlib.FeedbackFn)
@@ -114,7 +115,12 @@ class R_2_os(baserlib.R_Generic):
     if not isinstance(diagnose_data, list):
       raise http.HttpBadGateway(message="Can't get OS list")
 
-    return [row[0] for row in diagnose_data if row[1]]
+    os_names = []
+    for (name, valid, variants) in diagnose_data:
+      if valid:
+        os_names.extend(cli.CalculateOSNames(name, variants))
+
+    return os_names
 
 
 class R_2_redist_config(baserlib.R_Generic):
diff --git a/scripts/gnt-instance b/scripts/gnt-instance
index 59b1ba85a752727a459251f1a8267fda1d5cdda5..062e02bbbe1e0e8af5bb73af1c9e4642b80c7be4 100755
--- a/scripts/gnt-instance
+++ b/scripts/gnt-instance
@@ -481,7 +481,8 @@ def ReinstallInstance(opts, args):
 
   # second, if requested, ask for an OS
   if opts.select_os is True:
-    op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
+    op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "variants"],
+                              names=[])
     result = SubmitOpCode(op)
 
     if not result:
@@ -491,10 +492,12 @@ def ReinstallInstance(opts, args):
     ToStdout("Available OS templates:")
     number = 0
     choices = []
-    for entry in result:
-      ToStdout("%3s: %s", number, entry[0])
-      choices.append(("%s" % number, entry[0], entry[0]))
-      number = number + 1
+    for (name, valid, variants) in result:
+      if valid:
+        for entry in CalculateOSNames(name, variants):
+          ToStdout("%3s: %s", number, entry)
+          choices.append(("%s" % number, entry, entry))
+          number += 1
 
     choices.append(('x', 'exit', 'Exit gnt-instance reinstall'))
     selected = AskUser("Enter OS template number (or x to abort):",
diff --git a/scripts/gnt-os b/scripts/gnt-os
index 0542a67344b868a9980a3ea5b1b9e0e061249386..e5b0fed2e3f2c072a19cf973e679a8d2075ea745 100755
--- a/scripts/gnt-os
+++ b/scripts/gnt-os
@@ -41,7 +41,8 @@ def ListOS(opts, args):
   @return: the desired exit code
 
   """
-  op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
+  op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "variants"],
+                            names=[])
   result = SubmitOpCode(op)
 
   if not result:
@@ -53,9 +54,13 @@ def ListOS(opts, args):
   else:
     headers = None
 
+  os_names = []
+  for (name, valid, variants) in result:
+    if valid:
+      os_names.extend([[n] for n in CalculateOSNames(name, variants)])
+
   data = GenerateTable(separator=None, headers=headers, fields=["name"],
-                       data=[[row[0]] for row in result if row[1]],
-                       units=None)
+                       data=os_names, units=None)
 
   for line in data:
     ToStdout(line)
diff --git a/tools/burnin b/tools/burnin
index 35848c45f49699407df120894c9a872410dc0d8e..7796785e70fe720e1bc4144d6b517a58254d2f50 100755
--- a/tools/burnin
+++ b/tools/burnin
@@ -447,16 +447,20 @@ class Burner(object):
       Err(msg, exit_code=err_code)
     self.nodes = [data[0] for data in result if not (data[1] or data[2])]
 
-    op_diagos = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
-    result = self.ExecOp(True, op_diagos)
+    op_diagnose = opcodes.OpDiagnoseOS(output_fields=["name", "valid",
+                                                      "variants"], names=[])
+    result = self.ExecOp(True, op_diagnose)
 
     if not result:
       Err("Can't get the OS list")
 
-    # filter non-valid OS-es
-    os_set = [val[0] for val in result if val[1]]
+    found = False
+    for (name, valid, variants) in result:
+      if valid and self.opts.os in cli.CalculateOSNames(name, variants):
+        found = True
+        break
 
-    if self.opts.os not in os_set:
+    if not found:
       Err("OS '%s' not found" % self.opts.os)
 
   @_DoCheckInstances