diff --git a/clientside_validation.admin.inc b/clientside_validation.admin.inc
index 43ad2f3..b979e05 100644
--- a/clientside_validation.admin.inc
+++ b/clientside_validation.admin.inc
@@ -328,6 +328,56 @@ function clientside_validation_admin_settings() {
     '#title' => t("Enter form IDs below"),
     '#description' => t('You can specify form IDs (one per line) of forms that should or should not be validated.'),
   );
+  if (module_exists('xregexp_api')) {
+    $lib = xregexp_api_libraries_detect('xregexp');
+    if ($lib && $lib['installed']) {
+      //XRegExp settings
+      $form['clientside_validation_xregxp'] = array(
+        '#type' => 'fieldset',
+        '#collapsible' => TRUE,
+        '#collapsed' => FALSE,
+        '#title' => t('XRegExp for Pattern matching'),
+        '#description' => t("Javascript doesn't support regular expressions for
+          pattern matching the way PHP does. With the XRegExp library most PHP
+          expressions(pregex) become also available in Javascript. So you might
+          want to use that instead of AJAX calls."),
+      );
+
+      $form['clientside_validation_xregxp']['clientside_validation_usexregxp'] = array(
+        '#prefix' => '<br />',
+        '#title' => t('Use XRegExp'),
+        '#description' => t('Check to use XRegExp for PCRE.'),
+        '#type' => 'checkbox',
+        '#default_value' => variable_get('clientside_validation_usexregxp', 0),
+      );
+      $options = array('' => t('default'));
+      foreach ($lib['variants'] as $name => $variant) {
+        if (!isset($variant['error']) || !$variant['error']) {
+          $options[$name] = $name;
+        }
+      }
+      $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant'] = array(
+        '#title' => t('XRegExp variant'),
+        '#description' => t('Choose which variant of the library you want to use.'),
+        '#type' => 'select',
+        '#options' => $options,
+        '#default_value' => variable_get('clientside_validation_xregxp_variant', ''),
+      );
+      if (version_compare($lib['version'], '2', '>=')) {
+        $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant']['#description'] .= '<br />' .
+        t('!warning: You are using version 2.x or higher of the XRegExp library.
+          For best compatibility (including some !fapi rules) you should enable
+          the backcompat.js plugin on the !settingspage',
+          array(
+            '!warning' => '<strong>Warning</strong>',
+            '!fapi' => l(t('FAPI Validation'), 'http://drupal.org/project/fapi_validation'),
+            '!settingspage' => l(t('XRegExp API Settings page'), 'admin/config/system/xregexp'),
+          )
+        );
+      }
+    }
+  }
+
 
   return system_settings_form($form);
-}
\ No newline at end of file
+}
diff --git a/clientside_validation.js b/clientside_validation.js
index c04c95d..6fb55ff 100644
--- a/clientside_validation.js
+++ b/clientside_validation.js
@@ -494,15 +494,16 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){
     }
     return true;
   });
-
-  jQuery.validator.addMethod("regexMatchPCRE", function(value, element, param) {
+  
+  // Default regular expression support
+  var ajaxPCREfn = function(value, element, param) {
     var result = false;
     jQuery.ajax({
       'url': Drupal.settings.basePath + 'clientside_validation/ajax',
       'type': "POST",
       'data': {
         'value': value,
-        'param': JSON.stringify(param)
+        'param': param
       },
       'dataType': 'json',
       'async': false,
@@ -510,15 +511,62 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){
         result = res;
       }
     });
-    if (result['result'] === false) {
-      if (result['message'].length) {
+    if (result.result === false) {
+      if (result.message.length) {
         jQuery.extend(jQuery.validator.messages, {
-          "regexMatchPCRE": result['message']
+          "regexMatchPCRE": result.message
         });
       }
     }
-    return result['result'];
-  }, jQuery.format('The value does not match the expected format.'));
+    return result.result;
+  };
+  
+  // Regular expression support using XRegExp
+  var xregexPCREfn = function(value, element, param) {
+    if (window.XRegExp && XRegExp.version ) {
+      try {
+        var result = true;
+        for (var i = 0; i < param.expressions.length; i++) {
+          var reg = param.expressions[i];
+          var delim = reg.lastIndexOf(reg[0]);
+          // Only allow supported modifiers
+          var modraw = reg.substr(delim + 1) || '';
+          var mod = '';
+          if (mod !== '') {
+            for (var l = 0; l < 6; l++) {
+              if (modraw.indexOf('gimnsx'[l]) !== -1) {
+                mod += 'gimnsx'[l];
+              }
+            }
+          }
+          reg = reg.substring(1, delim);
+          if (!(new XRegExp(reg, mod).test(value))) {
+            result = false;
+            if (param.messages[i].length) {
+              jQuery.extend(jQuery.validator.messages, {
+                "regexMatchPCRE": param.messages[i]
+              });
+            }
+          }
+        }
+        return result;
+      }
+      catch (e) {
+        return ajaxPCREfn(value, element, param);
+      }
+    }
+    else {
+      return ajaxPCREfn(value, element, param);
+    }
+  };
+
+  // Decide which one to use
+  if (self.data.general.usexregxp) {
+    jQuery.validator.addMethod("regexMatchPCRE", xregexPCREfn, jQuery.format('The value does not match the expected format.'));
+  }
+  else {
+    jQuery.validator.addMethod("regexMatchPCRE", ajaxPCREfn, jQuery.format('The value does not match the expected format.'));
+  }  
 
   // Unique values
   jQuery.validator.addMethod("notEqualTo", function(value, element, param) {
diff --git a/clientside_validation.module b/clientside_validation.module
index adab367..d8e2f9a 100644
--- a/clientside_validation.module
+++ b/clientside_validation.module
@@ -301,6 +301,7 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) {
     $form_settings_added[] = str_replace('-', '_', $form_id);
   }
 
+
   if (!$general_settings_added) {
     $settings['clientsideValidation']['general'] = array(
       "errorClass" => "error",
@@ -314,10 +315,36 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) {
       "validateOnSubmit" => variable_get('clientside_validation_validate_onsubmit', 1),
       "errorElement" => variable_get('clientside_validation_error_element', 'label'),
     );
+    // add xregxp if choosen and found.
+    if (variable_get('clientside_validation_usexregxp', 0) != 0 && module_exists('xregexp_api')) {
+      $settings['clientsideValidation']['general']['usexregxp'] = clientside_validation_add_xregexp();
+    }
+    else {
+      $settings['clientsideValidation']['general']['usexregxp'] = 0;
+    }
+
     $general_settings_added = TRUE;
   }
+
+}
+
+/*
+ * adds xregexp and optional unicode js lib
+ */
+function clientside_validation_add_xregexp() {
+  $variant = variable_get('clientside_validation_xregxp_variant', '');
+  $lib = FALSE;
+  if (empty($variant)) {
+    $lib = xregexp_api_libraries_load('xregexp');
+  }
+  else {
+    $lib = xregexp_api_libraries_load('xregexp', $variant);
+  }
+  return ($lib && (!isset($lib['error']) || !$lib['error'])) ? 1 : 0;
 }
 
+
+
 /**
  * Set validation rule for required fields.
  */
