@@ -71,17 +71,9 @@ public static class PythonRegex {
 
         #region Public API Surface
 
-        public static RE_Pattern compile(CodeContext/*!*/ context, object pattern) {
+        public static RE_Pattern compile(CodeContext/*!*/ context, object pattern, [DefaultParameterValue(0)]int flags) {
             try {
-                return GetPattern(context, pattern, 0, true);
-            } catch (ArgumentException e) {
-                throw PythonExceptions.CreateThrowable(error(context), e.Message);
-            }
-        }
-
-        public static RE_Pattern compile(CodeContext/*!*/ context, object pattern, object flags) {
-            try {
-                return GetPattern(context, pattern, PythonContext.GetContext(context).ConvertToInt32(flags), true);
+                return GetPattern(context, pattern, flags, true);
             } catch (ArgumentException e) {
                 throw PythonExceptions.CreateThrowable(error(context), e.Message);
             }
@@ -119,23 +111,15 @@ public static class PythonRegex {
             return text;
         }
 
-        public static List findall(CodeContext/*!*/ context, object pattern, string @string) {
-            return findall(context, pattern, @string, 0);
-        }
-
-        public static List findall(CodeContext/*!*/ context, object pattern, string @string, int flags) {
+        public static List findall(CodeContext/*!*/ context, object pattern, string @string, [DefaultParameterValue(0)]int flags) {
             RE_Pattern pat = GetPattern(context, ValidatePattern(pattern), flags);
             ValidateString(@string, "string");
 
             MatchCollection mc = pat.FindAllWorker(context, @string, 0, @string.Length);
             return FixFindAllMatch(pat, mc, null);
         }
 
-        public static List findall(CodeContext/*!*/ context, object pattern, IList<byte> @string) {
-            return findall(context, pattern, @string, 0);
-        }
-
-        public static List findall(CodeContext/*!*/ context, object pattern, IList<byte> @string, int flags) {
+        public static List findall(CodeContext context, object pattern, IList<byte> @string, [DefaultParameterValue(0)]int flags) {
             RE_Pattern pat = GetPattern(context, ValidatePattern (pattern), flags);
             ValidateString (@string, "string");
 
@@ -190,58 +174,32 @@ public static class PythonRegex {
             return List.FromArrayNoCopy(matches);
         }
 
-        public static object finditer(CodeContext/*!*/ context, object pattern, object @string) {
-            return finditer(context, pattern, @string, 0);
-        }
-
-        public static object finditer(CodeContext/*!*/ context, object pattern, object @string, int flags) {
+        public static object finditer(CodeContext/*!*/ context, object pattern, object @string, [DefaultParameterValue(0)]int flags) {
             RE_Pattern pat = GetPattern(context, ValidatePattern(pattern), flags);
 
             string str = ValidateString(@string, "string");
             return MatchIterator(pat.FindAllWorker(context, str, 0, str.Length), pat, str);
         }
 
-        public static RE_Match match(CodeContext/*!*/ context, object pattern, object @string) {
-            return match(context, pattern, @string, 0);
-        }
-
-        public static RE_Match match(CodeContext/*!*/ context, object pattern, object @string, int flags) {
+        public static RE_Match match(CodeContext/*!*/ context, object pattern, object @string, [DefaultParameterValue(0)]int flags) {
             return GetPattern(context, ValidatePattern(pattern), flags).match(ValidateString(@string, "string"));
         }
 
-        public static RE_Match search(CodeContext/*!*/ context, object pattern, object @string) {
-            return search(context, pattern, @string, 0);
-        }
-
-        public static RE_Match search(CodeContext/*!*/ context, object pattern, object @string, int flags) {
+        public static RE_Match search(CodeContext/*!*/ context, object pattern, object @string, [DefaultParameterValue(0)]int flags) {
             return GetPattern(context, ValidatePattern(pattern), flags).search(ValidateString(@string, "string"));
         }
 
         [return: SequenceTypeInfo(typeof(string))]
-        public static List split(CodeContext/*!*/ context, object pattern, object @string) {
-            return split(context, ValidatePattern(pattern), ValidateString(@string, "string"), 0);
-        }
-
-        [return: SequenceTypeInfo(typeof(string))]
-        public static List split(CodeContext/*!*/ context, object pattern, object @string, int maxsplit) {
-            return GetPattern(context, ValidatePattern(pattern), 0).split(ValidateString(@string, "string"),
-                maxsplit);
-        }
-
-        public static string sub(CodeContext/*!*/ context, object pattern, object repl, object @string) {
-            return sub(context, pattern, repl, @string, Int32.MaxValue);
-        }
-
-        public static string sub(CodeContext/*!*/ context, object pattern, object repl, object @string, int count) {
-            return GetPattern(context, ValidatePattern(pattern), 0).sub(context, repl, ValidateString(@string, "string"), count);
+        public static List split(CodeContext/*!*/ context, object pattern, object @string, [DefaultParameterValue(0)]int maxsplit, [DefaultParameterValue(0)]int flags) {
+            return GetPattern(context, ValidatePattern(pattern), flags).split(ValidateString(@string, "string"), maxsplit);
         }
 
-        public static object subn(CodeContext/*!*/ context, object pattern, object repl, object @string) {
-            return subn(context, pattern, repl, @string, Int32.MaxValue);
+        public static string sub(CodeContext/*!*/ context, object pattern, object repl, object @string, [DefaultParameterValue(0)]int count, [DefaultParameterValue(0)]int flags) {
+            return GetPattern(context, ValidatePattern(pattern), flags).sub(context, repl, ValidateString(@string, "string"), count);
         }
 
-        public static object subn(CodeContext/*!*/ context, object pattern, object repl, object @string, int count) {
-            return GetPattern(context, ValidatePattern(pattern), 0).subn(context, repl, ValidateString(@string, "string"), count);
+        public static object subn(CodeContext/*!*/ context, object pattern, object repl, object @string, [DefaultParameterValue(0)]int count, [DefaultParameterValue(0)]int flags) {
+            return GetPattern(context, ValidatePattern(pattern), flags).subn(context, repl, ValidateString(@string, "string"), count);
 
         }
 
@@ -383,12 +341,7 @@ internal RE_Pattern(CodeContext/*!*/ context, object pattern)
             }
 
             [return: SequenceTypeInfo(typeof(string))]
-            public List split(string @string) {
-                return split(@string, 0);
-            }
-
-            [return: SequenceTypeInfo(typeof(string))]
-            public List split(object @string, int maxsplit) {
+            public List split(object @string, [DefaultParameterValue(0)]int maxsplit) {
                 List result = new List();
                 // fast path for negative maxSplit ( == "make no splits")
                 if (maxsplit < 0) {
@@ -423,11 +376,7 @@ internal RE_Pattern(CodeContext/*!*/ context, object pattern)
                 return result;
             }
 
-            public string sub(CodeContext/*!*/ context, object repl, object @string) {
-                return sub(context, repl, ValidateString(@string, "string"), Int32.MaxValue);
-            }
-
-            public string sub(CodeContext/*!*/ context, object repl, object @string, int count) {
+            public string sub(CodeContext/*!*/ context, object repl, object @string, [DefaultParameterValue(0)]int count) {
                 if (repl == null) throw PythonOps.TypeError("NoneType is not valid repl");
                 //  if 'count' is omitted or 0, all occurrences are replaced
                 if (count == 0) count = Int32.MaxValue;
@@ -460,11 +409,7 @@ internal RE_Pattern(CodeContext/*!*/ context, object pattern)
                     count);
             }
 
-            public object subn(CodeContext/*!*/ context, object repl, string @string) {
-                return subn(context, repl, @string, Int32.MaxValue);
-            }
-
-            public object subn(CodeContext/*!*/ context, object repl, object @string, int count) {
+            public object subn(CodeContext/*!*/ context, object repl, object @string, [DefaultParameterValue(0)]int count) {
                 if (repl == null) throw PythonOps.TypeError("NoneType is not valid repl");
                 //  if 'count' is omitted or 0, all occurrences are replaced
                 if (count == 0) count = Int32.MaxValue;