diff --git a/NEWS b/NEWS
index 7901c3e20b89ac8a62b74b2eeda4abba29bbb4e0..ef31fda6d7405234addb3de5835e51951a3b5dee 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,35 @@ Version 2.5.0 beta1
   "link" instead.
 
 
+Version 2.4.0
+-------------
+
+*(Released Mon, 07 Mar 2011)*
+
+Final 2.4.0 release. Just a few small fixes:
+
+- Fixed RAPI node evacuate
+- Fixed the kvm-ifup script
+- Fixed internal error handling for special job cases
+- Updated man page to specify the escaping feature for options
+
+
+Version 2.4.0 rc3
+-----------------
+
+*(Released Mon, 28 Feb 2011)*
+
+A critical fix for the ``prealloc_wipe_disks`` feature: it is possible
+that this feature wiped the disks of the wrong instance, leading to loss
+of data.
+
+Other changes:
+
+- Fixed title of query field containing instance name
+- Expanded the glossary in the documentation
+- Fixed one unittest (internal issue)
+
+
 Version 2.4.0 rc2
 -----------------
 
@@ -23,14 +52,14 @@ Version 2.4.0 rc2
 A number of bug fixes plus just a couple functionality changes.
 
 On the user-visible side, the ``gnt-* list`` command output has changed
-with respect to β€œspecial” field states. The current rc1 style of display
-can be re-enabled by passing a new ``-v, --verbose`` flag, but in the
-default output mode special fields are displayed as follows:
+with respect to "special" field states. The current rc1 style of display
+can be re-enabled by passing a new ``--verbose`` (``-v``) flag, but in
+the default output mode special fields states are displayed as follows:
 
-- offline field: ``*``
-- unavailable/not applicable: ``-``
-- data missing (RPC failure): ``?``
-- unknown field: ``??``
+- Offline resource: ``*``
+- Unavailable/not applicable: ``-``
+- Data missing (RPC failure): ``?``
+- Unknown field: ``??``
 
 Another user-visible change is the addition of ``--force-join`` to
 ``gnt-node add``.
@@ -38,16 +67,16 @@ Another user-visible change is the addition of ``--force-join`` to
 As for bug fixes:
 
 - ``tools/cluster-merge`` has seen many fixes and is now enabled again
-- fixed regression in RAPI/instance reinstall where all parameters were
+- Fixed regression in RAPI/instance reinstall where all parameters were
   required (instead of optional)
-- fixed ``gnt-cluster repair-disk-sizes``, was broken since Ganeti 2.2
-- fixed iallocator usage (offline nodes were not considered offline)
-- fixed ``gnt-node list`` with respect to non-vm_capable nodes
-- fixed hypervisor and OS parameter validation with respect to
+- Fixed ``gnt-cluster repair-disk-sizes``, was broken since Ganeti 2.2
+- Fixed iallocator usage (offline nodes were not considered offline)
+- Fixed ``gnt-node list`` with respect to non-vm_capable nodes
+- Fixed hypervisor and OS parameter validation with respect to
   non-vm_capable nodes
