diff -r 0b71aa85809c include/struct.h
--- a/include/struct.h	Wed Jul 13 13:11:57 2011 -0400
+++ b/include/struct.h	Wed Jul 13 13:14:04 2011 -0400
@@ -1214,7 +1214,7 @@
 	anAuthStruct	 *auth;
 	ConfigItem_class *class;
 	ConfigItem	 *from;
-	unsigned long	 modes;
+	unsigned long	 modes, require_modes;
 	long		 oflags;
 	int			maxlogins;
 };
diff -r 0b71aa85809c src/modules/m_oper.c
--- a/src/modules/m_oper.c	Wed Jul 13 13:11:57 2011 -0400
+++ b/src/modules/m_oper.c	Wed Jul 13 13:14:04 2011 -0400
@@ -211,6 +211,21 @@
 		sptr->since += 7;
 		return 0;
 	}
+
+	/* Check oper::require_modes */
+	if (aconf->require_modes & ~sptr->umodes)
+	{
+		sendto_one(sptr, err_str(ERR_NOOPERHOST), me.name, parv[0]);
+		sendto_snomask_global
+			(SNO_OPER, "Failed OPER attempt by %s (%s@%s) [lacking modes '%s' in oper::require-modes]",
+			 parv[0], sptr->user->username, sptr->sockhost, get_modestr(aconf->require_modes & ~sptr->umodes));
+		ircd_log(LOG_OPER, "OPER MISSINGMODES (%s) by (%s!%s@%s), needs modes=%s",
+			 name, parv[0], sptr->user->username, sptr->sockhost,
+			 get_modestr(aconf->require_modes & ~sptr->umodes));
+		sptr->since += 7;
+		return 0;
+	}
+
 	strlcpy(nuhhost, make_user_host(sptr->user->username, sptr->user->realhost), sizeof(nuhhost));
 	strlcpy(nuhhost2, make_user_host(sptr->user->username, Inet_ia2p(&sptr->ip)), sizeof(nuhhost2));
 	for (oper_from = (ConfigItem_oper_from *) aconf->from;
diff -r 0b71aa85809c src/s_conf.c
--- a/src/s_conf.c	Wed Jul 13 13:11:57 2011 -0400
+++ b/src/s_conf.c	Wed Jul 13 13:14:04 2011 -0400
@@ -3672,6 +3672,10 @@
 		{
 			oper->modes = set_usermode(cep->ce_vardata);
 		}
+		else if (!strcmp(cep->ce_varname, "require-modes"))
+		{
+			oper->require_modes = set_usermode(cep->ce_vardata);
+		}
 		else if (!strcmp(cep->ce_varname, "maxlogins"))
 		{
 			oper->maxlogins = atoi(cep->ce_vardata);
@@ -3702,7 +3706,7 @@
 int	_test_oper(ConfigFile *conf, ConfigEntry *ce)
 {
 	char has_class = 0, has_password = 0, has_flags = 0, has_swhois = 0, has_snomask = 0;
-	char has_modes = 0, has_from = 0, has_maxlogins = 0;
+	char has_modes = 0, has_require_modes = 0, has_from = 0, has_maxlogins = 0;
 	int oper_flags = 0;
 	ConfigEntry *cep;
 	ConfigEntry *cepp;
@@ -3778,7 +3782,7 @@
 				has_snomask = 1;
 			}
 			/* oper::modes */
-			else if (!strcmp(cep->ce_varname, "modes")) 
+			else if (!strcmp(cep->ce_varname, "modes"))
 			{
 				char *p;
 				for (p = cep->ce_vardata; *p; p++)
@@ -3796,6 +3800,24 @@
 				}
 				has_modes = 1;
 			}
+			/* oper::require-modes */
+			else if (!strcmp(cep->ce_varname, "require-modes"))
+			{
+				char *p;
+				for (p = cep->ce_vardata; *p; p++)
+					if (strchr("oOaANC", *p))
+					{
+						config_warn("%s:%i: oper::require-modes probably shouldn't include mode '%c'",
+							cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p);
+					}
+				if (has_require_modes)
+				{
+					config_warn_duplicate(cep->ce_fileptr->cf_filename,
+						cep->ce_varlinenum, "oper::require-modes");
+					continue;
+				}
+				has_require_modes = 1;
+			}
 			/* oper::maxlogins */
 			else if (!strcmp(cep->ce_varname, "maxlogins"))
 			{
