diff --git a/lib/cli.py b/lib/cli.py
index 00cb0da68d74084d55442b7b5d0f8ff4d4cb5080..ebf91c81979fccb100e96409e7062e1081832009 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -2309,7 +2309,8 @@ def GenericInstanceCreate(mode, opts, args):
                                 src_path=src_path,
                                 tags=tags,
                                 no_install=no_install,
-                                identify_defaults=identify_defaults)
+                                identify_defaults=identify_defaults,
+                                ignore_ipolicy=opts.ignore_ipolicy)
 
   SubmitOrSend(op, opts)
   return 0
diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py
index f6fb783fa9df8ec07847a561a7df7c1efc2c39f6..6fc1a0280d29a110806e9833d0d62fab9d34b8fe 100644
--- a/lib/client/gnt_instance.py
+++ b/lib/client/gnt_instance.py
@@ -1422,6 +1422,7 @@ add_opts = [
   OS_OPT,
   FORCE_VARIANT_OPT,
   NO_INSTALL_OPT,
+  IGNORE_IPOLICY_OPT,
   ]
 
 commands = {
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 64c3a4f9365eec402aca633b55d8a5c33501f0d1..38fb083c53dc9e7744db527ab0f6b0e5244e9462 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -9394,7 +9394,7 @@ class LUInstanceCreate(LogicalUnit):
       # pylint: disable=W0142
       self.instance_file_storage_dir = utils.PathJoin(*joinargs)
 
-  def CheckPrereq(self):
+  def CheckPrereq(self): # pylint: disable=R0914
     """Check prerequisites.
 
     """
@@ -9631,6 +9631,23 @@ class LUInstanceCreate(LogicalUnit):
 
     nodenames = [pnode.name] + self.secondaries
 
+    # Verify instance specs
+    ispec = {
+      constants.ISPEC_MEM_SIZE: self.be_full.get(constants.BE_MAXMEM, None),
+      constants.ISPEC_CPU_COUNT: self.be_full.get(constants.BE_VCPUS, None),
+      constants.ISPEC_DISK_COUNT: len(self.disks),
+      constants.ISPEC_DISK_SIZE: [disk.size for disk in self.disks],
+      constants.ISPEC_NIC_COUNT: len(self.nics),
+      }
+
+    ipolicy = _CalculateGroupIPolicy(cluster, pnode.group)
+    res = _ComputeIPolicyInstanceSpecViolation(ipolicy, ispec)
+    if not self.op.ignore_ipolicy and res:
+      raise errors.OpPrereqError(("Instance allocation to group %s violates"
+                                  " policy: %s") % (pnode.group,
+                                                    utils.CommaJoin(res)),
+                                  errors.ECODE_INVAL)
+
     # disk parameters (not customizable at instance or node level)
     # just use the primary node parameters, ignoring the secondary.
     self.diskparams = self.cfg.GetNodeGroup(pnode.group).diskparams
diff --git a/lib/opcodes.py b/lib/opcodes.py
index 5c6b01564ffac8c7104c1d93f49c0eac36436363..3f6a845cc73d42c664732c690105f2325ba663d0 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -1086,6 +1086,7 @@ class OpInstanceCreate(OpCode):
     _PForceVariant,
     _PWaitForSync,
     _PNameCheck,
+    _PIgnoreIpolicy,
     ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
     ("disks", ht.NoDefault,
      # TODO: Generate check from constants.IDISK_PARAMS_TYPES
diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst
index 61ddd99d050a3911300fba6c3e57d46497f7c308..238cbd7ee06dd940cea958cc872a6e0fadb6584b 100644
--- a/man/gnt-instance.rst
+++ b/man/gnt-instance.rst
@@ -39,6 +39,7 @@ ADD
 | {{-n|--node} *node[:secondary-node]* \| {-I|--iallocator} *name*}
 | {{-o|--os-type} *os-type*}
 | [--submit]
+| [--ignore-ipolicy]
 | {*instance*}
 
 Creates a new instance on the specified host. The *instance* argument
@@ -629,6 +630,9 @@ The ``--submit`` option is used to send the job to the master daemon
 but not wait for its completion. The job ID will be shown so that it
 can be examined via **gnt-job info**.
 
+If ``--ignore-ipolicy`` is given any instance policy violations occuring
+during this operation are ignored.
+
 Example::
 
     # gnt-instance add -t file --disk 0:size=30g -B maxmem=512 -o debian-etch \