diff --git a/lib/query.py b/lib/query.py
index 581998160cd7ef7b90ef919bd5be9e3a58f8f19b..4eba17ea5a498d04271a74c87a4f4d5ab603831b 100644
--- a/lib/query.py
+++ b/lib/query.py
@@ -110,6 +110,16 @@ _FS_NODATA = object()
 _FS_UNAVAIL = object()
 _FS_OFFLINE = object()
 
+#: VType to QFT mapping
+_VTToQFT = {
+  # TODO: fix validation of empty strings
+  constants.VTYPE_STRING: QFT_OTHER, # since VTYPE_STRINGs can be empty
+  constants.VTYPE_MAYBE_STRING: QFT_OTHER,
+  constants.VTYPE_BOOL: QFT_BOOL,
+  constants.VTYPE_SIZE: QFT_UNIT,
+  constants.VTYPE_INT: QFT_NUMBER,
+  }
+
 
 def _GetUnknownField(ctx, item): # pylint: disable-msg=W0613
   """Gets the contents of an unknown field.
@@ -1041,10 +1051,10 @@ def _GetInstanceParameterFields():
     return lambda ctx, _: ctx.inst_hvparams.get(name, _FS_UNAVAIL)
 
   fields.extend([
-    # For now all hypervisor parameters are exported as QFT_OTHER
-    (_MakeField("hv/%s" % name, hv_title.get(name, "hv/%s" % name), QFT_OTHER),
+    (_MakeField("hv/%s" % name, hv_title.get(name, "hv/%s" % name),
+                _VTToQFT[kind]),
      IQ_CONFIG, _GetInstHvParam(name))
-    for name in constants.HVS_PARAMETERS
+    for name, kind in constants.HVS_PARAMETER_TYPES.items()
     if name not in constants.HVC_GLOBALS
     ])
 
@@ -1053,10 +1063,10 @@ def _GetInstanceParameterFields():
     return lambda ctx, _: ctx.inst_beparams.get(name, None)
 
   fields.extend([
-    # For now all backend parameters are exported as QFT_OTHER
-    (_MakeField("be/%s" % name, be_title.get(name, "be/%s" % name), QFT_OTHER),
-     IQ_CONFIG, _GetInstBeParam(name))
-    for name in constants.BES_PARAMETERS
+    (_MakeField("be/%s" % name, be_title.get(name, "be/%s" % name),
+                _VTToQFT[kind]), IQ_CONFIG,
+     _GetInstBeParam(name))
+    for name, kind in constants.BES_PARAMETER_TYPES.items()
     ])
 
   return fields