diff --git a/lib/config.py b/lib/config.py
index 58871d511557b051c0ca5283619b02fdd4ac7b64..b43b3e8c1da4e9b54abbf4b738284c82931b20b7 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -1052,6 +1052,10 @@ class ConfigWriter:
         not hasattr(data.cluster, 'rsahostkeypub')):
       raise errors.ConfigurationError("Incomplete configuration"
                                       " (missing cluster.rsahostkeypub)")
+
+    # Upgrade configuration if needed
+    data.UpgradeConfig()
+
     self._config_data = data
     # reset the last serial as -1 so that the next write will cause
     # ssconf update
diff --git a/lib/objects.py b/lib/objects.py
index d5f446ed7c25ea0742f7e2a202d263f36549295a..43cea750dd87d3e1123e2c896dd4ac2ebbeac3d2 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -58,7 +58,6 @@ class ConfigObject(object):
   def __init__(self, **kwargs):
     for k, v in kwargs.iteritems():
       setattr(self, k, v)
-    self.UpgradeConfig()
 
   def __getattr__(self, name):
     if name not in self.__slots__:
@@ -169,8 +168,8 @@ class ConfigObject(object):
   def UpgradeConfig(self):
     """Fill defaults for missing configuration values.
 
-    This method will be called at object init time, and its implementation will
-    be object dependent.
+    This method will be called at configuration load time, and its
+    implementation will be object dependent.
 
     """
     pass
@@ -283,6 +282,16 @@ class ConfigData(ConfigObject):
     obj.instances = cls._ContainerFromDicts(obj.instances, dict, Instance)
     return obj
 
+  def UpgradeConfig(self):
+    """Fill defaults for missing configuration values.
+
+    """
+    self.cluster.UpgradeConfig()
+    for node in self.nodes.values():
+      node.UpgradeConfig()
+    for instance in self.instances.values():
+      instance.UpgradeConfig()
+
 
 class NIC(ConfigObject):
   """Config object representing a network card."""
@@ -536,6 +545,15 @@ class Disk(ConfigObject):
       all_errors.append("Disk access mode '%s' is invalid" % (self.mode, ))
     return all_errors
 
+  def UpgradeConfig(self):
+    """Fill defaults for missing configuration values.
+
+    """
+    if self.children:
+      for child in self.children:
+        child.UpgradeConfig()
+    # add here config upgrade for this disk
+
 
 class Instance(TaggableObject):
   """Config object representing an instance."""
@@ -685,6 +703,15 @@ class Instance(TaggableObject):
     obj.disks = cls._ContainerFromDicts(obj.disks, list, Disk)
     return obj
 
+  def UpgradeConfig(self):
+    """Fill defaults for missing configuration values.
+
+    """
+    for nic in self.nics:
+      nic.UpgradeConfig()
+    for disk in self.disks:
+      disk.UpgradeConfig()
+
 
 class OS(ConfigObject):
   """Config object representing an operating system."""