diff --git includes/common.inc includes/common.inc
index a18e4d6..6e13fa9 100644
--- includes/common.inc
+++ includes/common.inc
@@ -6562,19 +6562,21 @@ function entity_prepare_view($entity_type, $entities) {
 }
 
 /**
- * Returns the path to an entity.
+ * Returns the uri elements of an entity.
  *
  * @param $entity_type
  *   The entity type; e.g. 'node' or 'user'.
  * @param $entity
  *   The entity for which to generate a path.
  * @return
- *   The path for the entity, or NULL if the entity has no page of its own.
+ *   An array containing the 'path' and 'options' keys used to build the uri of
+ *   the entity, and matching the signature of url(). NULL if the entity has no
+ *   uri of its own.
  */
-function entity_path($entity_type, $entity) {
+function entity_uri($entity_type, $entity) {
   $info = entity_get_info($entity_type);
-  if (isset($info['path callback']) && function_exists($info['path callback'])) {
-    return $info['path callback']($entity);
+  if (isset($info['uri callback']) && function_exists($info['uri callback'])) {
+    return $info['uri callback']($entity) + array('options' => array());
   }
 }
 /**
diff --git modules/comment/comment.module modules/comment/comment.module
index a3143f8..1086fbb 100644
--- modules/comment/comment.module
+++ modules/comment/comment.module
@@ -97,7 +97,7 @@ function comment_entity_info() {
     'comment' => array(
       'label' => t('Comment'),
       'base table' => 'comment',
-      'path callback' => 'comment_path',
+      'uri callback' => 'comment_uri',
       'fieldable' => TRUE,
       'controller class' => 'CommentController',
       'object keys' => array(
@@ -148,10 +148,13 @@ function comment_node_type_load($name) {
 }
 
 /**
- * Entity path callback.
+ * Entity uri callback.
  */
-function comment_path($comment) {
-  return 'comment/' . $comment->cid;
+function comment_uri($comment) {
+  return array(
+    'path' => 'comment/' . $comment->cid,
+    'options' => array('fragment' => 'comment-' . $comment->cid),
+  );
 }
 
 /**
diff --git modules/image/image.field.inc modules/image/image.field.inc
index 6bbc691..102b6e2 100644
--- modules/image/image.field.inc
+++ modules/image/image.field.inc
@@ -461,7 +461,7 @@ function image_field_formatter_view($obj_type, $object, $field, $instance, $lang
 
   // Check if the formatter involves a link.
   if (strpos($display['type'], 'image_link_content') === 0) {
-    $path = entity_path($obj_type, $object);
+    $uri = entity_uri($obj_type, $object);
   }
   elseif (strpos($display['type'], 'image_link_file') === 0) {
     $link_file = TRUE;
@@ -469,17 +469,20 @@ function image_field_formatter_view($obj_type, $object, $field, $instance, $lang
 
   foreach ($items as $delta => $item) {
     if (isset($link_file)) {
-      $path = file_create_url($item['uri']);
+      $uri = array(
+        'path' => file_create_url($item['uri']),
+        'options' => array(),
+      );
     }
     $element[$delta] = array(
       '#theme' => 'image_formatter',
       '#item' => $item,
       '#image_style' => isset($image_style) ? $image_style : '',
-      '#path' => isset($path) ? $path : '',
+      '#path' => isset($uri) ? $uri : '',
     );
   }
 
-   return $element;
+  return $element;
 }
 
 /**
@@ -502,7 +505,11 @@ function theme_image_formatter($variables) {
   }
 
   if ($variables['path']) {
-    $output = l($output, $variables['path'], array('html' => TRUE));
+    $path = $variables['path']['path'];
+    $options = $variables['path']['options'];
+    // When displaying an image inside a link, the html option must be TRUE.
+    $options['html'] = TRUE;
+    $output = l($output, $path, $options);
   }
 
   return $output;
diff --git modules/node/node.module modules/node/node.module
index ce6026d..3cbc8c8 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -185,7 +185,7 @@ function node_entity_info() {
       'controller class' => 'NodeController',
       'base table' => 'node',
       'revision table' => 'node_revision',
-      'path callback' => 'node_path',
+      'uri callback' => 'node_uri',
       'fieldable' => TRUE,
       'object keys' => array(
         'id' => 'nid',
@@ -243,10 +243,12 @@ function node_entity_info() {
 }
 
 /**
- * Entity path callback.
+ * Entity uri callback.
  */
-function node_path($node) {
-  return 'node/' . $node->nid;
+function node_uri($node) {
+  return array(
+    'path' => 'node/' . $node->nid,
+  );
 }
 
 /**
diff --git modules/system/system.api.php modules/system/system.api.php
index f15a897..cdf85cf 100644
--- modules/system/system.api.php
+++ modules/system/system.api.php
@@ -66,8 +66,9 @@ function hook_hook_info() {
  *     static caching of entities during a page request. Defaults to TRUE.
  *   - load hook: The name of the hook which should be invoked by
  *     DrupalDefaultEntityController:attachLoad(), for example 'node_load'.
- *   - path callback: A function taking an entity as argument and returning the
- *     path to the entity.
+ *   - uri callback: A function taking an entity as argument and returning the
+ *     uri elements of the entity, e.g. 'path' and 'options'. The actual entity
+ *     uri can be constructed by passing these elements to url().
  *   - fieldable: Set to TRUE if you want your entity type to be fieldable.
  *   - object keys: An array describing how the Field API can extract the
  *     information it needs from the objects of the type. Elements:
diff --git modules/taxonomy/taxonomy.module modules/taxonomy/taxonomy.module
index a5b8929..7cb6699 100644
--- modules/taxonomy/taxonomy.module
+++ modules/taxonomy/taxonomy.module
@@ -87,7 +87,7 @@ function taxonomy_entity_info() {
       'label' => t('Taxonomy term'),
       'controller class' => 'TaxonomyTermController',
       'base table' => 'taxonomy_term_data',
-      'path callback' => 'taxonomy_term_path',
+      'uri callback' => 'taxonomy_term_uri',
       'fieldable' => TRUE,
       'object keys' => array(
         'id' => 'tid',
@@ -130,10 +130,12 @@ function taxonomy_entity_info() {
 }
 
 /**
- * Entity path callback.
+ * Entity uri callback.
  */
-function taxonomy_term_path($term) {
-  return 'taxonomy/term/' . $term->tid;
+function taxonomy_term_uri($term) {
+  return array(
+    'path' => 'taxonomy/term/' . $term->tid,
+  );
 }
 
 /**
diff --git modules/user/user.module modules/user/user.module
index 837ae2a..3354b8f 100644
--- modules/user/user.module
+++ modules/user/user.module
@@ -125,7 +125,7 @@ function user_entity_info() {
       'label' => t('User'),
       'controller class' => 'UserController',
       'base table' => 'users',
-      'path callback' => 'user_path',
+      'uri callback' => 'user_uri',
       'fieldable' => TRUE,
       'object keys' => array(
         'id' => 'uid',
@@ -150,10 +150,12 @@ function user_entity_info() {
 }
 
 /**
- * Entity path callback.
+ * Entity uri callback.
  */
-function user_path($user) {
-  return 'user/' . $user->uid;
+function user_uri($user) {
+  return array(
+    'path' => 'user/' . $user->uid,
+  );
 }
 
 /**
