diff -urN Unreal3.2/include/common.h patched/Unreal3.2/include/common.h
--- Unreal3.2/include/common.h	Sun Mar 13 21:02:43 2005
+++ patched/Unreal3.2/include/common.h	Tue Dec 13 19:06:00 2005
@@ -150,7 +150,7 @@
 
 extern MODVAR u_char tolowertab[], touppertab[];
 
-#if defined(NICK_GB2312) || defined(NICK_GBK) || defined(NICK_GBK_JAP)
+#if (defined(NICK_GB2312) || defined(NICK_GBK) || defined(NICK_GBK_JAP)) && !defined(RUSSIAN_IRCD)
 #define USE_LOCALE
 #include <ctype.h>
 #endif
@@ -198,11 +198,26 @@
 #define	iscntrl(c) (char_atribs[(u_char)(c)]&CNTRL)
 #define isalpha(c) (char_atribs[(u_char)(c)]&ALPHA)
 #define isspace(c) (char_atribs[(u_char)(c)]&SPACE)
+#define isdigit(c) (char_atribs[(u_char)(c)]&DIGIT)
+
+#ifndef RUSSIAN_IRCD
 #define islower(c) ((char_atribs[(u_char)(c)]&ALPHA) && ((u_char)(c) > 0x5f))
 #define isupper(c) ((char_atribs[(u_char)(c)]&ALPHA) && ((u_char)(c) < 0x60))
-#define isdigit(c) (char_atribs[(u_char)(c)]&DIGIT)
 #define	isxdigit(c) (isdigit(c) || ('a' <= (c) && (c) <= 'f') || \
 		     ('A' <= (c) && (c) <= 'F'))
+#else
+#define islower(c) ((char_atribs[(u_char)(c)]&ALPHA) && (((u_char)(c) >= 0x61 && (u_char)(c) <= 0x7a) || \
+			((u_char)(c) >= 0xe0 && (u_char)(c) <= 0xff) || \
+			(u_char)(c) == 0xb8))
+#define isupper(c) ((char_atribs[(u_char)(c)]&ALPHA) && (((u_char)(c) >= 0x41 && (u_char)(c) <= 0x5a) || \
+			((u_char)(c) >= 0xc0 && (u_char)(c) <= 0xdf) || \
+			(u_char)(c) == 0xa8))
+#define	isxdigit(c) (isdigit(c) || ('a' <= (c) && (c) <= 'f') || \
+		     ('A' <= (c) && (c) <= 'F') || \
+		     ((u_char)(c) >= 0xc0 && (u_char)(c) <= 0xff) || \
+		     (u_char)(c) == 0xa8 || (u_char)(c) == 0xb8)
+#endif
+
 #define isalnum(c) (char_atribs[(u_char)(c)]&(DIGIT|ALPHA))
 #define isprint(c) (char_atribs[(u_char)(c)]&PRINT)
 #define isascii(c) ((u_char)(c) >= 0 && (u_char)(c) <= 0x7f)
diff -urN Unreal3.2/include/config.h patched/Unreal3.2/include/config.h
--- Unreal3.2/include/config.h	Sun Mar 13 21:02:43 2005
+++ patched/Unreal3.2/include/config.h	Tue Dec 13 19:09:11 2005
@@ -448,6 +448,15 @@
  */
 #define JOINTHROTTLE
 
+#define RUSSIAN_IRCD
+#define RUS_2_LAT
+#undef  USE_SPACES_IN_NICKS
+/* Nickname can include both english and russian letters?
+ * If not - #define ONLYONELANG
+ * else - #undef ONLYONELANG
+*/
+#undef  ONLYONELANG
+
 /* ------------------------- END CONFIGURATION SECTION -------------------- */
 #define MOTD MPATH
 #define RULES RPATH
