diff --git a/lib/client/gnt_network.py b/lib/client/gnt_network.py
index c61a7dfcd3b016fafbaca898e34c814bd7d1417d..562f9578459042c878a3ffb91c7103ff145982a5 100644
--- a/lib/client/gnt_network.py
+++ b/lib/client/gnt_network.py
@@ -71,6 +71,7 @@ def AddNetwork(opts, args):
                     mac_prefix=opts.mac_prefix,
                     network_type=opts.network_type,
                     add_reserved_ips=_HandleReservedIPs(opts.add_reserved_ips),
+                    conflicts_check=opts.conflicts_check,
                     tags=tags)
   SubmitOpCode(op, opts=opts)
 
@@ -293,8 +294,9 @@ def RemoveNetwork(opts, args):
 commands = {
   "add": (
     AddNetwork, ARGS_ONE_NETWORK,
-    [DRY_RUN_OPT, NETWORK_OPT, GATEWAY_OPT, ADD_RESERVED_IPS_OPT, TAG_ADD_OPT,
-     MAC_PREFIX_OPT, NETWORK_TYPE_OPT, NETWORK6_OPT, GATEWAY6_OPT],
+    [DRY_RUN_OPT, NETWORK_OPT, GATEWAY_OPT, ADD_RESERVED_IPS_OPT,
+     MAC_PREFIX_OPT, NETWORK_TYPE_OPT, NETWORK6_OPT, GATEWAY6_OPT,
+     NOCONFLICTSCHECK_OPT, TAG_ADD_OPT],
     "<network_name>", "Add a new IP network to the cluster"),
   "list": (
     ListNetworks, ARGS_MANY_NETWORKS,
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 8ff1daeb51a70f18f06b093611980a655357e1c7..981014b2a59cf021fe555cbbcb9ab2e2eb8159c2 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -15591,7 +15591,6 @@ class LUTestAllocator(NoHooksLU):
     return result
 
 
-# Network LUs
 class LUNetworkAdd(LogicalUnit):
   """Logical unit for creating networks.
 
@@ -15609,7 +15608,15 @@ class LUNetworkAdd(LogicalUnit):
 
   def ExpandNames(self):
     self.network_uuid = self.cfg.GenerateUniqueID(self.proc.GetECId())
-    self.needed_locks = {}
+
+    if self.op.conflicts_check:
+      self.share_locks[locking.LEVEL_NODE] = 1
+      self.needed_locks = {
+        locking.LEVEL_NODE: locking.ALL_SET,
+        }
+    else:
+      self.needed_locks = {}
+
     self.add_locks[locking.LEVEL_NETWORK] = self.network_uuid
 
   def CheckPrereq(self):
@@ -15674,21 +15681,22 @@ class LUNetworkAdd(LogicalUnit):
     # Check if we need to reserve the nodes and the cluster master IP
     # These may not be allocated to any instances in routed mode, as
     # they wouldn't function anyway.
-    for node in self.cfg.GetAllNodesInfo().values():
-      for ip in [node.primary_ip, node.secondary_ip]:
-        try:
-          pool.Reserve(ip)
-          self.LogInfo("Reserved node %s's IP (%s)", node.name, ip)
+    if self.op.conflicts_check:
+      for node in self.cfg.GetAllNodesInfo().values():
+        for ip in [node.primary_ip, node.secondary_ip]:
+          try:
+            pool.Reserve(ip)
+            self.LogInfo("Reserved node %s's IP (%s)", node.name, ip)
 
-        except errors.AddressPoolError:
-          pass
+          except errors.AddressPoolError:
+            pass
 
-    master_ip = self.cfg.GetClusterInfo().master_ip
-    try:
-      pool.Reserve(master_ip)
-      self.LogInfo("Reserved cluster master IP (%s)", master_ip)
-    except errors.AddressPoolError:
-      pass
+      master_ip = self.cfg.GetClusterInfo().master_ip
+      try:
+        pool.Reserve(master_ip)
+        self.LogInfo("Reserved cluster master IP (%s)", master_ip)
+      except errors.AddressPoolError:
+        pass
 
     if self.op.add_reserved_ips:
       for ip in self.op.add_reserved_ips:
@@ -15716,8 +15724,11 @@ class LUNetworkRemove(LogicalUnit):
     if not self.network_uuid:
       raise errors.OpPrereqError("Network %s not found" % self.op.network_name,
                                  errors.ECODE_INVAL)
+
+    self.share_locks[locking.LEVEL_NODEGROUP] = 1
     self.needed_locks = {
       locking.LEVEL_NETWORK: [self.network_uuid],
+      locking.LEVEL_NODEGROUP: locking.ALL_SET,
       }
 
   def CheckPrereq(self):
@@ -16059,11 +16070,11 @@ class LUNetworkConnect(LogicalUnit):
       raise errors.OpPrereqError("Group %s does not exist" %
                                  self.group_name, errors.ECODE_INVAL)
 
+    self.share_locks[locking.LEVEL_INSTANCE] = 1
     self.needed_locks = {
       locking.LEVEL_INSTANCE: [],
       locking.LEVEL_NODEGROUP: [self.group_uuid],
       }
-    self.share_locks[locking.LEVEL_INSTANCE] = 1
 
   def DeclareLocks(self, level):
     if level == locking.LEVEL_INSTANCE:
@@ -16071,8 +16082,10 @@ class LUNetworkConnect(LogicalUnit):
 
       # Lock instances optimistically, needs verification once group lock has
       # been acquired
-      self.needed_locks[locking.LEVEL_INSTANCE] = \
-          self.cfg.GetNodeGroupInstances(self.group_uuid)
+      if self.op.conflicts_check:
+        self.needed_locks[locking.LEVEL_INSTANCE] = \
+            self.cfg.GetNodeGroupInstances(self.group_uuid)
+        self.needed_locks[locking.LEVEL_NETWORK] = [self.network_uuid]
 
   def BuildHooksEnv(self):
     ret = {
@@ -16158,7 +16171,6 @@ class LUNetworkDisconnect(LogicalUnit):
                                  self.group_name, errors.ECODE_INVAL)
 
     self.needed_locks = {
-      locking.LEVEL_INSTANCE: [],
       locking.LEVEL_NODEGROUP: [self.group_uuid],
       }
     self.share_locks[locking.LEVEL_INSTANCE] = 1
@@ -16169,8 +16181,9 @@ class LUNetworkDisconnect(LogicalUnit):
 
       # Lock instances optimistically, needs verification once group lock has
       # been acquired
-      self.needed_locks[locking.LEVEL_INSTANCE] = \
-          self.cfg.GetNodeGroupInstances(self.group_uuid)
+      if self.op.conflicts_check:
+        self.needed_locks[locking.LEVEL_INSTANCE] = \
+            self.cfg.GetNodeGroupInstances(self.group_uuid)
 
   def BuildHooksEnv(self):
     ret = {
diff --git a/lib/opcodes.py b/lib/opcodes.py
index ba0940aabf50d6a08218dd015006daba72e7f359..0c1b83c21d59cb07ac32d18d4aaceacf7c77fa51 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -2029,6 +2029,8 @@ class OpNetworkAdd(OpCode):
      "MAC address prefix that overrides cluster one"),
     ("add_reserved_ips", None, _TMaybeAddr4List,
      "Which IP addresses to reserve"),
+    ("conflicts_check", True, ht.TBool,
+     "Whether to check for conflicting IP addresses"),
     ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), "Network tags"),
     ]
   OP_RESULT = ht.TNone