diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index a397ab827281a89caf51d18e39153efd2b49ca53..552477f458db6cc5e9c9b96cd5069548770ba9a0 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -727,7 +727,7 @@ class LUVerifyCluster(LogicalUnit):
     return bad
 
   def _VerifyInstance(self, instance, instanceconfig, node_vol_is,
-                      node_instance, feedback_fn):
+                      node_instance, feedback_fn, n_offline):
     """Verify an instance.
 
     This function checks to see if the required block devices are
@@ -742,6 +742,9 @@ class LUVerifyCluster(LogicalUnit):
     instanceconfig.MapLVsByNode(node_vol_should)
 
     for node in node_vol_should:
+      if node in n_offline:
+        # ignore missing volumes on offline nodes
+        continue
       for volume in node_vol_should[node]:
         if node not in node_vol_is or volume not in node_vol_is[node]:
           feedback_fn("  - ERROR: volume %s missing on node %s" %
@@ -749,8 +752,9 @@ class LUVerifyCluster(LogicalUnit):
           bad = True
 
     if not instanceconfig.status == 'down':
-      if (node_current not in node_instance or
-          not instance in node_instance[node_current]):
+      if ((node_current not in node_instance or
+          not instance in node_instance[node_current]) and
+          node_current not in n_offline):
         feedback_fn("  - ERROR: instance %s not running on node %s" %
                         (instance, node_current))
         bad = True
@@ -865,6 +869,7 @@ class LUVerifyCluster(LogicalUnit):
     instancelist = utils.NiceSort(self.cfg.GetInstanceList())
     i_non_redundant = [] # Non redundant instances
     i_non_a_balanced = [] # Non auto-balanced instances
+    n_offline = [] # List of offline nodes
     node_volume = {}
     node_instance = {}
     node_info = {}
@@ -902,6 +907,11 @@ class LUVerifyCluster(LogicalUnit):
       node = node_i.name
       nresult = all_nvinfo[node].data
 
+      if node_i.offline:
+        feedback_fn("* Skipping offline node %s" % (node,))
+        n_offline.append(node)
+        continue
+
       if node == master_node:
         ntype = "master"
       elif node_i.master_candidate:
@@ -974,7 +984,7 @@ class LUVerifyCluster(LogicalUnit):
       feedback_fn("* Verifying instance %s" % instance)
       inst_config = self.cfg.GetInstanceInfo(instance)
       result =  self._VerifyInstance(instance, inst_config, node_volume,
-                                     node_instance, feedback_fn)
+                                     node_instance, feedback_fn, n_offline)
       bad = bad or result
 
       inst_config.MapLVsByNode(node_vol_should)
@@ -984,7 +994,7 @@ class LUVerifyCluster(LogicalUnit):
       pnode = inst_config.primary_node
       if pnode in node_info:
         node_info[pnode]['pinst'].append(instance)
-      else:
+      elif pnode not in n_offline:
         feedback_fn("  - ERROR: instance %s, connection to primary node"
                     " %s failed" % (instance, pnode))
         bad = True
@@ -1009,7 +1019,7 @@ class LUVerifyCluster(LogicalUnit):
           if pnode not in node_info[snode]['sinst-by-pnode']:
             node_info[snode]['sinst-by-pnode'][pnode] = []
           node_info[snode]['sinst-by-pnode'][pnode].append(instance)
-        else:
+        elif snode not in n_offline:
           feedback_fn("  - ERROR: instance %s, connection to secondary node"
                       " %s failed" % (instance, snode))
 
@@ -1037,6 +1047,9 @@ class LUVerifyCluster(LogicalUnit):
       feedback_fn("  - NOTICE: %d non-auto-balanced instance(s) found."
                   % len(i_non_a_balanced))
 
+    if n_offline:
+      feedback_fn("  - NOTICE: %d offline node(s) found." % len(n_offline))
+
     return not bad
 
   def HooksCallBack(self, phase, hooks_results, feedback_fn, lu_result):
@@ -1068,6 +1081,9 @@ class LUVerifyCluster(LogicalUnit):
           show_node_header = True
           res = hooks_results[node_name]
           if res.failed or res.data is False or not isinstance(res.data, list):
+            if res.offline:
+              # no need to warn or set fail return value
+              continue
             feedback_fn("    Communication failure in hooks execution")
             lu_result = 1
             continue
@@ -1141,8 +1157,9 @@ class LUVerifyDisks(NoHooksLU):
       # node_volume
       lvs = node_lvs[node]
       if lvs.failed:
-        self.LogWarning("Connection to node %s failed: %s" %
-                        (node, lvs.data))
+        if not lvs.offline:
+          self.LogWarning("Connection to node %s failed: %s" %
+                          (node, lvs.data))
         continue
       lvs = lvs.data
       if isinstance(lvs, basestring):
diff --git a/lib/mcpu.py b/lib/mcpu.py
index b8ae625f69144c364a077689000f57634ccb1cbb..a41b5c1e033748ae5241ee0ab1ccca5c611a9fb7 100644
--- a/lib/mcpu.py
+++ b/lib/mcpu.py
@@ -338,7 +338,9 @@ class HooksMaster(object):
       for node_name in results:
         res = results[node_name]
         if res.failed or res.data is False or not isinstance(res.data, list):
-          self.proc.LogWarning("Communication failure to node %s" % node_name)
+          if not res.offline:
+            self.proc.LogWarning("Communication failure to node %s" %
+                                 node_name)
           continue
         for script, hkr, output in res.data:
           if hkr == constants.HKR_FAIL: