diff --git a/multistep.install b/multistep.install
index ae18a04..f4b9f44 100644
--- a/multistep.install
+++ b/multistep.install
@@ -12,7 +12,7 @@ function multistep_install() {
   // 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();
@@ -185,3 +185,15 @@ function multistep_update_7101(&$sandbox) {
   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 --git a/multistep.module b/multistep.module
index 70bdcb5..7eafbcd 100644
--- a/multistep.module
+++ b/multistep.module
@@ -335,6 +335,19 @@ function multistep_form_alter(&$form, &$form_state, $form_id) {
     // Carry out what used to be multistep_field_attach_form
     multistep_field_attach_form_callback($entity_type, $entity, $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'] = $key == 'previous' ? array() : $current_children;
+      }
+    }
+  }
 }
 
 /**
@@ -377,7 +390,7 @@ function multistep_field_attach_form_callback($entity_type, $entity, &$form, &$f
     $form['actions']['previous'] = array(
       '#type' => 'submit',
       '#value' => variable_get('multistep_button_prev', t('< Previous')),
-      '#submit' => array($submit_fn, 'multistep_submit'),
+      '#submit' => array('multistep_submit'),
       '#weight' => -999,
       '#access' => variable_get('multistep_button_prev', TRUE),
     );
@@ -414,6 +427,99 @@ function multistep_field_attach_form_callback($entity_type, $entity, &$form, &$f
 }
 
 /**
+ * Recursively gathers current form childrens.
+ *
+ * @param array $element
+ *   The form element to search for childrens which are not excluded.
+ * @param array $excluded_children
+ *   An array of excluded children.
+ *
+ * @return array
+ *   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;
+}
+
+/**
+ * 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) {
+  $form_elements = array();
+  if (isset($form['#groups'][$group]->children) && is_array($form['#groups'][$group]->children)) {
+    $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[$child] = $child;
+      }
+    }
+  }
+  return $form_elements;
+}
+
+/**
+ * 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_entity_presave().
+ */
+function multistep_entity_presave($entity, $type) {
+  if (empty($entity->path['alias'])) {
+    $entity->path['alias'] = '';
+  }
+}
+
+/**
  * Implements hook_node_validate().
  * Set proper revisioning and publishing.
  */
