diff -ur include/client.h include/client.h
--- include/client.h	Thu Oct 25 12:25:06 2001
+++ include/client.h	Fri Oct 25 01:04:08 2002
@@ -332,6 +332,10 @@
 #define FLAGS_BOTS         0x0800 /* shows bots */
 #define FLAGS_EXTERNAL     0x1000 /* show servers introduced */
 #define FLAGS_SVCKILL	   0x2000 /* show services kills */
+#ifdef OPER_RELAX
+#define FLAGS_OPERMSG      0x800000 /* accept messages only from opers --Himika */
+#define FLAGS_NOIDLE	   0x1000000 /* Do not reset idle time --Himika */
+#endif
 
 /* user information flags, only settable by remote mode or local oper */
 #define FLAGS_OPER         0x4000 /* Operator */
@@ -388,12 +392,23 @@
 
 #define SEND_UMODES  (FLAGS_INVISIBLE | FLAGS_OPER | FLAGS_WALLOP | \
                       FLAGS_SILENCE)
+
+#ifdef OPER_RELAX
+#define ALL_UMODES   (SEND_UMODES | FLAGS_SERVNOTICE | FLAGS_CCONN | \
+                      FLAGS_REJ | FLAGS_SKILL | FLAGS_FULL | FLAGS_SPY | \
+                      FLAGS_NCHANGE | FLAGS_OPERWALL | FLAGS_DEBUG | \
+                      FLAGS_BOTS | FLAGS_EXTERNAL | FLAGS_LOCOP | \
+                      FLAGS_SVCKILL | FLAGS_NODCC | FLAGS_POWEROPER | \
+		      FLAGS_SILENCE | FLAGS_OPERSPOOF | FLAGS_OPERMSG | \
+		      FLAGS_NOIDLE)
+#else
 #define ALL_UMODES   (SEND_UMODES | FLAGS_SERVNOTICE | FLAGS_CCONN | \
                       FLAGS_REJ | FLAGS_SKILL | FLAGS_FULL | FLAGS_SPY | \
                       FLAGS_NCHANGE | FLAGS_OPERWALL | FLAGS_DEBUG | \
                       FLAGS_BOTS | FLAGS_EXTERNAL | FLAGS_LOCOP | \
                       FLAGS_SVCKILL | FLAGS_NODCC | FLAGS_POWEROPER | \
 		      FLAGS_SILENCE | FLAGS_OPERSPOOF)
+#endif
 
 #ifndef OPER_UMODES
 #define OPER_UMODES  (FLAGS_OPER | FLAGS_WALLOP | FLAGS_SERVNOTICE | \
@@ -447,6 +462,10 @@
 #define IsNoDccFiles(x)         ((x)->umodes & FLAGS_NODCC)
 #define SetNoDccFiles(x)        ((x)->umodes |= FLAGS_NODCC)
 #endif
+#ifdef OPER_RELAX
+#define IgnoreUsrMessage(x)     ((x)->umodes & FLAGS_OPERMSG)
+#define IsNoIdle(x)		((x)->umodes & FLAGS_NOIDLE)
+#endif
 #ifdef SERVICES
 #define IsNSId(x)               ((x)->umodes & FLAGS_NS_ID)
 #define IsOSId(x)               ((x)->umodes & FLAGS_OS_ID)
diff -ur include/config.h include/config.h
--- include/config.h	Sat Nov 17 19:48:03 2001
+++ include/config.h	Fri Oct 25 00:58:16 2002
@@ -271,6 +271,22 @@
 
 /* ------========== End of UniBG Network additions ==========------ */
 
+/* OPER_RELAX - Adds some nice oper-features:
+ * - support for +m nick mode. If this flag is set, the user
+ *   can accept messages _only_ from:
+ *   (1) Any global oper
+ *   (2) Local oper on the same server which the user is on
+ *
+ *   If a common user PRIVMSG'ed him, he receives an error message.
+ *   This patch is useful for big networks where o:line begging is typical :-)
+ *
+ * - support for +I usermode. While active disables resetting your idle-time. 
+ *   +N flag in o/O:line is required to permit setting this nick mode.
+ *
+ * -- Himika
+ */
+#define OPER_RELAX
+
 /* TS_MAX_DELTA and TS_WARN_DELTA -  allowed delta for TS when another
  * server connects.
  *
diff -ur include/numeric.h include/numeric.h
--- include/numeric.h	Thu Oct 25 10:10:39 2001
+++ include/numeric.h	Fri Oct 25 00:59:02 2002
@@ -371,6 +371,9 @@
 
 #define ERR_NOOPERHOST       491
 
+#ifdef OPER_RELAX
+#define ERR_NOUSERMSG        500
+#endif
 #define ERR_UMODEUNKNOWNFLAG 501
 #define ERR_USERSDONTMATCH   502
 
diff -ur src/m_message.c src/m_message.c
--- src/m_message.c	Sat Nov 17 17:26:25 2001
+++ src/m_message.c	Fri Oct 25 00:59:51 2002
@@ -307,6 +307,17 @@
           return 0;
 #endif
 
+#ifdef OPER_RELAX
+  /* Check for +m nick mode  -- Himika */
+
+     if (MyConnect(acptr) && IgnoreUsrMessage(acptr) && !IsAnOper(sptr))
+         {
+               sendto_one(sptr, form_str(ERR_NOUSERMSG), me.name, parv[0], nick);
+		   return 0;
+         }
+
+#endif
+
 #ifdef SERVICES
   #ifdef SILENCE_SUPPORT
       if (MyClient(sptr) && sptr->user && ServicesOn)
diff -ur src/messages_cust.tab src/messages_cust.tab
--- src/messages_cust.tab	Sat Nov 17 19:14:00 2001
+++ src/messages_cust.tab	Fri Oct 25 00:59:32 2002
@@ -586,12 +586,16 @@
 /* 497 */       (char *)NULL,
 /* 498 */       (char *)NULL,
 /* 499 */       (char *)NULL,
+#ifdef OPER_RELAX
+/* 500 ERR_NOUSERMSG, */       ":%s 500 %s :The user is accepting messages ONLY from IRC operators",
+#else
 /* 500 */       (char *)NULL,
-/* 501 ERR_UMODEUNKNOWNFLAG, */ ":%s 501 %s :Unknown MODE flag",
+#endif
+/* 501 ERR_UMODEUNKNOWNFLAG, */ ":%s 501 %s 
+:Unknown MODE flag",
 /* 502 ERR_USERSDONTMATCH, */   ":%s 502 %s :Can't change mode for other users",
 /* 503 ERR_GHOSTEDCLIENT, */    ":%s 503 %s :Message could not be delivered to %s",
 /* 504 LAST ERR_LAST_ERR_MSG, */        ":%s 504 %s :Last Error Message",
                 (char *)NULL
 };
 
-
diff -ur src/parse.c src/parse.c
--- src/parse.c	Fri Nov 24 20:24:37 2000
+++ src/parse.c	Fri Oct 25 00:48:35 2002
@@ -331,10 +331,18 @@
    */
 
 #ifdef IDLE_FROM_MSG
-  if (IsRegisteredUser(cptr) && mptr->reset_idle)
+  if (IsRegisteredUser(cptr) && mptr->reset_idle
+ #ifdef OPER_RELAX
+  && !IsNoIdle(cptr)
+ #endif
+ )
     from->user->last = CurrentTime;
 #else
-  if (IsRegisteredUser(cptr) && !mptr->reset_idle)
+  if (IsRegisteredUser(cptr) && !mptr->reset_idle
+ #ifdef OPER_RELAX
+  && !IsNoIdle(cptr)
+ #endif
+ )
     from->user->last = CurrentTime;
 #endif
   
