diff --git a/modules/media_internet/media_internet.module b/modules/media_internet/media_internet.module
index 2905ec3..25744ac 100644
--- a/modules/media_internet/media_internet.module
+++ b/modules/media_internet/media_internet.module
@@ -51,7 +51,18 @@ function media_internet_permission() {
  *
  * @todo Convert the form arguments to just one array of options/parameters.
  */
-function media_internet_add($form, &$form_state = array(), $types = NULL) {
+function media_internet_add($form, &$form_state = array(), $options = array()) {
+  $step = (isset($form_state['step']) && in_array($form_state['step'], array(1, 2))) ? $form_state['step'] : 1;
+  $form['#step'] = $step;
+  switch ($step) {
+    case 1:
+      return media_internet_add_upload_step_upload($form, $form_state, $options);
+    case 2:
+      return media_internet_add_upload_step_fields($form, $form_state, $options);
+  }
+}
+
+function media_internet_add_upload_step_upload($form, &$form_state, array $options = array()) {
   $providers = array();
   foreach (media_internet_get_providers() as $key => $provider) {
     if (empty($provider['hidden']) || $provider['hidden'] != TRUE) {
@@ -92,79 +103,34 @@ function media_internet_add($form, &$form_state = array(), $types = NULL) {
   }
 
   $form['#validators'] = array();
-  if ($types) {
-    $form['#validators']['media_file_validate_types'] = array($types);
+  if ($options) {
+    $form['#validators']['media_file_validate_types'] = array($options);
   }
 
   $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
+  $form['actions']['next'] = array(
     '#type' => 'submit',
-    '#value' => t('Submit'),
+    '#value' => t('Next'),
   );
+
   return $form;
 }
 
-/**
- * Allow stream wrappers to have their chance at validation.
- *
- * Any module that implements hook_media_parse will have an
- * opportunity to validate this.
- *
- * @see media_parse_to_uri()
- */
-function media_internet_add_validate($form, &$form_state) {
-  // Supporting providers can now claim this input.  It might be a URL, but it
-  // might be an embed code as well.
-  $embed_code = $form_state['values']['embed_code'];
-
-  try {
-    $provider = media_internet_get_provider($embed_code);
-    $provider->validate();
-  } catch (MediaInternetNoHandlerException $e) {
-    form_set_error('embed_code', $e->getMessage());
-    return;
-  } catch (MediaInternetValidationException $e) {
-    form_set_error('embed_code', $e->getMessage());
-    return;
-  }
+function media_internet_add_upload_step_fields($form, &$form_state, array $options = array()) {
+  // Add fields.
+  field_attach_form('file', $form_state['storage']['file'], $form, $form_state);
 
-  $validators = $form['#validators'];
-  $file = $provider->getFileObject();
-  if ($validators) {
-    try {
-      $file = $provider->getFileObject();
-    } catch (Exception $e) {
-      form_set_error('embed_code', $e->getMessage());
-      return;
-    }
-
-    // Check for errors. @see media_add_upload_validate calls file_save_upload().
-    // this code is ripped from file_save_upload because we just want the validation part.
-    // Call the validation functions specified by this function's caller.
-    $errors = file_validate($file, $validators);
-
-    if (!empty($errors)) {
-      $message = t('%url could not be added.', array('%url' => $embed_code));
-      if (count($errors) > 1) {
-        $message .= theme('item_list', array('items' => $errors));
-      }
-      else {
-        $message .= ' ' . array_pop($errors);
-      }
-      form_set_error('embed_code', $message);
-      return FALSE;
-    }
-  }
-  // @TODO: Validate that if we have no $uri that this is a valid file to
-  // save. For instance, we may only be interested in images, and it would
-  // be helpful to let the user know they passed the HTML page containing
-  // the image accidentally. That would also save us from saving the file
-  // in the submit step.
-
-  // This is kinda a hack of the same.
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['previous'] = array(
+    '#type' => 'submit',
+    '#value' => t('Previous'),
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
 
-  // This should use the file_validate routines that the upload form users.
-  // We need to fix the media_parse_to_file routine to allow for a validation.
+  return $form;
 }
 
 /**
@@ -176,39 +142,82 @@ function media_internet_add_validate($form, &$form_state) {
  * @see media_parse_to_file()
  */
 function media_internet_add_submit($form, &$form_state) {
-  $embed_code = $form_state['values']['embed_code'];
-  try {
-    // Save the remote file
-    $provider = media_internet_get_provider($embed_code);
-    // Providers decide if they need to save locally or somewhere else.
-    // This method returns a file object
-    $file = $provider->save();
-  }
-  catch (Exception $e) {
-    form_set_error('embed_code', $e->getMessage());
-    return;
-  }
+  $form_state['storage'] = isset($form_state['storage']) ? $form_state['storage'] : array();
+  $form_state['storage'] = array_merge($form_state['storage'], $form_state['values']);
+
+  // This var is set to TRUE when we are ready to save the file.
+  $save = FALSE;
+  $trigger = $form_state['triggering_element']['#id'];
+
+  // We have the file, check if we can skip step 2.
+  if (($form['#step'] == 1 && $trigger == 'edit-next')) {
+    $provider = media_internet_get_provider($form_state['storage']['embed_code']);
+    $form_state['storage']['file'] = $provider->getFileObject();
 
-  if (!$file->fid) {
-    form_set_error('embed_code', t('The file %file could not be saved. An unknown error has occurred.', array('%file' => $embed_code)));
-    return;
+    $split_mime = explode('/', $form_state['storage']['file']->filemime);
+    $form_state['storage']['file']->type = $split_mime[0];
+
+    if (!field_info_instances('file', $form_state['storage']['file']->type)) {
+      // This filetype doesn't have fields, save the file.
+      $save = TRUE;
+    }
   }
-  else {
-    $form_state['file'] = $file;
+
+  switch ($trigger) {
+    case 'edit-next':
+      $form_state['step'] = $form['#step'] + 1;
+      break;
+    case 'edit-previous':
+      $form_state['step'] = $form['#step'] - 1;
+      break;
+    case 'edit-submit':
+      $save = TRUE;
+      break;
   }
 
-  // Redirect to the file edit page after submission.
-  if (file_entity_access('update', $file)) {
-    $destination = array('destination' => 'admin/content/file');
+  if ($save) {
+    try {
+      // Save the remote file
+      $provider = media_internet_get_provider($form_state['storage']['embed_code']);
+      // Providers decide if they need to save locally or somewhere else.
+      // This method returns a file object
+      $file = $provider->save();
+
+    }
+    catch (Exception $e) {
+      form_set_error('embed_code', $e->getMessage());
+      return;
+    }
+
+    if (!$file->fid) {
+      form_set_error('embed_code', t('The file %file could not be saved. An unknown error has occurred.', array('%file' => $embed_code)));
+      return;
+    }
+    else {
+      entity_form_submit_build_entity('file', $file, $form, $form_state);
+      file_save($file);
+      $form_state['file'] = $file;
+    }
+
+    // Figure out destination.
     if (isset($_GET['destination'])) {
       $destination = drupal_get_destination();
       unset($_GET['destination']);
     }
-    $form_state['redirect'] = array('file/' . $file->fid . '/edit', array('query' => $destination));
+    elseif (user_access('administer files')) {
+      $destination = array('destination' => 'admin/content/file');
+    }
+    else {
+      $destination = array('destination' => 'file/' . $file->fid);
+    }
+    $form_state['redirect'] = $destination['destination'];
   }
   else {
-    $form_state['redirect'] = 'admin/content/file';
+    $form_state['rebuild'] = TRUE;
   }
+
+  // Clear the page and block caches.
+  cache_clear_all();
 }
 
 /**
