diff --git a/core/includes/common.inc b/core/includes/common.inc
index a03c089..b52c88b 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -2280,11 +2280,6 @@ function drupal_http_header_attributes(array $attributes = array()) {
  * @param array $options
  *   An associative array of additional options. Defaults to an empty array. It
  *   may contain the following elements.
- *   - 'attributes': An associative array of HTML attributes to apply to the
- *     anchor tag. If element 'class' is included, it must be an array; 'title'
- *     must be a string; other elements are more flexible, as they just need
- *     to work as an argument for the constructor of the class
- *     Drupal\Core\Template\Attribute($options['attributes']).
  *   - 'html' (default FALSE): Whether $text is HTML or just plain-text. For
  *     example, to make an image tag into a link, this must be set to TRUE, or
  *     you will see the escaped HTML image tag. $text is not sanitized if
@@ -2295,16 +2290,29 @@ function drupal_http_header_attributes(array $attributes = array()) {
  *     the link is "active", or pointing to the current page (the language as
  *     well as the path must match). This element is also used by url().
  *   - Additional $options elements used by the url() function.
+ * @param array $attributes
+ *   An array of HTML attributes.
  *
  * @return string
  *   An HTML string containing a link to the given path.
  *
  * @see url()
  */
-function l($path, $content, $options = array(), $attributes = array()) {
+function l($path = NULL, $content = NULL, $options = array(), $attributes = array()) {
   static $use_theme = NULL;
 
-  // Merge in defaults.
+  // Handle default arguments.
+  if ($path == NULL) {
+    $path = '<front>';
+    if ($content == NULL) {
+      $content = t('Home');
+    }
+  }
+  else if ($content == NULL) {
+    $content = $path;
+  }
+
+  // Merge in default options.
   $options += array(
     'query' => array(),
     'html' => FALSE,
@@ -2356,7 +2364,7 @@ function l($path, $content, $options = array(), $attributes = array()) {
     }
   }
   if ($use_theme) {
-    return theme('link', array('content' => $content, 'path' => $path, 'options' => $options, 'attributes' => $attributes));
+    return theme('link', array('path' => $path, 'content' => $content, 'options' => $options, 'attributes' => $attributes));
   }
   // The result of url() is a plain-text URL. Because we are using it here
   // in an HTML argument context, we need to encode it properly.
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index a69f36f..dcc8ae5 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -1659,7 +1659,7 @@ function template_preprocess_comment(&$variables) {
   $variables['signature'] = $comment->signature;
 
   $uri = $comment->uri();
-  $uri['attributes'] += array('class' => array('permalink'), 'rel' => 'bookmark');
+  $uri['attributes'] = array('class' => array('permalink'), 'rel' => 'bookmark');
 
   $variables['title'] = l($uri['path'], $comment->subject, $uri['options'], $uri['attributes']);
   $variables['permalink'] = l($uri['path'], t('Permalink'), $uri['options'], $uri['attributes']);
