diff --git a/NEWS b/NEWS
index 0da4fde9348790ff79b6cac501aca79917dd6888..4eb88c46a2524b7408f8335cfcaa0b8f59ce9d33 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,14 @@ Version 2.4.0 rc1
   ``gnt-instance list``.
 
 
+Version 2.3.1
+-------------
+
+*(Released Mon, 20 Dec 2010)*
+
+Released version 2.3.1~rc1 without any changes.
+
+
 Version 2.3.1 rc1
 -----------------
 
diff --git a/configure.ac b/configure.ac
index e1fb4979821bf9889059dd9b29dc23f2ddb2dc45..33d55f71b86e1b44d32ddb6fb8ff69d7719d537d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 m4_define([gnt_version_major], [2])
 m4_define([gnt_version_minor], [3])
 m4_define([gnt_version_revision], [1])
-m4_define([gnt_version_suffix], [~rc1])
+m4_define([gnt_version_suffix], [])
 m4_define([gnt_version_full],
           m4_format([%d.%d.%d%s],
                     gnt_version_major, gnt_version_minor,
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 4845389be3401ae48ad5d795edfcc438bd7dc73b..90b14619ceafdebbc70b400876ca917083f914e0 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2037,6 +2037,10 @@ class LUVerifyCluster(LogicalUnit):
     @param node_image: Node objects
     @type instanceinfo: dict of (name, L{objects.Instance})
     @param instanceinfo: Instance objects
+    @rtype: {instance: {node: [(succes, payload)]}}
+    @return: a dictionary of per-instance dictionaries with nodes as
+        keys and disk information as values; the disk information is a
+        list of tuples (success, payload)
 
     """
     _ErrorIf = self._ErrorIf # pylint: disable-msg=C0103
@@ -2081,20 +2085,27 @@ class LUVerifyCluster(LogicalUnit):
     instdisk = {}
 
     for (nname, nres) in result.items():
-      if nres.offline:
-        # Ignore offline node
-        continue
-
       disks = node_disks[nname]
 
-      msg = nres.fail_msg
-      _ErrorIf(msg, self.ENODERPC, nname,
-               "while getting disk information: %s", nres.fail_msg)
-      if msg:
+      if nres.offline:
         # No data from this node
-        data = len(disks) * [None]
+        data = len(disks) * [(False, "node offline")]
       else:
-        data = nres.payload
+        msg = nres.fail_msg
+        _ErrorIf(msg, self.ENODERPC, nname,
+                 "while getting disk information: %s", msg)
+        if msg:
+          # No data from this node
+          data = len(disks) * [(False, msg)]
+        else:
+          data = []
+          for idx, i in enumerate(nres.payload):
+            if isinstance(i, (tuple, list)) and len(i) == 2:
+              data.append(i)
+            else:
+              logging.warning("Invalid result from node %s, entry %d: %s",
+                              nname, idx, i)
+              data.append((False, "Invalid result from the remote node"))
 
       for ((inst, _), status) in zip(disks, data):
         instdisk.setdefault(inst, {}).setdefault(nname, []).append(status)
@@ -2105,9 +2116,12 @@ class LUVerifyCluster(LogicalUnit):
       instdisk[inst] = {}
 
     assert compat.all(len(statuses) == len(instanceinfo[inst].disks) and
-                      len(nnames) <= len(instanceinfo[inst].all_nodes)
+                      len(nnames) <= len(instanceinfo[inst].all_nodes) and
+                      compat.all(isinstance(s, (tuple, list)) and
+                                 len(s) == 2 for s in statuses)
                       for inst, nnames in instdisk.items()
                       for nname, statuses in nnames.items())
+    assert set(instdisk) == set(instanceinfo), "instdisk consistency failure"
 
     return instdisk