-- fixed ``gnt-cluster verify`` with respect to offline nodes (mostly
+- Fixed ``gnt-cluster verify`` with respect to offline nodes (mostly
   cosmetic)
-- fixed ``tools/listrunner`` with respect to agent-based usage
+- Fixed ``tools/listrunner`` with respect to agent-based usage
 
 
 Version 2.4.0 rc1
@@ -165,7 +194,7 @@ Integration
 ~~~~~~~~~~~
 
 - Moved ``rapi_users`` file into separate directory, now named
-  ``…/ganeti/rapi/users``, ``cfgupgrade`` moves the file and creates a
+  ``.../ganeti/rapi/users``, ``cfgupgrade`` moves the file and creates a
   symlink
 - Added new tool for running commands on many machines,
   ``tools/ganeti-listrunner``
@@ -350,7 +379,7 @@ Version 2.2.1 rc0
 
 *(Released Thu, 7 Oct 2010)*
 
-- Fixed issue 125, replace hardcoded β€œxenvg” in ``gnt-cluster`` with
+- Fixed issue 125, replace hardcoded "xenvg" in ``gnt-cluster`` with
   value retrieved from master
 - Added support for blacklisted or hidden OS definitions
 - Added simple lock monitor (accessible via (``gnt-debug locks``)
@@ -524,7 +553,7 @@ Some more bugfixes. Unless critical bugs occur, this will be the last
 
 - Fix case of MAC special-values
 - Fix mac checker regex
-- backend: Fix typo causing β€œout of range” error
+- backend: Fix typo causing "out of range" error
 - Add missing --units in gnt-instance list man page
 
 
@@ -821,7 +850,7 @@ Bug fixes
   directory (e.g. read-only file-system where we can't open the files
   read-write, etc.)
 - Fixed the behaviour of gnt-node modify for master candidate demotion;
-  now it either aborts cleanly or, if given the new β€œauto_promote”
+  now it either aborts cleanly or, if given the new "auto_promote"
   parameter, will automatically promote other nodes as needed
 - Fixed compatibility with (unreleased yet) Python 2.6.5 that would
   completely prevent Ganeti from working
@@ -850,7 +879,7 @@ Bug fixes
 New features
 ~~~~~~~~~~~~
 
-- Added an β€œearly_release” more for instance replace disks and node
+- Added an "early_release" more for instance replace disks and node
   evacuate, where we release locks earlier and thus allow higher
   parallelism within the cluster
 - Added watcher hooks, intended to allow the watcher to restart other
diff --git a/configure.ac b/configure.ac
index e08864efc3742a759c3968b10e0ae9dede3ea771..6713ea1844b76ed04d4d9d078fd1edc566c521a5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 m4_define([gnt_version_major], [2])
 m4_define([gnt_version_minor], [4])
 m4_define([gnt_version_revision], [0])
-m4_define([gnt_version_suffix], [~rc2])
+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/doc/glossary.rst b/doc/glossary.rst
index c771bff8e73e259e5f6c3101de7d43a887d0393d..a7f905dd985a07342c47a90013fc5fc5c13c1988 100644
--- a/doc/glossary.rst
+++ b/doc/glossary.rst
@@ -6,6 +6,11 @@ Glossary
 
 .. glossary::
 
+  BE Parameter
+    BE stands for Backend. BE parameters are hypervisor-independent
+    instance parameters such as the amount of RAM/virtual CPUs it has
+    been allocated.
+
   HVM
     Hardware virtualization mode, where the virtual machine is
     oblivious to the fact that's being virtualized and all the
@@ -15,6 +20,10 @@ Glossary
     The code associated with an OpCode, e.g. the code that implements
     the startup of an instance.
 
+  LUXI
+     Local UniX Interface. The IPC method over unix sockets used between
+     the cli tools and the master daemon.
+
   OpCode
     A data structure encapsulating a basic cluster operation; for
     example, start instance, add instance, etc.
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 60cf6ee666ca664cb250f4f1cd5b069721517d08..29ed69a11cbb289733d2d972d33c18462480a6b5 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -6697,6 +6697,10 @@ def _WipeDisks(lu, instance):
 
   """
   node = instance.primary_node
+
+  for device in instance.disks:
+    lu.cfg.SetDiskID(device, node)
+
   logging.info("Pause sync of instance %s disks", instance.name)
   result = lu.rpc.call_blockdev_pause_resume_sync(node, instance.disks, True)
 
@@ -6708,7 +6712,8 @@ def _WipeDisks(lu, instance):
   try:
     for idx, device in enumerate(instance.disks):
       lu.LogInfo("* Wiping disk %d", idx)
-      logging.info("Wiping disk %d for instance %s", idx, instance.name)
+      logging.info("Wiping disk %d for instance %s, node %s",
+                   idx, instance.name, node)
 
       # The wipe size is MIN_WIPE_CHUNK_PERCENT % of the instance disk but
       # MAX_WIPE_CHUNK at max
diff --git a/lib/constants.py b/lib/constants.py
index 31008f50afb45487f42308f9cd127129429878b2..033de03c4d7beec7d90ddf4915941769103fb21b 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -202,7 +202,7 @@ DEV_CONSOLE = "/dev/console"
 
 PROC_MOUNTS = "/proc/mounts"
 
-# luxi related constants
+# Local UniX Interface related constants
 LUXI_EOM = "\3"
 LUXI_VERSION = CONFIG_VERSION
 
@@ -661,7 +661,7 @@ HVS_PARAMETER_TYPES = {
 
 HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
 
-# BE parameter names
+# Backend parameter names
 BE_MEMORY = "memory"
 BE_VCPUS = "vcpus"
 BE_AUTO_BALANCE = "auto_balance"
@@ -1024,7 +1024,7 @@ QR_GROUP = "group"
 #: List of resources which can be queried using L{opcodes.OpQuery}
 QR_OP_QUERY = frozenset([QR_INSTANCE, QR_NODE, QR_GROUP])
 
-#: List of resources which can be queried using LUXI
+#: List of resources which can be queried using Local UniX Interface
 QR_OP_LUXI = QR_OP_QUERY.union([
   QR_LOCK,
   ])
diff --git a/lib/mcpu.py b/lib/mcpu.py
index 7210178d70234cadbfbc57747af38a5249363893..c40c1a2510c781a3d65621061061e6ee78a768f6 100644
--- a/lib/mcpu.py
+++ b/lib/mcpu.py
@@ -401,8 +401,12 @@ class Processor(object):
     self.Log(" - INFO: %s" % message)
 
   def GetECId(self):
+    """Returns the current execution context ID.
+
+    """
     if not self._ec_id:
-      errors.ProgrammerError("Tried to use execution context id when not set")
+      raise errors.ProgrammerError("Tried to use execution context id when"
+                                   " not set")
     return self._ec_id
 
 
diff --git a/lib/objects.py b/lib/objects.py
index 50dfe4d7921977eef986fa06b0b284d1fd2b7cb4..ef993495e187607e258bbfd6cfc44352b2b67b95 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -1124,7 +1124,7 @@ class Cluster(TaggableObject):
     if self.modify_ssh_setup is None:
       self.modify_ssh_setup = True
 
-    # default_bridge is no longer used it 2.1. The slot is left there to
+    # default_bridge is no longer used in 2.1. The slot is left there to
     # support auto-upgrading. It can be removed once we decide to deprecate
     # upgrading straight from 2.0.
     if self.default_bridge is not None:
diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index c3afff412bd67e4f43a617b7fc610b9c52e976c9..ac4c3fa5c8980b5cb67d7f32fd559a05b39cba32 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -431,7 +431,7 @@ class R_2_nodes_name_evacuate(baserlib.R_Generic):
     result = cli.PollJob(job_id, cl, feedback_fn=baserlib.FeedbackFn)
 
     jobs = []
-    for iname, node in result:
+    for iname, node in result[0]:
       if dry_run:
         jid = None
       else:
diff --git a/man/ganeti.rst b/man/ganeti.rst
index a012231406583669a5ee0a7f6014a949811b32ec..52721d491f8d56248c9525f00174e0e50e5a8f3c 100644
--- a/man/ganeti.rst
+++ b/man/ganeti.rst
@@ -158,8 +158,11 @@ error
     stopped during the job execution.
 
 
-Common options
---------------
+Common command line features
+----------------------------
+
+Options
+~~~~~~~
 
 Many Ganeti commands provide the following options. The
 availability for a certain command can be checked by calling the
@@ -173,15 +176,8 @@ would succeed.
 The option ``--priority`` sets the priority for opcodes submitted
 by the command.
 
-
-Common daemon functionality
----------------------------
-
-All Ganeti daemons re-open the log file(s) when sent a SIGHUP signal.
-**logrotate**(8) can be used to rotate Ganeti's log files.
-
-Common field formatting
------------------------
+Field formatting
+----------------
 
 Multiple ganeti commands use the same framework for tabular listing of
 resources (e.g. **gnt-instance list**, **gnt-node list**, **gnt-group
@@ -214,3 +210,22 @@ verbose mode):
     are using a field that the running Ganeti master daemon doesn't
     know. This result is persistent, re-running the command won't
     change it.
+
+Key-value parameters
+~~~~~~~~~~~~~~~~~~~~
+
+Multiple options take parameters that are of the form
+``key=value,key=value,...`` or ``category:key=value,...``. Examples
+are the hypervisor parameters, backend parameters, etc. For these,
+it's possible to use values that contain commas by escaping with via a
+backslash (which needs two if not single-quoted, due to shell
+behaviour)::
+
+  # gnt-instance modify -H kernel_path=an\\,example instance1
+  # gnt-instance modify -H kernel_path='an\,example' instance1
+
+Common daemon functionality
+---------------------------
+
+All Ganeti daemons re-open the log file(s) when sent a SIGHUP signal.
+**logrotate**(8) can be used to rotate Ganeti's log files.
diff --git a/tools/kvm-ifup.in b/tools/kvm-ifup.in
index 364d3e60dbb697b9bfc5343a6bf23a1e6f62dae0..370040c83324949d9c964479b2f913d02a37a96b 100644
--- a/tools/kvm-ifup.in
+++ b/tools/kvm-ifup.in
@@ -34,7 +34,7 @@ fi
 
 ip link set $INTERFACE up
 
-if [ "$MODE" == "bridged" ]; then
+if [ "$MODE" = "bridged" ]; then
 	# Connect the interface to the bridge
 	brctl addif $BRIDGE $INTERFACE
 else