diff --git a/lib/opcodes.py b/lib/opcodes.py
index 1af70ea7e6160fbd3ad8dd7ee7b913996f510e64..a960d44aa9ed0fb96d716ecb7e925f83c87795f8 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -153,6 +153,15 @@ _TestClusterOsList = ht.TOr(ht.TNone,
 _TestNicDef = ht.TDictOf(ht.TElemOf(constants.INIC_PARAMS),
                          ht.TOr(ht.TNone, ht.TNonEmptyString))
 
+_TSetParamsResultItemItems = [
+  ht.Comment("name of changed parameter")(ht.TNonEmptyString),
+  ht.TAny,
+  ]
+
+_TSetParamsResult = \
+  ht.TListOf(ht.TAnd(ht.TIsLength(len(_TSetParamsResultItemItems)),
+                     ht.TItems(_TSetParamsResultItemItems)))
+
 _SUMMARY_PREFIX = {
   "CLUSTER_": "C_",
   "GROUP_": "G_",
@@ -429,13 +438,17 @@ def _BuildJobDepCheck(relative):
 TNoRelativeJobDependencies = _BuildJobDepCheck(False)
 
 #: List of submission status and job ID as returned by C{SubmitManyJobs}
-TJobIdList = \
-  ht.TListOf(ht.TAnd(ht.TIsLength(2),
-                     ht.TItems([ht.TBool, ht.TOr(ht.TString, ht.TJobId)])))
+_TJobIdListItem = \
+  ht.TAnd(ht.TIsLength(2),
+          ht.TItems([ht.Comment("success")(ht.TBool),
+                     ht.Comment("Job ID if successful, error message"
+                                " otherwise")(ht.TOr(ht.TString,
+                                                     ht.TJobId))]))
+TJobIdList = ht.TListOf(_TJobIdListItem)
 
 #: Result containing only list of submitted jobs
 TJobIdListOnly = ht.TStrictDict(True, True, {
-  constants.JOB_IDS_KEY: TJobIdList,
+  constants.JOB_IDS_KEY: ht.Comment("List of submitted jobs")(TJobIdList),
   })
 
 
@@ -953,6 +966,7 @@ class OpNodeSetParams(OpCode):
     ("powered", None, ht.TMaybeBool,
      "Whether the node should be marked as powered"),
     ]
+  OP_RESULT = _TSetParamsResult
 
 
 class OpNodePowercycle(OpCode):
@@ -988,6 +1002,7 @@ class OpNodeEvacuate(OpCode):
     ("mode", ht.NoDefault, ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES),
      "Node evacuation mode"),
     ]
+  OP_RESULT = TJobIdListOnly
 
 
 # instance opcodes
@@ -1063,6 +1078,7 @@ class OpInstanceCreate(OpCode):
     ("start", True, ht.TBool, "Whether to start instance after creation"),
     ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Instance tags"),
     ]
+  OP_RESULT = ht.Comment("instance nodes")(ht.TListOf(ht.TNonEmptyString))
 
 
 class OpInstanceReinstall(OpCode):
@@ -1095,6 +1111,7 @@ class OpInstanceRename(OpCode):
     ("new_name", ht.NoDefault, ht.TNonEmptyString, "New instance name"),
     ("ip_check", False, ht.TBool, _PIpCheckDoc),
     ]
+  OP_RESULT = ht.Comment("New instance name")(ht.TNonEmptyString)
 
 
 class OpInstanceStartup(OpCode):
@@ -1298,6 +1315,7 @@ class OpInstanceSetParams(OpCode):
     ("wait_for_sync", True, ht.TBool,
      "Whether to wait for the disk to synchronize, when changing template"),
     ]
+  OP_RESULT = _TSetParamsResult
 
 
 class OpInstanceGrowDisk(OpCode):
@@ -1322,6 +1340,7 @@ class OpInstanceChangeGroup(OpCode):
     ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
      "Destination group names or UUIDs (defaults to \"all but current group\""),
     ]
+  OP_RESULT = TJobIdListOnly
 
 
 # Node group opcodes
@@ -1364,6 +1383,7 @@ class OpGroupSetParams(OpCode):
     _PNodeGroupAllocPolicy,
     _PGroupNodeParams,
     ]
+  OP_RESULT = _TSetParamsResult
 
 
 class OpGroupRemove(OpCode):
@@ -1380,6 +1400,7 @@ class OpGroupRename(OpCode):
     _PGroupName,
     ("new_name", ht.NoDefault, ht.TNonEmptyString, "New group name"),
     ]
+  OP_RESULT = ht.Comment("New group name")(ht.TNonEmptyString)
 
 
 class OpGroupEvacuate(OpCode):
@@ -1392,6 +1413,7 @@ class OpGroupEvacuate(OpCode):
     ("target_groups", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)),
      "Destination group names or UUIDs"),
     ]
+  OP_RESULT = TJobIdListOnly
 
 
 # OS opcodes