diff --git a/file_entity.admin.inc b/file_entity.admin.inc
index bb1b2ed..b3c33b8 100644
--- a/file_entity.admin.inc
+++ b/file_entity.admin.inc
@@ -192,7 +192,7 @@ function file_entity_list_types_page() {
   $field_ui = module_exists('field_ui');
   $header = array(
     array('data' => t('Name')),
-    array('data' => t('Operations'), 'colspan' => $field_ui ? '4' : '2'),
+    array('data' => t('Operations'), 'colspan' => $field_ui ? '5' : '3'),
   );
   $rows = array();
 
@@ -206,6 +206,7 @@ function file_entity_list_types_page() {
       $row[] = array('data' => isset($path) ? l(t('manage display'), $path . '/display') : '');
     }
     $row[] = array('data' => isset($path) ? l(t('manage file display'), $path . '/file-display') : '');
+    $row[] = array('data' => isset($path) ? l(t('delete'), $path . '/delete') : '');
 
     $rows[] = $row;
   }
@@ -375,8 +376,18 @@ function theme_file_entity_file_display_order($variables) {
  * @see file_entity_file_type_form_validate()
  * @see file_entity_file_type_form_submit()
  */
-function file_entity_file_type_form($form, &$form_state, $type) {
-  $form['#file_type'] = $type->type;
+function file_entity_file_type_form($form, &$form_state, $type = NULL) {
+  if (!isset($type->type)) {
+    // This is a new type.
+    $type = (object) array(
+      'type' => '',
+      'label' => '',
+      'description' => '',
+      'streams' => array(),
+      'mimetypes' => array(),
+    );
+  }
+  $form['#file_type'] = $type;
 
   $form['label'] = array(
     '#type' => 'textfield',
@@ -385,6 +396,18 @@ function file_entity_file_type_form($form, &$form_state, $type) {
     '#required' => TRUE,
     '#default_value' => $type->label,
   );
+
+  $form['type'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => $type->type,
+    '#maxlength' => 255,
+    '#disabled' => (bool) $type->type,
+    '#machine_name' => array(
+      'exists' => 'file_type_load',
+    ),
+    '#description' => t('A unique machine-readable name for this file type. It must only contain lowercase letters, numbers, and underscores.'),
+  );
+
   $form['description'] = array(
     '#type' => 'textarea',
     '#title' => t('Description'),
@@ -432,10 +455,18 @@ function file_entity_file_type_form($form, &$form_state, $type) {
     '#default_value' => $default_value,
   );
 
-  $form['submit'] = array(
+  $form['actions'] = array('#type' => 'actions');
+
+  $form['actions']['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Save'),
   );
+  if (!empty($type->type)) {
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+    );
+  }
 
   return $form;
 }
@@ -464,8 +495,18 @@ function file_entity_file_type_form_validate($form, &$form_state) {
  * @see file_entity_file_type_form_validate()
  */
 function file_entity_file_type_form_submit($form, &$form_state) {
-  $type = file_type_load($form['#file_type']);
-
+  if (!empty($form['#file_type']->type)) {
+    $type = file_type_load($form['#file_type']->type);
+  }
+  else {
+    $type = (object) array(
+      'type' => $form_state['values']['type'],
+    );
+  }
+  if ($form_state['values']['op'] == t('Delete')) {
+    $form_state['redirect'] = 'admin/structure/file-types/manage/' . $type->type . '/delete';
+    return;
+  }
   $type->label = $form_state['values']['label'];
   $type->description = $form_state['values']['description'];
   $type->mimetypes = array_filter(array_map('trim', explode("\n", $form_state['values']['mimetypes'])));
@@ -481,3 +522,38 @@ function file_entity_file_type_form_submit($form, &$form_state) {
   drupal_set_message(t('The file type %type has been updated.', array('%type' => $type->label)));
   $form_state['redirect'] = 'admin/structure/file-types';
 }
+
+
+/**
+ * Menu callback; delete a single file type.
+ */
+function file_entity_type_delete_confirm($form, &$form_state, $type) {
+  $form['type'] = array('#type' => 'value', '#value' => $type->type);
+  $form['label'] = array('#type' => 'value', '#value' => $type->label);
+
+  $message = t('Are you sure you want to delete the file type %type?', array('%type' => $type->label));
+  $caption = '';
+
+  $num_files = db_query("SELECT COUNT(*) FROM {file_managed} WHERE type = :type", array(':type' => $type->type))->fetchField();
+  if ($num_files) {
+    $caption .= '<p>' . format_plural($num_files, '%type is used by 1 file on your site. If you remove this file type, you will not be able to edit the %type file and it may not display correctly.', '%type is used by @count pieces of file on your site. If you remove %type, you will not be able to edit the %type file and it may not display correctly.', array('%type' => $type->label)) . '</p>';
+  }
+
+  $caption .= '<p>' . t('This action cannot be undone.') . '</p>';
+
+  return confirm_form($form, $message, 'admin/structure/file-types', $caption, t('Delete'));
+}
+
+/**
+ * Process file type delete confirm submissions.
+ */
+function file_entity_type_delete_confirm_submit($form, &$form_state) {
+  file_type_delete($form_state['values']['type']);
+
+  $t_args = array('%label' => $form_state['values']['label']);
+  drupal_set_message(t('The file type %label has been deleted.', $t_args));
+  watchdog('file_entity', 'Deleted file type %label.', $t_args, WATCHDOG_NOTICE);
+
+  $form_state['redirect'] = 'admin/structure/file-types';
+  return;
+}
diff --git a/file_entity.module b/file_entity.module
index 2f68a35..5f6b606 100644
--- a/file_entity.module
+++ b/file_entity.module
@@ -111,10 +111,25 @@ function file_entity_menu() {
     'access arguments' => array('administer file types'),
     'file' => 'file_entity.admin.inc',
   );
+  $items['admin/structure/file-types/add'] = array(
+    'title' => 'Add file type',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('file_entity_file_type_form'),
+    'access arguments' => array('administer file types'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'file_entity.admin.inc',
+  );
   $items['admin/structure/file-types/manage/%file_type'] = array(
     'title' => 'Manage file types',
     'description' => 'Manage settings for the type of files used on your site.',
   );
+  $items['admin/structure/file-types/manage/%file_type/delete'] = array(
+    'title' => 'Delete file type',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('file_entity_type_delete_confirm', 4),
+    'access arguments' => array('administer file types'),
+    'file' => 'file_entity.admin.inc',
+  );
   $items['admin/content/file'] = array(
     'title' => 'Files',
     'description' => 'Manage files used on your site.',
