diff --git a/includes/media.filter.inc b/includes/media.filter.inc
index 9aeaab7..a839834 100644
--- a/includes/media.filter.inc
+++ b/includes/media.filter.inc
@@ -296,11 +296,21 @@ function media_token_to_markup($match, $wysiwyg = FALSE) {
       }
     }
 
-    $file = file_load($tag_info['fid']);
-    if (!$file) {
-      throw new Exception('Could not load media object');
+    // Load the file, preventing infinite recursion in case the media entity
+    // contains a reference to itself.
+    static $current_fids = array();
+    if (!isset($current_fids[$tag_info['fid']])) {
+      $current_fids[$tag_info['fid']] = TRUE;
+      if (!$file = file_load($tag_info['fid'])) {
+        throw new Exception('Could not load media object');
+      }
+      $tag_info['file'] = $file;
+    }
+    else {
+      throw new Exception(t('File !fid already loaded. Recursion prevented.', array(
+        '!fid' => $tag_info['fid'],
+      )));
     }
-    $tag_info['file'] = $file;
 
     // The class attributes is a string, but drupal requires it to be
     // an array, so we fix it here.
