diff --git a/lib/config.py b/lib/config.py
index 475d368f2f9b260fbc945fb45a8ee42a1c7ec774..156acdaba00e24408b2b7c4c4119414421f5bc96 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -396,6 +396,27 @@ class ConfigWriter:
       result.append("DRBD minor %d on node %s is assigned twice to instances"
                     " %s and %s" % (minor, node, instance_a, instance_b))
 
+    # IP checks
+    ips = { data.cluster.master_ip: ["cluster_ip"] }
+    def _helper(ip, name):
+      if ip in ips:
+        ips[ip].append(name)
+      else:
+        ips[ip] = [name]
+
+    for node in data.nodes.values():
+      _helper(node.primary_ip, "node:%s/primary" % node.name)
+      if node.secondary_ip != node.primary_ip:
+        _helper(node.secondary_ip, "node:%s/secondary" % node.name)
+    for instance in data.instances.values():
+      for idx, nic in enumerate(instance.nics):
+        if nic.ip is not None:
+          _helper(nic.ip, "instance:%s/nic:%d" % (instance.name, idx))
+
+    for ip, owners in ips.items():
+      if len(owners) > 1:
+        result.append("IP address %s is used by multiple owners: %s" %
+                      (ip, ", ".join(owners)))
     return result
 
   @locking.ssynchronized(_config_lock, shared=1)