diff --git a/daemons/ganeti-masterd b/daemons/ganeti-masterd
index 28e6c59885dcd867c7b3a5ec9abd48937e3792f7..5de935b896d6a3e779acc309d410b12ecebc3043 100755
--- a/daemons/ganeti-masterd
+++ b/daemons/ganeti-masterd
@@ -284,6 +284,31 @@ class GanetiContext(object):
     assert self.__class__._instance is None, "Attempt to modify Ganeti Context"
     object.__setattr__(self, name, value)
 
+  def AddNode(self, node):
+    """Adds a node to the configuration and lock manager.
+
+    """
+    # Add it to the configuration
+    self.cfg.AddNode(node)
+
+    # Add the new node to the Ganeti Lock Manager
+    self.glm.add(locking.LEVEL_NODE, node.name)
+
+  def ReaddNode(self, node):
+    """Updates a node that's already in the configuration
+
+    """
+
+  def RemoveNode(self, name):
+    """Removes a node from the configuration and lock manager.
+
+    """
+    # Remove node from configuration
+    self.cfg.RemoveNode(name)
+
+    # Remove the node from the Ganeti Lock Manager
+    self.glm.remove(locking.LEVEL_NODE, name)
+
 
 def ParseOptions():
   """Parse the command line options.
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 7ad77f6cffd0f14d7bad2440232441dbc25f6428..744fe16a8e111703f5079d7893c11c8daddbdbf2 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -1356,15 +1356,9 @@ class LURemoveNode(LogicalUnit):
     logger.Info("stopping the node daemon and removing configs from node %s" %
                 node.name)
 
-    rpc.call_node_leave_cluster(node.name)
-
-    logger.Info("Removing node %s from config" % node.name)
-
-    self.cfg.RemoveNode(node.name)
-    # Remove the node from the Ganeti Lock Manager
-    self.context.glm.remove(locking.LEVEL_NODE, node.name)
+    self.context.RemoveNode(node.name)
 
-    utils.RemoveHostFromEtcHosts(node.name)
+    rpc.call_node_leave_cluster(node.name)
 
 
 class LUQueryNodes(NoHooksLU):
@@ -1738,11 +1732,10 @@ class LUAddNode(LogicalUnit):
       if not result[node]:
         logger.Error("could not copy file %s to node %s" % (fname, node))
 
-    if not self.op.readd:
-      logger.Info("adding node %s to cluster.conf" % node)
-      self.cfg.AddNode(new_node)
-      # Add the new node to the Ganeti Lock Manager
-      self.context.glm.add(locking.LEVEL_NODE, node)
+    if self.op.readd:
+      self.context.ReaddNode(new_node)
+    else:
+      self.context.AddNode(new_node)
 
 
 class LUQueryClusterInfo(NoHooksLU):
diff --git a/lib/config.py b/lib/config.py
index d3c40cdfe44df608de839aa1544d1e1fea85f837..adf57f3c39aba707fd28c1435fa5854b9e214510 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -34,6 +34,7 @@ much memory.
 import os
 import tempfile
 import random
+import logging
 
 from ganeti import errors
 from ganeti import locking
@@ -461,6 +462,8 @@ class ConfigWriter:
       node: an object.Node instance
 
     """
+    logging.info("Adding node %s to configuration" % node.name)
+
     self._OpenConfig()
     self._config_data.nodes[node.name] = node
     self._WriteConfig()
@@ -470,6 +473,8 @@ class ConfigWriter:
     """Remove a node from the configuration.
 
     """
+    logging.info("Removing node %s from configuration" % node_name)
+
     self._OpenConfig()
     if node_name not in self._config_data.nodes:
       raise errors.ConfigurationError("Unknown node '%s'" % node_name)