diff --git javascript/media-format-form.js javascript/media-format-form.js
index 4d892b1..39b42d6 100644
--- javascript/media-format-form.js
+++ javascript/media-format-form.js
@@ -41,8 +41,25 @@ Drupal.media.formatForm.submit = function () {
   if ($(this).hasClass('fake-cancel')) {
     buttons[1].click();
   } else {
+    Drupal.media.formatForm.updateFields();
     buttons[0].click();
   }
-}
+};
+
+Drupal.media.formatForm.updateFields = function () {
+  // Update media fields through AJAX request
+  var query = $(":input").serialize();
+  $.ajax({
+      url: Drupal.settings.basePath + 'media/js/update',
+      global: false,
+      type: "POST",
+      data: query,
+      dataType: "html",
+      async:false,
+      error: function(msg){
+         alert(msg);
+      }
+  });
+};
 
 })(jQuery);
diff --git media.filter.inc media.filter.inc
index aec8abe..bda9549 100644
--- media.filter.inc
+++ media.filter.inc
@@ -170,8 +170,7 @@ function media_token_to_markup($match, $wysiwyg = FALSE) {
     return '';
   }
 
-  $file_field = media_get_file_without_label($media_obj, $media['view_mode'], $settings);
-  return drupal_render($file_field);
+  return theme('media_file', field_attach_view('media', $media_obj, $media['view_mode'], null));
 }
 
 /**
diff --git media.module media.module
index 807924e..ec74615 100644
--- media.module
+++ media.module
@@ -247,6 +247,15 @@ function media_menu() {
     'file' => 'media.pages.inc',
   );
 
+  // Update custom fields via AJAX.
+  $items['media/js/update'] = array(
+    'page callback' => 'media_update_ajax',
+    'access callback' => 'media_access',
+    'access arguments' => array('view'),
+    'type' => MENU_CALLBACK,
+    'file' => 'media.pages.inc',
+  );
+
   return $items;
 }
 
@@ -344,6 +353,10 @@ function media_theme() {
       'variables' => array('file' => NULL),
       'file' => 'media.theme.inc',
     ),
+    // Showing one element
+    'media_file' => array(
+      'variables' => array('element' => NULL),
+    ),
   );
 }
 
diff --git media.pages.inc media.pages.inc
index c005a2e..0911a8e 100644
--- media.pages.inc
+++ media.pages.inc
@@ -50,6 +50,33 @@ function media_preview_ajax() {
 }
 
 /**
+ *  Menu callback; update custom fields from an AJAX call.
+ */
+function media_update_ajax() {
+
+  // Only operates if there is a fid value.
+  if (empty($_POST["fid"])){ die(); }
+
+  // Saving the fields
+  $media = media_load($_POST["fid"]);
+  
+  // Getting the fields to update
+  // @TODO: Find a better method.
+  foreach ($_POST as $key => $value) {
+    if (substr($key, 0, 5) == "field") {
+      $media->{$key}['und'][0]['value'] = $value;
+    }
+  }
+  
+  // Saving the changes
+  media_save($media);
+
+  // @TODO: Provide some sort of output.    
+  die();
+
+}
+
+/**
  * Menu callback; presents the Media editing form.
  */
 function media_page_edit($media) {
diff --git media.theme.inc media.theme.inc
index 1b5f373..d785453 100644
--- media.theme.inc
+++ media.theme.inc
@@ -8,6 +8,23 @@
  */
 
 /**
+ * Display a media file.
+ * @param array $element
+ *   The form element.
+ * @return string
+ */
+function theme_media_file($element) {
+  // Add the CSS classes.
+  $classes = array(
+    'media', 'file', $element['file']['#view_mode']
+  );
+  // Add the CSS for our display.
+  $output = '<div class="' .implode(' ', $classes) . '">' . drupal_render($element) . '</div>';
+
+  return $output;
+}
+
+/**
  * Display the media file browser.
  * @TODO this is depreciated I think
  * @param array $element
diff --git media.types.inc media.types.inc
index 8f7a813..040be9a 100644
--- media.types.inc
+++ media.types.inc
@@ -254,16 +254,46 @@ function media_is_type($media, $args) {
  * Implement hook_media_format_form_prepare_alter
  */
 function media_media_format_form_prepare_alter(&$form, &$form_state, $media) {
+
   switch($media->type) {
     case 'image':
-      // @TODO: Isn't there a $file->description?
-      $description = $media->filename;
-      $form['options']['alt'] = array(
-        '#type' => 'textfield',
-        '#title' => t('Description'),
-        '#default_value' => $description,
-        '#description' => t('Alternate text a user will see if the image is not available'),
+    
+      // Adding a hidden field with the fid value.
+      $form['options']['fid'] = array(
+        '#type' => 'hidden',
+        '#value' => $media->fid
       );
+    
+      // Adding custom fields
+      $result = db_query('SELECT * FROM {field_config_instance} WHERE bundle = :bundle', array(':bundle'=> $media->type));
+      foreach ($result as $record) {
+      
+        // Do not print a form field for a file.
+        if ($record->field_name == 'file') {
+          continue;
+        }
+        
+        // Registered value.
+        // @TODO: Find a better way of showing the registered value.
+        $value = (count($media->{$record->field_name}) > 0) ? $media->{$record->field_name}['und'][0]['value'] : '';
+
+        // Widget
+        // @TODO: Find a better way of showing different types.
+        $data = unserialize($record->data);
+        switch ($data['widget']['type']) {
+            case 'text_textfield':
+                $type = 'textfield';
+                break;
+        }
+        
+        $form['options'][$record->field_name] = array(
+          '#type' => $type,
+          '#title' => t($data['label']),
+          '#description' => t($data['description']),
+          '#value' => $value,
+        );
+      }
+    
       break;
   }
 }