diff -urN Unreal3.2/include/h.h patched/Unreal3.2/include/h.h
--- Unreal3.2/include/h.h	Sun Mar 13 21:02:44 2005
+++ patched/Unreal3.2/include/h.h	Tue Dec 13 19:11:24 2005
@@ -192,6 +192,8 @@
 extern Ban *is_banned(aClient *, aChannel *, int);
 extern int parse_help(aClient *, char *, char *);
 
+extern int g_sim(char);
+
 extern void ircd_log(int, char *, ...) __attribute__((format(printf,2,3)));
 extern aClient *find_client(char *, aClient *);
 extern aClient *find_name(char *, aClient *);
diff -urN Unreal3.2/include/struct.h patched/Unreal3.2/include/struct.h
--- Unreal3.2/include/struct.h	Sun Mar 13 21:02:46 2005
+++ patched/Unreal3.2/include/struct.h	Tue Dec 13 19:19:06 2005
@@ -1636,8 +1636,21 @@
 
 #define	BadPtr(x) (!(x) || (*(x) == '\0'))
 
+#ifndef RUSSIAN_IRCD
 /** Is valid character in nick? [not for external usage, use do_check_nickname instead!] */
 #define isvalid(c)   (char_atribs[(u_char)(c)]&ALLOWN)
+#else
+#ifndef USE_SPACES_IN_NICKS
+#define                isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-' || \
+                       ((u_char)(c) >= 0xc0 && (u_char)(c) <= 0xff) || \
+		       (u_char)(c) == 0xa8 || (u_char)(c) == 0xb8 || \
+		       (u_char)(c) == 0xa0)
+#else
+#define                isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-' || \
+                       ((u_char)(c) >= 0xc0 && (u_char)(c) <= 0xff) || \
+		       (u_char)(c) == 0xa8 || (u_char)(c) == 0xb8)
+#endif
+#endif
 
 /* remote fds are set to -256, else its a local fd (a local fd
  * can get -1 or -2 in case it has been closed). -- Syzop
diff -urN Unreal3.2/src/charsys.c patched/Unreal3.2/src/charsys.c
--- Unreal3.2/src/charsys.c	Sun Mar 13 21:02:52 2005
+++ patched/Unreal3.2/src/charsys.c	Tue Dec 13 19:20:45 2005
@@ -283,14 +283,33 @@
 {
 int len;
 char *ch;
+#ifdef ONLYONELANG
+int g_RU = 0;
+int g_EN = 0;
+#endif
 
-	if ((*nick == '-') || isdigit(*nick))
+#ifndef USE_SPACES_IN_NICKS
+	if (*nick == '-' || isdigit(*nick))	/* first character in [0..9-] */
+#else
+	if (*nick == '-' || isdigit(*nick) || (u_char)*nick == 0xa0)	/* first character in [0..9-_] */
+#endif
 		return 0;
 
-	for (ch=nick,len=0; *ch && len <= NICKLEN; ch++, len++)
+	for (ch=nick,len=0; *ch && len <= NICKLEN; ch++, len++) {
 		if (!isvalid(*ch))
 			return 0; /* reject the full nick */
+#ifdef ONLYONELANG
+		if ((*ch >= 'A' && *ch <='Z') || (*ch >= 'a' && *ch <= 'z')) 
+	            g_EN = 1;
+		else if (!g_sim(*ch))
+	            g_RU = 1;
+#endif
+    }
 	*ch = '\0';
+#ifdef ONLYONELANG
+	if (g_EN && g_RU) 
+           return 0; /* reject, if nick containts both english and russian chars */
+#endif
 	return len;
 }
 
@@ -318,7 +337,11 @@
 MBList *m;
 int firstmbchar = 0;
 
-	if ((*nick == '-') || isdigit(*nick))
+#ifndef USE_SPACES_IN_NICKS
+	if (*nick == '-' || isdigit(*nick))	/* first character in [0..9-] */
+#else
+	if (*nick == '-' || isdigit(*nick) || (u_char)*nick == 0xa0)	/* first character in [0..9-_] */
+#endif
 		return 0;
 
 	for (ch=nick,len=0; *ch && len <= NICKLEN; ch++, len++)
