diff --git a/man/gnt-instance.sgml b/man/gnt-instance.sgml
index 39ab31cc8a833bd3d46c6cb22e8b3e831de65076..3ce0a9941937f0277888bca3bcb6cce784696919 100644
--- a/man/gnt-instance.sgml
+++ b/man/gnt-instance.sgml
@@ -633,7 +633,7 @@
           <command>startup</command> command and they influence the
           actual instances being rebooted.
         </para>
-        
+
         <para>
           Use the <option>--force-multiple</option> to keep
           gnt-instance from asking for confirmation when more than one
@@ -799,18 +799,56 @@ node1.example.com:sdb:/dev/md1
           <command>failover</command>
           <arg>-f</arg>
           <arg>--ignore-consistency</arg>
-          <arg choice="req"><replaceable>instance</replaceable></arg>
+          <sbr>
+          <group choice="opt">
+            <arg>--instance</arg>
+            <arg>--primary</arg>
+            <arg>--secondary</arg>
+          </group>
+          <sbr>
+          <arg choice="req" rep="repeat"><replaceable>name</replaceable></arg>
         </cmdsynopsis>
 
         <para>
-          Failover will fail the instance over its secondary
+          Failover will fail the selected instances to their secondary
           node. This works only for instances having a remote raid
           disk layout.
         </para>
 
+        <para>
+          The selection of which instances to failover is done via the
+          following options:
+          <variablelist>
+            <varlistentry>
+              <term><option>--instance</option></term>
+              <listitem>
+                <simpara>will select the instances given as arguments
+                (at least one argument required); this is the default
+                selection</simpara>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><option>--primary</option></term>
+              <listitem>
+                <simpara>will select all instances whose primary node
+                is in the list of nodes passed as arguments (at least
+                one node required)</simpara>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><option>--secondary</option></term>
+              <listitem>
+                <simpara>will select all instances whose secondary
+                node is in the list of nodes passed as arguments (at
+                least one node required)</simpara>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </para>
+
         <para>
           Normally the failover will check the consistency of the
-          disks before failing over the instance. If you are trying to
+          disks before failing over an instance. If you are trying to
           migrate instances off a dead node, this will fail. Use the
           <option>--ignore-consistency</option> option for this
           purpose. Note that this option can be dangerous as errors in
@@ -823,6 +861,7 @@ node1.example.com:sdb:/dev/md1
           Example:
           <screen>
 # gnt-instance failover instance1.example.com
+# gnt-instance failover --primary node4.example.com
           </screen>
         </para>
       </refsect3>
diff --git a/scripts/gnt-instance b/scripts/gnt-instance
index 956b51337620667793f5f58b1b4bd0cb8ce678c9..9838b416763fdec5c66543c4f4ce80039f403983 100755
--- a/scripts/gnt-instance
+++ b/scripts/gnt-instance
@@ -465,20 +465,31 @@ def FailoverInstance(opts, args):
     force - whether to failover without asking questions.
 
   """
-  instance_name = args[0]
-  force = opts.force
+  if opts.multi_mode is None:
+    opts.multi_mode = _SHUTDOWN_INSTANCES
+  inames = _ExpandMultiNames(opts.multi_mode, args)
+  if not inames:
+    logger.ToStderr("No instances match the selected options")
+    return 1
+  multi_on = opts.multi_mode != _SHUTDOWN_INSTANCES or len(inames) > 1
+  if not (opts.force_multi or not multi_on
+          or _ConfirmOperation(inames, "failover (including shutdown)")):
+    return 1
 
-  if not force:
-    usertext = ("Failover will happen to image %s."
-                " This requires a shutdown of the instance. Continue?" %
-                (instance_name,))
-    if not AskUser(usertext):
-      return 1
+  result = 0
+  for name in inames:
+    op = opcodes.OpFailoverInstance(instance_name=name,
+                                    ignore_consistency=opts.ignore_consistency)
+    if multi_on:
+      logger.ToStdout("Failing over instance %s" % name)
+    try:
+      SubmitOpCode(op)
+    except errors.OpExecError, err:
+      result = 1
+      _, err_msg = FormatError(err)
+      logger.ToStderr(err_msg)
 
-  op = opcodes.OpFailoverInstance(instance_name=instance_name,
-                                  ignore_consistency=opts.ignore_consistency)
-  SubmitOpCode(op)
-  return 0
+  return result
 
 
 def ConnectToInstanceConsole(opts, args):
@@ -710,12 +721,13 @@ commands = {
   'console': (ConnectToInstanceConsole, ARGS_ONE, [DEBUG_OPT],
               "<instance>",
               "Opens a console on the specified instance"),
-  'failover': (FailoverInstance, ARGS_ONE,
+  'failover': (FailoverInstance, ARGS_ATLEAST(1),
                [DEBUG_OPT, FORCE_OPT,
                 make_option("--ignore-consistency", dest="ignore_consistency",
                             action="store_true", default=False,
                             help="Ignore the consistency of the disks on"
                             " the secondary"),
+                m_pri_node_opt, m_sec_node_opt, m_inst_opt, m_force_multi,
                 ],
                "[-f] <instance>",
                "Stops the instance and starts it on the backup node, using"