diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 3b95fd37aa3cd2d3dde8a3f9901a965e7ed9dcff..f59f5b3f46afb7c97608daef731bd1333d8d6137 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2100,6 +2100,9 @@ class LUSetNodeParams(LogicalUnit):
     force = self.force = self.op.force
 
     if self.op.master_candidate == False:
+      if self.op.node_name == self.cfg.GetMasterNode():
+        raise errors.OpPrereqError("The master node has to be a"
+                                   " master candidate")
       cp_size = self.cfg.GetClusterInfo().candidate_pool_size
       node_info = self.cfg.GetAllNodesInfo().values()
       num_candidates = len([node for node in node_info
@@ -2129,7 +2132,8 @@ class LUSetNodeParams(LogicalUnit):
     # this will trigger configuration file update, if needed
     self.cfg.Update(node)
     # this will trigger job queue propagation or cleanup
-    self.context.ReaddNode(node)
+    if self.op.node_name != self.cfg.GetMasterNode():
+      self.context.ReaddNode(node)
 
     return result
 
diff --git a/lib/config.py b/lib/config.py
index 9d04231d37d192453e91619401b31a9e4d49ed20..67c5e06bb56777f1990b8fa806c48db36e9041e6 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -272,14 +272,17 @@ class ConfigWriter:
         result.append("Highest used port mismatch, saved %s, computed %s" %
                       (data.cluster.highest_used_port, keys[-1]))
 
+    if not data.nodes[data.cluster.master_node].master_candidate:
+      result.append("Master node is not a master candidate")
+
     cp_size = data.cluster.candidate_pool_size
     num_c = 0
     for node in data.nodes.values():
       if node.master_candidate:
         num_c += 1
-    if cp_size > num_c:
-      result.append("Not enough master candidates: actual %d, desired %d" %
-                    (num_c, cp_size))
+    if cp_size > num_c and num_c < len(data.nodes):
+      result.append("Not enough master candidates: actual %d, desired %d,"
+                    " %d total nodes" % (num_c, cp_size, len(data.nodes)))
 
     return result