diff --git a/includes/media.admin.inc b/includes/media.admin.inc
index 86e3719..c4f06f6 100644
--- a/includes/media.admin.inc
+++ b/includes/media.admin.inc
@@ -11,131 +11,6 @@
 require_once dirname(__FILE__) . '/media.pages.inc';
 
 /**
- *  The administration form for managing media types.
- */
-function media_admin_type_manage_form($form, &$form_state, $media_type) {
-  $form = array();
-  $form['media_type'] = array(
-    '#type' => 'value',
-    '#value' => $media_type->name,
-  );
-
-  // If this Media type is handled by us, then we can put in some default
-  // options. Otherwise, we leave it to the implementing module to form_alter.
-  if ($media_type->type_callback == 'media_is_type') {
-    // Options for match_type.
-    $options = array(
-      'all' => t('All'),
-      'any' => t('Any'),
-      'other' => t('Other'),
-    );
-    if ($media_type->type_callback_args['match_type'] && isset($options[$media_type->type_callback_args['match_type']])) {
-      $default_value = $media_type->type_callback_args['match_type'];
-      $other_default_value = '';
-    }
-    else {
-      $default_value = 'other';
-      $other_default_value = $media_type->type_callback_args['match_type'];
-    }
-    $form['match_type'] = array(
-      '#type' => 'radios',
-      '#title' => t('Match type'),
-      '#options' => $options,
-      '#default_value' => $default_value,
-    );
-    $form['match_type_other'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Other match type value'),
-      '#default_value' => $other_default_value,
-      '#attached' => array(
-        'js' => array(drupal_get_path('module', 'media') . '/js/media.admin.js'),
-      ),
-    );
-
-    // Options for allowed Streams.
-    $options = array('public' => t('Public files'), 'private' => t('Private files'));
-    foreach (file_get_stream_wrappers() as $stream => $wrapper) {
-      $options[$stream] = $wrapper['name'];
-    }
-    unset($options['temporary']);
-    $default_value = array();
-    if (isset($media_type->type_callback_args['streams'])) {
-      foreach ($media_type->type_callback_args['streams'] as $stream) {
-        $default_value[$stream] = $stream;
-      }
-    }
-    $form['streams'] = array(
-      '#type' => 'checkboxes',
-      '#title' => t('Allowed streams'),
-      '#options' => $options,
-      '#default_value' => $default_value,
-    );
-
-    // Options for allowed mimetypes & extensions.
-    $default_value = isset($media_type->type_callback_args['mimetypes']) ? implode(' ', $media_type->type_callback_args['mimetypes']) : '';
-    $form['mimetypes'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Allowed mimetypes'),
-      '#description' => t('You may optionally enter one or more allowed file mimetypes for this Media type, if appropriate, separating each with a space. You may use a regular expression for matching, such as %image_match (which would match any mimetype beginning with %image) or %any_match, which would match any file mimetype.', array('%image_match' => '/^image/', '%image' => t('image'), '%any_match' => '/.*/')),
-      '#default_value' => check_plain($default_value),
-    );
-    $default_value = isset($media_type->type_callback_args['extensions']) ? implode(' ', $media_type->type_callback_args['extensions']) : '';
-    $form['extensions'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Allowed extensions'),
-      '#description' => t('You may optionally enter one or more allowed file extensions for this Media type, if appropriate, separating each with a space (and no dots).'),
-      '#default_value' => check_plain($default_value),
-    );
-  }
-
-  $form['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save'),
-    '#weight' => 100,
-  );
-  return $form;
-}
-
-function media_admin_type_manage_form_submit($form, &$form_state) {
-  $media_type = media_type_load($form_state['values']['media_type']);
-  // Reset all values to empty.
-  $media_type->type_callback_args = array();
-
-  // What is the logic of the match (AND / OR).
-  if ($form_state['values']['match_type']) {
-    $media_type->type_callback_args['match_type'] = $form_state['values']['match_type'];
-  }
-  else {
-    $media_type->type_callback_args['match_type'] = $form_state['values']['match_type_other'];
-  }
-
-  // Which streams are valid for this type.
-  $media_type->type_callback_args['streams'] = array();
-  foreach ($form_state['values']['streams'] as $stream) {
-    if ($stream) {
-      $media_type->type_callback_args['streams'][] = $stream;
-    }
-  }
-
-  // Which mimetypes are valid for this type.
-  if (trim($form_state['values']['mimetypes'])) {
-    $media_type->type_callback_args['mimetypes'] = explode(' ', $form_state['values']['mimetypes']);
-    array_walk($media_type->type_callback_args['mimetypes'], 'trim');
-    array_filter($media_type->type_callback_args['mimetypes']);
-  }
-
-  // Which file extensions are valid for this type.
-  if (trim($form_state['values']['extensions'])) {
-    $media_type->type_callback_args['extensions'] = explode(' ', $form_state['values']['extensions']);
-    array_walk($media_type->type_callback_args['extensions'], 'trim');
-    array_filter($media_type->type_callback_args['extensions']);
-  }
-
-  media_type_save($media_type);
-  drupal_set_message(t('The @label media type has been saved.', array('@label' => $media_type->label)));
-}
-
-/**
  * Form callback for mass import.
  */
 function media_import($form, &$form_state) {
diff --git a/includes/media.fields.inc b/includes/media.fields.inc
index da1d3e1..cc0111d 100644
--- a/includes/media.fields.inc
+++ b/includes/media.fields.inc
@@ -77,19 +77,12 @@ function media_field_widget_settings_form($field, $instance) {
   $settings = $widget['settings'];
   $form = array();
 
-  // Setup type selection form
-  $types = media_type_get_types();
-  $options = array();
-  foreach ($types as $key => $definition) {
-    $options[$key] = $definition->label;
-  }
-
   $streams = file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE);
 
   $form['allowed_types'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Allowed remote media types'),
-    '#options' => $options,
+    '#options' => file_type_get_names(),
     '#default_value' => $settings['allowed_types'],
     '#description' => t('Media types which are allowed for this field when using remote streams.'),
     '#weight' => 1,
diff --git a/includes/media.types.inc b/includes/media.types.inc
index bafbdd2..6c1eee9 100644
--- a/includes/media.types.inc
+++ b/includes/media.types.inc
@@ -9,20 +9,6 @@
  */
 
 /**
- * Implements hook_file_type_info().
- */
-function media_file_type_info() {
-  $types = array();
-  foreach (media_type_get_types() as $type => $type_object) {
-    $types[$type] = array(
-      'label' => $type_object->label,
-      'weight' => $type_object->weight,
-    );
-  }
-  return $types;
-}
-
-/**
  * Implements hook_file_type_info_alter().
  */
 function media_file_type_info_alter(array &$info) {
@@ -59,44 +45,6 @@ function media_file_type_media_default_view($file, $view_mode, $langcode) {
 }
 
 /**
- *  Update an existing media type or create a new one.
- *
- *  The default media types are currently 'Audio', 'Image', 'Video', and
- *  'Other', which are defined in media_install().
- *
- *  @param object &$type
- *    $type is an object with the following fields:
- *      ->name => The name of the media asset type, such as 'video';
- *      ->label => The human readable name;
- *      ->base => boolean: If the media type cannot be removed.
- *      ->type_callback => Function call to filter an instance to its bundle.
- *      ->type_callback_args => An array of args to be passed to type_callback.
- *  @return void;
- */
-function media_type_save(&$type) {
-  if (empty($type->name)) {
-    throw new Exception('Enable to add type, name not provided');
-  }
-
-  $type = media_type_set_defaults($type);
-  if (!is_array($type->type_callback_args)) {
-    throw new Exception('type_callback_args should be an array');
-  }
-
-  $type->type_callback_args = serialize($type->type_callback_args);
-
-  $ret = db_merge('media_type')
-    ->key(array('name' => $type->name))
-    ->fields((array)$type)
-  ->execute();
-
-  // Clear the caches
-  drupal_static_reset('media_type_get_types');
-  drupal_static_reset('media_type_get_mime_map');
-  return;
-}
-
-/**
  * @todo Remove this function after ensuring that nothing (including update
  *   functions) call it. It is deprecated with the change from media entity
  *   containing a file field to just a file entity.
@@ -105,122 +53,6 @@ function media_type_configure_formatters($name, $view_modes_to_formatters) {
 }
 
 /**
- * Loads a media type based on its machine name.
- *
- * @param string $name
- * @return StdClass
- */
-function media_type_load($name) {
-  $types = media_type_get_types();
-  if (isset($types[$name])) {
-    return $types[$name];
-  }
-}
-
-/**
- *  Loads all media types into an array keyed by machine name and sorted
- *  and weighted lexographically.
- *
- * @return array
- *  Media types keyed by machine name.
- */
-function media_type_get_types() {
-  $types =& drupal_static(__FUNCTION__);
-  if (!$types) {
-    $types = db_select('media_type', 'mt')
-      ->orderBy('weight')
-      ->fields('mt')
-      ->execute()
-      ->fetchAllAssoc('name'); // Will key by the name field.
-    foreach ($types as &$type) {
-      // I really hate this.
-      $type->type_callback_args = unserialize($type->type_callback_args);
-    }
-  }
-
-  return $types;
-}
-
-/**
- *  Create the basic class and defaults for a media entity bundle type.
- */
-function media_type_set_defaults($info) {
-  $type = new stdClass();
-
-  // This is used to filter a file to the proper bundle.
-  $type->type_callback = 'media_is_type';
-  $type->type_callback_args = array();
-  $type->weight = 0;
-
-  foreach ($info as $k => $v) {
-    $type->{$k} = $v;
-  }
-
-  return $type;
-}
-
-/**
- * Determines the type of media a passed in $file is.
- *
- * @todo: integrate this properly with other APIs in media when fields is done
- * @param unknown_type $file
- * @return unknown_type
- */
-function media_get_type($file) {
-  $types = media_type_get_types();
-  foreach ($types as $name => $type) {
-    if (call_user_func_array($type->type_callback, array($file, $type->type_callback_args))) {
-      return $name;
-    }
-  }
-  throw new Exception('Unable to determine type of media from ' . var_export($file, 1));
-}
-
-/**
- * Default callback used to determine if a file is of a given type.
- *
- * @TODO: document 'any' and 'all' matching.
- *
- * @param $file
- *   The file object.
- * @param $args
- *
- * @return unknown_type
- */
-function media_is_type($file, $args) {
-  $match_type = !empty($args['match_type']) ? 'any' : $args['match_type'];
-  $match_all = $match_type == 'all';
-  if (!empty($args['mimetypes'])) {
-    foreach ($args['mimetypes'] as $expression) {
-      if (preg_match($expression, $file->filemime)) {
-        if (!$match_all) {
-          return TRUE;
-        }
-      }
-    }
-    // Was not matched, so return
-    if ($match_all) {
-      return FALSE;
-    }
-  }
-
-  if (!empty($args['extensions'])) {
-    if (in_array(pathinfo($file->uri, PATHINFO_EXTENSION), $args['extensions'])) {
-      if (!$match_all) {
-        return TRUE;
-      }
-    }
-    // Was not matched, so return
-    if ($match_all) {
-      return FALSE;
-    }
-  }
-
-  if (!empty($args['streams'])) {
-  }
-}
-
-/**
  * Implements hook_file_default_displays().
  *
  * Provides default display configurations for media types.
diff --git a/media.install b/media.install
index 2c45f4e..5e60157 100644
--- a/media.install
+++ b/media.install
@@ -9,55 +9,6 @@
  * Implements hook_schema().
  */
 function media_schema() {
-  $schema['media_type'] = array(
-    'description' => 'Stores the settings for media types.',
-    'fields' => array(
-      'name' => array(
-        'description' => 'The machine name of the media type.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'label' => array(
-        'description' => 'The label of the media type.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-      ),
-      'base' => array(
-        'description' => 'If this is a base type (i.e. cannot be deleted)',
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'size' => 'tiny',
-      ),
-      'weight' => array(
-        'description' => 'Weight of media type. Determines which one wins when claiming a piece of media (first wins)',
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'size' => 'normal',
-      ),
-      'type_callback' => array(
-        'description' => 'Callback to determine if provided media is of this type.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => FALSE,
-        'default' => '',
-      ),
-      'type_callback_args' => array(
-        'type' => 'text',
-        'not null' => FALSE,
-        'size' => 'big',
-        'serialize' => TRUE,
-        'description' => 'A serialized array of name value pairs that will be passed to the callback function',
-      ),
-    ),
-    'primary key' => array('name'),
-  );
-
   $schema['media_list_type'] = array(
     'description' => 'Stores the user preference for whether to list as table or images.',
     'fields' => array(
@@ -115,65 +66,6 @@ function media_schema() {
 }
 
 /**
- * Implements hook_install().
- */
-function media_install() {
-  // @todo We may need to disable the media bundle & field in hook_disable.
-
-  // Define the default type to be used if no other type is found. Give it a
-  // high weight to ensure it runs last.
-  $types['default'] = new stdClass();
-  $types['default']->name = 'default';
-  $types['default']->label = "Other";
-  $types['default']->base = TRUE;
-  $types['default']->weight = 1000;
-  $types['default']->type_callback_args = array(
-    'match_type' => 'any',
-    'mimetypes' => array('/.*/'),
-  );
-
-  // Define the common media types: image, audio, and video.
-  $types['image'] = new stdClass();
-  $types['image']->name = 'image';
-  $types['image']->label = "Image";
-  $types['image']->base = TRUE;
-  $types['image']->type_callback_args = array(
-    'match_type' => 'all',
-    'mimetypes' => array('/^image/'),
-    'extensions' => array('jpg', 'jpeg', 'gif', 'png', 'tiff'),
-    'streams' => array('public', 'private'),
-  );
-
-  $types['audio'] = new stdClass();
-  $types['audio']->name = 'audio';
-  $types['audio']->label = "Audio";
-  $types['audio']->base = TRUE;
-  $types['audio']->type_callback_args = array(
-    'match_type' => 'all',
-    'mimetypes' => array('/^audio/'),
-    'extensions' => array('mp3', 'ogg', 'wma'),
-    'streams' => array('public', 'private'),
-  );
-
-  $types['video'] = new stdClass();
-  $types['video']->name = 'video';
-  $types['video']->label = "Video";
-  $types['video']->base = TRUE;
-  $types['video']->type_callback_args = array(
-    'match_type' => 'all',
-    'mimetypes' => array('/^video/'),
-    'extensions' => array('mov', 'mp4', 'avi'),
-    'streams' => array('public', 'private'),
-  );
-
-  // Create the defined types.
-  foreach ($types as $name => $type) {
-    media_type_save($type);
-
-  }
-}
-
-/**
  * Implements hook_uninstall().
  */
 function media_uninstall() {
@@ -297,7 +189,10 @@ function media_update_7002() {
     }
     $type->name = $type->machine_name;
     unset($type->machine_name);
-    media_type_save($type);
+    db_merge('media_type')
+      ->key(array('name' => $type->name))
+      ->fields((array) $type)
+      ->execute();
   }
   variable_del('media_types');
 }
@@ -345,7 +240,7 @@ function media_update_7007() {
   drupal_load('module', 'media');
   drupal_load('module', 'field');
 
-  foreach (media_type_get_types() as $type => $info) {
+  foreach (_media_type_get_types_update_2003() as $type => $info) {
     if ($type != 'image') {
       media_type_configure_formatters($type, array('media_preview' => 'media_large_icon'));
     }
@@ -871,6 +766,38 @@ function media_update_7204() {
 }
 
 /**
+ * Drop the media_types table.
+ */
+function media_update_7205() {
+  // @see http://drupal.org/node/1292382
+  if (!function_exists('file_type_save')) {
+    throw new DrupalUpdateException('The File Entity module needs to be upgraded before continuing.');
+  }
+  else {
+    $types = _media_type_get_types_update_2003();
+    include_once DRUPAL_ROOT . '/includes/file.mimetypes.inc';
+    $mapping = file_mimetype_mapping();
+    foreach ($types as $type) {
+      $extensions = isset($type->type_callback_args['extensions']) ? $type->type_callback_args['extensions'] : array();
+      $mimetypes = isset($type->type_callback_args['mimetypes']) ? $type->type_callback_args['mimetypes'] : array();
+      foreach ($extensions as $extension) {
+        if (isset($mapping['extensions'][$extension])) {
+          $type->mimetypes[] = $mapping['mimetypes'][$mapping['extensions'][$extension]];
+        }
+      }
+      // @TODO: Perform some regex magic on the mimetypes.
+//      foreach ($mimetypes as $mimetype) {
+//
+//      }
+      $type->streams = isset($type->type_callback_args['streams']) ? $type->type_callback_args['streams'] : array();
+      $type->type = $type->name;
+      file_type_save($type);
+    }
+    db_drop_table('media_type');
+  }
+}
+
+/**
  * Helper function for media_update_7204() to update display options within Views.
  */
 function _media_update_7204_update_views_display_options(&$display_options, $view_mode_updates) {
@@ -894,3 +821,27 @@ function _media_update_7204_update_views_display_options(&$display_options, $vie
   }
   return $updated;
 }
+
+/**
+ *  Loads all media types into an array keyed by machine name and sorted
+ *  and weighted lexographically.
+ *
+ * @return array
+ *  Media types keyed by machine name.
+ */
+function _media_update_2005_type_get_types() {
+  $types =& drupal_static(__FUNCTION__);
+  if (!$types) {
+    $types = db_select('media_type', 'mt')
+      ->orderBy('weight')
+      ->fields('mt')
+      ->execute()
+      // Will key by the name field.
+      ->fetchAllAssoc('name');
+    foreach ($types as &$type) {
+      $type->type_callback_args = unserialize($type->type_callback_args);
+    }
+  }
+
+  return $types;
+}
diff --git a/media.module b/media.module
index 9f9800b..e3d7234 100644
--- a/media.module
+++ b/media.module
@@ -1070,6 +1070,10 @@ function media_filter_info() {
  *   Renderable array.
  */
 function media_get_thumbnail_preview($file, $link = NULL) {
+  // If a file has an invalid type, allow file_view_file() to work.
+  if (!file_type_is_enabled($file->type)) {
+    $file->type = file_get_type($file);
+  }
   $preview = file_view_file($file, 'preview');
   $preview['#show_names'] = TRUE;
   $preview['#add_link'] = $link;
@@ -1092,7 +1096,7 @@ function media_get_thumbnail_preview($file, $link = NULL) {
  */
 function media_file_validate_types(stdClass $file, $types) {
   $errors = array();
-  if (!in_array(media_get_type($file), $types)) {
+  if (!in_array(file_get_type($file), $types)) {
     $errors[] = t('Only the following types of files are allowed to be uploaded: %types-allowed', array('%types-allowed' => implode(', ', $types)));
   }
 