@@ -647,3 +670,11 @@
 		charsys_addmultibyterange(0xaa, 0xfe, 0x80, 0xa0); /* GBK/4 - upper half */
 	}
 }
+
+int g_sim(char gl_c) {
+char *gl_s = "0123456789[]-_{}|`^\0";
+	for(;*gl_s;gl_s++)
+		if (gl_c == *gl_s) return 1;
+	return 0;
+}
+
diff -urN Unreal3.2/src/match.c patched/Unreal3.2/src/match.c
--- Unreal3.2/src/match.c	Sun Mar 13 21:02:54 2005
+++ patched/Unreal3.2/src/match.c	Tue Dec 13 19:21:14 2005
@@ -292,18 +292,43 @@
 	0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
 	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
 	0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+#ifndef RUSSIAN_IRCD
 	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
+#else
+	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xb8, 0xa9,
+#endif
 	0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
 	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
 	0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+#ifndef RUSSIAN_IRCD
 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
 	0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
 	0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+#else
+#ifndef RUS_2_LAT
 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
 	0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
+	0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+#else
+	 'a', 0xe1,  'b', 0xe3, 0xe4,  'e', 0xe6,  '3', 0xe8, 0xe9,
+	 'k', 0xeb,  'm',  'h',  'o', 0xef,
+	 'p',  'c',  't',  'y', 0xf4,  'x', 0xf6, 0xf7, 0xf8, 0xf9,
+	0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+#endif
+#endif
+#ifndef RUS_2_LAT
+	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+	0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
+	0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+#else
+	 'a', 0xe1,  'b', 0xe3, 0xe4,  'e', 0xe6,  '3', 0xe8, 0xe9,
+	 'k', 0xeb,  'm',  'h',  'o', 0xef,
+	 'p',  'c',  't',  'y', 0xf4,  'x', 0xf6, 0xf7, 0xf8, 0xf9,
 	0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+#endif
 };
 
 u_char touppertab[] = {
@@ -329,16 +354,41 @@
 	0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
 	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
 	0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+#ifndef RUSSIAN_IRCD
 	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
+#else
+	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xa8, 0xb9,
+#endif
 	0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+#ifndef RUS_2_LAT
 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
 	0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
 	0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+#else
+	 'A', 0xc1,  'B', 0xc3, 0xc4,  'E', 0xc6, '3', 0xc8, 0xc9,
+	 'K', 0xcb,  'M',  'H',  'O', 0xcf,
+	 'P',  'C',  'T',  'Y', 0xd4,  'X', 0xd6, 0xd7, 0xd8, 0xd9,
+	0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+#endif
+#ifndef RUSSIAN_IRCD
 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
 	0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
 	0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+#else
+#ifdef RUS_2_LAT
+	 'A', 0xc1,  'B', 0xc3, 0xc4,  'E', 0xc6,  '3', 0xc8, 0xc9,
+	 'K', 0xcb,  'M',  'H',  'O', 0xcf,
+	 'P',  'C',  'T',  'Y', 0xd4,  'X', 0xd6, 0xd7, 0xd8, 0xd9,
+	0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+#else
+	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
+	0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
+	0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf
+#endif
+#endif
 };
 
 #endif
@@ -404,10 +454,20 @@
 /* 90-9f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 /* a0-af */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 /* b0-bf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+#ifndef RUSSIAN_IRCD
 /* c0-cf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 /* d0-df */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 /* e0-ef */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 /* f0-ff */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+#else
+#define RU (PRINT | ALPHA | ALLOW)
+/* c0-cf */ RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU,
+/* d0-df */ RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU,
+/* e0-ef */ RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU,
+/* f0-ff */ RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU, RU
+#undef RU
+#endif
 };
 
 /* Old match() */
