diff -ruN multistep_original/multistep.install multistep/multistep.install
--- multistep_original/multistep.install	2011-06-09 12:34:41.000000000 +0200
+++ multistep/multistep.install	2012-05-10 16:25:27.000000000 +0200
@@ -12,7 +12,7 @@
   // Set multistep to a higher weight so that it allows extra fields to load first.
   db_update('system')
     ->fields(array(
-      'weight' => 10,
+      'weight' => 50,
     ))
     ->condition('name', 'multistep')
     ->execute();
@@ -176,3 +176,15 @@
   db_drop_index('multistep', 'multistep_nid_step');
   db_change_field('multistep', 'step', 'step', $spec, $keys_new);
 }
+
+/**
+ * Increase module weight to account for modules with a higher weight.
+ */
+function multistep_update_7102() {
+  db_update('system')
+    ->fields(array(
+      'weight' => 50,
+    ))
+    ->condition('name', 'multistep')
+    ->execute();
+}
diff -ruN multistep_original/multistep.module multistep/multistep.module
--- multistep_original/multistep.module	2011-06-09 12:34:41.000000000 +0200
+++ multistep/multistep.module	2012-05-10 16:25:28.000000000 +0200
@@ -386,6 +386,89 @@
 }
 
 /**
+ * Recursively gathers current form childrens.
+ *
+ * @param $element
+ *   The form element to search for childrens which are not excluded.
+ *
+ * @param $excluded_children
+ *   An array of excluded children.
+ *
+ * @return
+ *   Array of form children names.
+ */
+function _multistep_gather_current_children($element, $excluded_children) {
+  $current_children = array();
+  foreach (element_children($element) as $key) {
+    // If the element has #tree set to TRUE or has no children, add it to the
+    // current children. Otherwise, fetch the children of that element.
+    $children = count(element_children($element[$key])) > 0 && (!isset($element[$key]['#type']) || !in_array($element[$key]['#type'], array('radios', 'checkboxes')));
+    if (!empty($element[$key]['#tree']) || !$children) {
+      if (!isset($excluded_children[$key])) {
+        $current_children[] = array($key);
+      }
+    }
+    else {
+      $current_children = array_merge($current_children, _multistep_gather_current_children($element[$key], $excluded_children));
+    }
+  }
+  return $current_children;
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function multistep_form_alter(&$form, &$form_state) {
+  // Check if this is a multistep enabled form.
+  if (isset($form['#multistep'])) {
+    $excluded_children = _multistep_gather_excluded_fieldgroup_children($form, $form['#multistep']['current']);
+    $current_children = _multistep_gather_current_children($form, $excluded_children);
+
+    // Apply limit validations to all submit fields.
+    foreach (element_children($form['actions']) as $key) {
+      if (isset($form['actions'][$key]['#type']) && $form['actions'][$key]['#type'] == 'submit') {
+        $form['actions'][$key]['#limit_validation_errors'] = $current_children;
+      }
+    }
+  }
+}
+
+/**
+ * Recursively gets all childrens of fieldgroups which are not from the current step.
+ */
+function _multistep_gather_excluded_fieldgroup_children($form, $exclude_group) {
+  $form_elements = array();
+  foreach ($form['#groups'] as $group) {
+    if ($group->format_type == 'multistep' && $group->group_name != $exclude_group) {
+      foreach ($group->children as $child) {
+        if (in_array($child, array_keys($form['#groups']))) {
+          $form_elements = array_merge($form_elements, _multistep_gather_child_fieldgroup_children($form, $child));
+        } else {
+          $form_elements[$child] = $child;
+        }
+      }
+    }
+  }
+  return $form_elements;
+}
+
+ /**
+  * Recursively get all form elements of a given group.
+  */
+function _multistep_gather_child_fieldgroup_children($form, $group) {
+  $children = $form['#groups'][$group]->children;
+  $form_elements = array();
+  foreach ($children as $child) {
+    if (in_array($child, array_keys($form['#groups']))) {
+      $form_elements = array_merge($form_elements, _multistep_gather_fieldgroup_children($form, $child));
+    } else {
+      $form_elements[$child] = $child;
+    }
+  }
+  return $form_elements;
+}
+
+/**
  * Implements hook_node_validate().
  * Set proper revisioning and publishing.
  */
@@ -807,3 +890,26 @@
     'api' => 2,
   );
 }
+
+
+/**
+ * recursively get all form elements of a given group
+ */
+function _multistep_gather_fieldgroup_children($form, $group) {
+  $children = $form['#groups'][$group]->children;
+  foreach ($children as $child) {
+    if (in_array($child, array_keys($form['#groups']))) {
+      $form_elements = array_merge($form_elements, _multistep_gather_fieldgroup_children($form, $child));
+    } else {
+      $form_elements[] = array($child);
+    }
+  }
+  return $form_elements;
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function multistep_node_presave($node) {
+  if (empty($node->path['alias'])) $node->path['alias'] = '';
+}