diff -ur src/s_conf.c src/s_conf.c
--- src/s_conf.c	Sat Nov 17 19:34:56 2001
+++ src/s_conf.c	Fri Oct 25 00:53:05 2002
@@ -3176,6 +3176,12 @@
         int_flags |= FLAGS_SKILL;
       else if(*flags == 'f')
         int_flags |= FLAGS_FULL;
+#ifdef OPER_RELAX
+      else if(*flags == 'I')
+	int_flags |= FLAGS_NOIDLE;
+      else if(*flags == 'm')
+	int_flags |= FLAGS_OPERMSG;
+#endif
       else if(*flags == 'y')
         int_flags |= FLAGS_SPY;
       else if(*flags == 'l')
@@ -3235,6 +3241,12 @@
     *flags_ptr++ = 'l';
   if(flags & FLAGS_FULL)
     *flags_ptr++ = 'f';
+#ifdef OPER_RELAX
+  if(flags & FLAGS_NOIDLE)
+    *flags_ptr++ = 'I';
+  if(flags & FLAGS_OPERMSG)
+    *flags_ptr++ = 'm';
+#endif
   if(flags & FLAGS_SPY)
     *flags_ptr++ = 'y';
   if(flags & FLAGS_DEBUG)
@@ -3963,4 +3975,4 @@
     }
   return NO;
 }
-#endif
\ No newline at end of file
+#endif
diff -ur src/s_user.c src/s_user.c
--- src/s_user.c	Thu Oct 25 12:40:13 2001
+++ src/s_user.c	Fri Oct 25 01:05:34 2002
@@ -94,6 +94,10 @@
   {FLAGS_EXTERNAL, 'x'},
   {FLAGS_SPY, 'y'},
   {FLAGS_OPERWALL, 'z'},
+#ifdef OPER_RELAX
+  {FLAGS_NOIDLE, 'I'},
+  {FLAGS_OPERMSG, 'm'},
+#endif
 #ifdef SERVICES
   {FLAGS_SVCKILL, 'e'},
  #ifdef SILENCE_SUPPORT
@@ -127,7 +131,11 @@
   0,            /* F */
   0,            /* G */
   0,            /* H */
+#ifdef OPER_RELAX
+  FLAGS_NOIDLE,  /* I */
+#else
   0,            /* I */
+#endif
   0,            /* J */
   0,            /* K */
   0,            /* L */
@@ -169,7 +177,11 @@
   0,            /* j */
   FLAGS_SKILL,  /* k */
   FLAGS_POWEROPER, /* l */
-  0,            /* m */
+#ifdef OPER_RELAX
+  FLAGS_OPERMSG, /* m */
+#else
+  0,             /* m */
+#endif
   FLAGS_NCHANGE, /* n */
   FLAGS_OPER,   /* o */
   0,            /* p */
@@ -1861,8 +1873,12 @@
 */
 int m_user(aClient* cptr, aClient* sptr, int parc, char *parv[])
 {
+#ifdef OPER_RELAX
+#define UFLAGS  (FLAGS_INVISIBLE|FLAGS_WALLOP|FLAGS_SERVNOTICE|FLAGS_OPERMSG)
+#else
 #define UFLAGS  (FLAGS_INVISIBLE|FLAGS_WALLOP|FLAGS_SERVNOTICE)
-  char* username;
+#endif  
+char* username;
   char* host;
   char* server;
   char* realname;
@@ -2146,6 +2162,11 @@
  #endif
 #endif
 
+#ifdef OPER_RELAX
+  if ((sptr->umodes & FLAGS_NOIDLE) && !IsSetOperN(sptr))
+	sptr->umodes &= ~FLAGS_NOIDLE;
+#endif
+
 #ifdef POWEROPERS
   if ((sptr->umodes & FLAGS_POWEROPER) && !IsSetOperN(sptr))
     {
