diff --git a/clientside_validation.js b/clientside_validation.js
index 3da3c81..97dafe9 100644
--- a/clientside_validation.js
+++ b/clientside_validation.js
@@ -15,6 +15,7 @@
         if (update) {
           Drupal.myClientsideValidation.data = Drupal.settings.clientsideValidation;
           Drupal.myClientsideValidation.forms = Drupal.myClientsideValidation.data['forms'];
+          Drupal.myClientsideValidation.groups = Drupal.myClientsideValidation.data.groups;
           Drupal.myClientsideValidation.bindForms();
         }
       }
@@ -27,7 +28,7 @@
     this.data = Drupal.settings.clientsideValidation;
     this.forms = this.data['forms'];
     this.validators = {};
-    this.groups = {};
+    this.groups = this.data['groups'];
 
     //disable class and attribute rules
     $.validator.classRules = function() {
@@ -62,7 +63,6 @@
 
     jQuery.each (self.forms, function(f) {
       var errorel = self.prefix + f + '-errors';
-      self.groups[f] = {};
       // Remove any existing validation stuff
       if (self.validators[f]) {
         // Doesn't work :: $('#' + f).rules('remove');
@@ -717,6 +717,35 @@
       return true;
     });
 
+    jQuery.validator.addMethod('groupsmin', function(value, element, param){
+      type = $(element).attr('type');
+      $elements = $(param[0] + ' :input[type="' + type + '"]').not(':input[value=""]');
+      ret = $elements.length >= param[1];
+      if (ret) {
+        $elements.removeClass('error');
+      }
+      return ret;
+    }, jQuery.format('message'));
+
+    jQuery.validator.addMethod('groupsmax', function(value, element, param){
+      type = $(element).attr('type');
+      $elements = $(param[0] + ' :input[type="' + type + '"]').not(':input[value=""]');
+      ret = param[1] >= $elements.length;
+      if (ret) {
+        $elements.removeClass('error');
+      }
+      return ret;
+    }, jQuery.format('message'));
+
+    jQuery.validator.addMethod('groupsrange', function(value, element, param){
+      type = $(element).attr('type');
+      $elements = $(param[0] + ' :input[type="' + type + '"]').not(':input[value=""]');
+      ret = ($elements.length >= param[1] && param[2] >= $elements.length);
+      if (ret) {
+        $elements.removeClass('error');
+      }
+      return ret;
+    }, jQuery.format('message'));
 
     // EAN code
     jQuery.validator.addMethod("validEAN", function(value, element, param) {
diff --git a/clientside_validation.module b/clientside_validation.module
index bb3bc7e..5571cf7 100644
--- a/clientside_validation.module
+++ b/clientside_validation.module
@@ -110,16 +110,10 @@ function clientside_validation_form_alter(&$form, &$form_state, $form_id) {
     if (isset($form['actions']['delete'])) {
       $form['actions']['delete']['#attributes']['class'][] = 'cancel';
     }
-    switch ($form['#id']) {
-      case 'node-form':
-      case 'webform-component-edit-form':
-        $form['#after_build'][] = 'clientside_validation_form_after_build';
-        break;
-      default:
-        $form['#after_build'][] = 'clientside_validation_form_after_build';
-        break;
-    }
+    $form['#after_build'][] = 'clientside_validation_form_after_build';
   }
+  $id = isset($form_state['triggering_element']) ? str_replace('_', '-', $form_id) : $form['#id'];
+  $form['#clientside_validation_id'] = $id;
 }
 
 /**
@@ -130,7 +124,7 @@ function clientside_validation_webform_after_build(&$form, &$form_state) {
   drupal_alter("clientside_validation_webform", $form, $form_state, $js_rules);
   if (!empty($js_rules)) {
     $settings = array();
-    _clientside_validation_add_general_settings($settings, $form['#id']);
+    _clientside_validation_add_general_settings($settings, $form['#clientside_validation_id']);
     _clientside_validation_add_special_rules($js_rules, $settings, $form);
     
     
@@ -148,9 +142,16 @@ function clientside_validation_webform_after_build(&$form, &$form_state) {
 }
 
 function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form) {
+  if (isset($js_rules['_groups'])) {
+    $settings['clientsideValidation']['groups'][$form['#clientside_validation_id']] = $js_rules['_groups'];
+    unset($js_rules['_groups']);
+  }
+  else {
+    $settings['clientsideValidation']['groups'][$form['#clientside_validation_id']] = array();
+  }
   foreach ($js_rules as $key => $rule) {
     if (isset($rule['checkboxgroupminmax'])) {
-      $settings['clientsideValidation']['forms'][$form['#id']]['checkboxrules'][$key] = array(
+      $settings['clientsideValidation']['forms'][$form['#clientside_validation_id']]['checkboxrules'][$key] = array(
           'checkboxgroupminmax' => $rule['checkboxgroupminmax'],
           'messages' => array('checkboxgroupminmax' => $rule['messages']['checkboxgroupminmax'])
       );
@@ -161,7 +162,7 @@ function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form)
       }
     }
     if (isset($rule['daterange'])) {
-      $settings['clientsideValidation']['forms'][$form['#id']]['daterangerules'][$key] = array(
+      $settings['clientsideValidation']['forms'][$form['#clientside_validation_id']]['daterangerules'][$key] = array(
           'daterange' => $rule['daterange'],
           'messages' => array('daterange' => $rule['messages']['daterange'])
       );
@@ -172,7 +173,7 @@ function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form)
       }
     }
     if (isset($rule['datemin'])) {
-      $settings['clientsideValidation']['forms'][$form['#id']]['dateminrules'][$key] = array(
+      $settings['clientsideValidation']['forms'][$form['#clientside_validation_id']]['dateminrules'][$key] = array(
           'daterange' => $rule['datemin'],
           'messages' => array('datemin' => $rule['messages']['datemin'])
       );
@@ -183,7 +184,7 @@ function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form)
       }
     }
     if (isset($rule['datemax'])) {
-      $settings['clientsideValidation']['forms'][$form['#id']]['datemaxrules'][$key] = array(
+      $settings['clientsideValidation']['forms'][$form['#clientside_validation_id']]['datemaxrules'][$key] = array(
           'daterange' => $rule['datemax'],
           'messages' => array('datemax' => $rule['messages']['datemax'])
       );
@@ -194,7 +195,7 @@ function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form)
       }
     }
     if (!empty($rule)) {
-      $settings['clientsideValidation']['forms'][$form['#id']]['rules'][$key] = $rule;
+      $settings['clientsideValidation']['forms'][$form['#clientside_validation_id']]['rules'][$key] = $rule;
     }
   }
 }
@@ -205,14 +206,14 @@ function _clientside_validation_add_special_rules(&$js_rules, &$settings, $form)
 function clientside_validation_form_after_build(&$form, &$form_state) {
   static $js_rules = array();
   static $form_ids = array();
+  $id = $form['#clientside_validation_id'];
   if (isset($form_ids[$form['#id']])) {
     return $form;
   }
-  
   drupal_alter("clientside_validation_form", $form, $form_state, $js_rules);
   if (!empty($js_rules)) {
     $settings = array();
-    _clientside_validation_add_general_settings($settings, $form['#id']);
+    _clientside_validation_add_general_settings($settings, $id);
     _clientside_validation_add_special_rules($js_rules, $settings, $form);
     if (variable_get('clientside_validation_use_minified', 0) == 0) {
       drupal_add_js(drupal_get_path('module', 'clientside_validation') . '/jquery-validate/jquery.validate.js');
@@ -225,7 +226,7 @@ function clientside_validation_form_after_build(&$form, &$form_state) {
     drupal_add_js($settings, 'setting');
     $form_ids[$form['#id']] = TRUE;
   }
-
+  
   return $form;
 }
 
@@ -924,6 +925,13 @@ function _clientside_validation_set_url($name, $title, &$js_rules) {
   $js_rules[$name]['messages']['url'] = theme('clientside_error', $variables);
 }
 
+function _clientside_validation_set_groupminmax($name, $title, $wrapper_class, &$js_rules, $message = '', $min = 1, $max = 99) {
+
+  $js_rules['_groups'][$wrapper_class] = isset($js_rules['_groups'][$wrapper_class]) ? $js_rules['_groups'][$wrapper_class] . ' ' . $name : $name;
+  $js_rules[$name]['groupsmin'] = array($wrapper_class, $min);
+  $js_rules[$name]['messages']['groupsmin'] = 'testMessage!';
+}
+
 function clientside_validation_drupal_json_encode($var) {
   return str_replace(array('<', '>', '&'), array('\u003c', '\u003e', '\u0026'), json_encode($var));
 }
