diff --git a/includes/display-edit.inc b/includes/display-edit.inc
index dc6d1b9..2a76638 100644
--- a/includes/display-edit.inc
+++ b/includes/display-edit.inc
@@ -245,6 +245,16 @@ function panels_edit_display_settings_form($form, &$form_state) {
       '#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
       '#maxlength' => 255,
     );
+    
+    $form['display_title']['title_url'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $display->title_url,
+      '#title' => t('Title URL'),
+      '#description' => t('The URL for the title of this panel. If left blank, no link will be generated.'),
+      '#process' => array('ctools_dependent_process'),
+      '#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
+      '#maxlength' => 255,  
+    );
 
     if (!empty($display->context)) {
       $form['display_title']['title']['#description'] .= ' ' . t('You may use substitutions in this title.');
@@ -324,5 +334,6 @@ function panels_edit_display_settings_form_submit($form, &$form_state) {
   if (isset($form_state['values']['display_title']['title'])) {
     $display->title = $form_state['values']['display_title']['title'];
     $display->hide_title = $form_state['values']['display_title']['hide_title'];
+    $display->title_url = $form_state['values']['display_title']['title_url'];
   }
 }
diff --git a/panels.install b/panels.install
index ab4d193..a133e3e 100644
--- a/panels.install
+++ b/panels.install
@@ -31,10 +31,10 @@ function panels_requirements_install() {
     }
     if (!module_invoke('ctools', 'api_version', PANELS_REQUIRED_CTOOLS_API)) {
       $requirements['panels_ctools'] = array(
-        'title' => $t('CTools API Version'),
-        'value' => CTOOLS_API_VERSION,
-        'severity' => REQUIREMENT_ERROR,
-        'description' => t('The CTools API version is too old for Panels. Panels needs at least %version.', array('%version' => PANELS_REQUIRED_CTOOLS_API)),
+          'title' => $t('CTools API Version'),
+          'value' => CTOOLS_API_VERSION,
+          'severity' => REQUIREMENT_ERROR,
+          'description' => t('The CTools API version is too old for Panels. Panels needs at least %version.', array('%version' => PANELS_REQUIRED_CTOOLS_API)),
       );
     }
   }
@@ -47,7 +47,19 @@ function panels_requirements_install() {
 function panels_schema() {
   // This should always point to our 'current' schema. This makes it relatively
   // easy to keep a record of schema as we make changes to it.
-  return panels_schema_6();
+  return panels_schema_7();
+}
+
+function panels_schema_7() {
+  $schema = panels_schema_6();
+
+  $schema['panels_display']['fields']['title_url'] = array(
+      'type' => 'varchar',
+      'length' => '255',
+      'default' => '',
+  );
+
+  return $schema;
 }
 
 function panels_schema_6() {
@@ -62,15 +74,15 @@ function panels_schema_5() {
   $schema = panels_schema_4();
 
   $schema['panels_display']['fields']['uuid'] = array(
-    'type' => 'char',
-    'length' => '36',
+      'type' => 'char',
+      'length' => '36',
   );
   $schema['panels_display']['export']['key'] = 'uuid';
   $schema['panels_display']['export']['key name'] = 'UUID';
 
   $schema['panels_pane']['fields']['uuid'] = array(
-    'type' => 'char',
-    'length' => '36',
+      'type' => 'char',
+      'length' => '36',
   );
   $schema['panels_pane']['export']['key'] = 'uuid';
   $schema['panels_pane']['export']['key name'] = 'UUID';
@@ -82,11 +94,11 @@ function panels_schema_4() {
   $schema = panels_schema_3();
 
   $schema['panels_pane']['fields']['locks'] = array(
-    'type' => 'text',
-    'size' => 'big',
-    'serialize' => TRUE,
-    'object default' => array(),
-    'initial' => array(),
+      'type' => 'text',
+      'size' => 'big',
+      'serialize' => TRUE,
+      'object default' => array(),
+      'initial' => array(),
   );
 
   return $schema;
@@ -101,262 +113,262 @@ function panels_schema_3() {
   $schema = array();
 
   $schema['panels_display'] = array(
-    'export' => array(
-      'object' => 'panels_display',
-      'bulk export' => FALSE,
-      'export callback' => 'panels_export_display',
-      'can disable' => FALSE,
-      'identifier' => 'display',
-    ),
-    'fields' => array(
-      'did' => array(
-        'type' => 'serial',
-        'not null' => TRUE,
-        'no export' => TRUE,
-      ),
-      'layout' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'default' => '',
-      ),
-      'layout_settings' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'panel_settings' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'cache' => array(
-        'type' => 'text',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'title' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'default' => '',
-      ),
-      'hide_title' => array(
-        'type' => 'int',
-        'size' => 'tiny',
-        'default' => 0,
-        'no export' => TRUE,
-      ),
-      'title_pane' => array(
-        'type' => 'int',
-        'default' => 0,
-        'no export' => TRUE,
-      ),
-    ),
-    'primary key' => array('did'),
+      'export' => array(
+          'object' => 'panels_display',
+          'bulk export' => FALSE,
+          'export callback' => 'panels_export_display',
+          'can disable' => FALSE,
+          'identifier' => 'display',
+      ),
+      'fields' => array(
+          'did' => array(
+              'type' => 'serial',
+              'not null' => TRUE,
+              'no export' => TRUE,
+          ),
+          'layout' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'default' => '',
+          ),
+          'layout_settings' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'panel_settings' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'cache' => array(
+              'type' => 'text',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'title' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'default' => '',
+          ),
+          'hide_title' => array(
+              'type' => 'int',
+              'size' => 'tiny',
+              'default' => 0,
+              'no export' => TRUE,
+          ),
+          'title_pane' => array(
+              'type' => 'int',
+              'default' => 0,
+              'no export' => TRUE,
+          ),
+      ),
+      'primary key' => array('did'),
   );
 
   $schema['panels_pane'] = array(
-    'export' => array(
-      'can disable' => FALSE,
-      'identifier' => 'pane',
-      'bulk export' => FALSE,
-    ),
-    'fields' => array(
-      'pid' => array(
-        'type' => 'serial',
-        'not null' => TRUE,
+      'export' => array(
+          'can disable' => FALSE,
+          'identifier' => 'pane',
+          'bulk export' => FALSE,
+      ),
+      'fields' => array(
+          'pid' => array(
+              'type' => 'serial',
+              'not null' => TRUE,
+          ),
+          'did' => array(
+              'type' => 'int',
+              'not null' => TRUE,
+              'default' => 0,
+              'no export' => TRUE,
+          ),
+          'panel' => array(
+              'type' => 'varchar',
+              'length' => '32',
+              'default' => '',
+          ),
+          'type' => array(
+              'type' => 'varchar',
+              'length' => '32',
+              'default' => '',
+          ),
+          'subtype' => array(
+              'type' => 'varchar',
+              'length' => '64',
+              'default' => '',
+          ),
+          'shown' => array(
+              'type' => 'int',
+              'size' => 'tiny',
+              'default' => 1,
+          ),
+          'access' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'configuration' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'cache' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'style' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'css' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'extras' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'serialize' => TRUE,
+              'object default' => array(),
+              'initial' => array(),
+          ),
+          'position' => array(
+              'type' => 'int',
+              'size' => 'small',
+              'default' => 0,
+          ),
+      ),
+      'primary key' => array('pid'),
+      'indexes' => array(
+          'did_idx' => array('did')
       ),
-      'did' => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-        'no export' => TRUE,
-      ),
-      'panel' => array(
-        'type' => 'varchar',
-        'length' => '32',
-        'default' => '',
-      ),
-      'type' => array(
-        'type' => 'varchar',
-        'length' => '32',
-        'default' => '',
-      ),
-      'subtype' => array(
-        'type' => 'varchar',
-        'length' => '64',
-        'default' => '',
-      ),
-      'shown' => array(
-        'type' => 'int',
-        'size' => 'tiny',
-        'default' => 1,
-      ),
-      'access' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'configuration' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'cache' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'style' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'css' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'extras' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'serialize' => TRUE,
-        'object default' => array(),
-        'initial' => array(),
-      ),
-      'position' => array(
-        'type' => 'int',
-        'size' => 'small',
-        'default' => 0,
-      ),
-    ),
-    'primary key' => array('pid'),
-    'indexes' => array(
-      'did_idx' => array('did')
-    ),
   );
 
   $schema['panels_renderer_pipeline'] = array(
-    'description' => 'Contains renderer pipelines for Panels. Each pipeline contains one or more renderers and access rules to select which renderer gets used.',
-    'export' => array(
-      'identifier' => 'pipeline',
-      'bulk export' => TRUE,
-      'primary key' => 'rpid',
-      'api' => array(
-        'owner' => 'panels',
-        'api' => 'pipelines',
-        'minimum_version' => 1,
-        'current_version' => 1,
-      ),
-    ),
-    'fields' => array(
-      'rpid' => array(
-        'type' => 'serial',
-        'description' => 'A database primary key to ensure uniqueness.',
-        'not null' => TRUE,
-        'no export' => TRUE,
-      ),
-      'name' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'Unique ID for this content. Used to identify it programmatically.',
-      ),
-      'admin_title' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'Administrative title for this pipeline.',
-      ),
-      'admin_description' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'description' => 'Administrative description for this pipeline.',
-        'object default' => '',
-      ),
-      'weight' => array(
-        'type' => 'int',
-        'size' => 'small',
-        'default' => 0,
-      ),
-      'settings' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'description' => 'Serialized settings for the actual pipeline. The contents of this field are up to the plugin that uses it.',
-        'serialize' => TRUE,
-        'object default' => array(),
-      ),
-    ),
-    'primary key' => array('rpid'),
+      'description' => 'Contains renderer pipelines for Panels. Each pipeline contains one or more renderers and access rules to select which renderer gets used.',
+      'export' => array(
+          'identifier' => 'pipeline',
+          'bulk export' => TRUE,
+          'primary key' => 'rpid',
+          'api' => array(
+              'owner' => 'panels',
+              'api' => 'pipelines',
+              'minimum_version' => 1,
+              'current_version' => 1,
+          ),
+      ),
+      'fields' => array(
+          'rpid' => array(
+              'type' => 'serial',
+              'description' => 'A database primary key to ensure uniqueness.',
+              'not null' => TRUE,
+              'no export' => TRUE,
+          ),
+          'name' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'Unique ID for this content. Used to identify it programmatically.',
+          ),
+          'admin_title' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'Administrative title for this pipeline.',
+          ),
+          'admin_description' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'description' => 'Administrative description for this pipeline.',
+              'object default' => '',
+          ),
+          'weight' => array(
+              'type' => 'int',
+              'size' => 'small',
+              'default' => 0,
+          ),
+          'settings' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'description' => 'Serialized settings for the actual pipeline. The contents of this field are up to the plugin that uses it.',
+              'serialize' => TRUE,
+              'object default' => array(),
+          ),
+      ),
+      'primary key' => array('rpid'),
   );
 
   $schema['panels_layout'] = array(
-    'description' => 'Contains exportable customized layouts for this site.',
-    'export' => array(
-      'identifier' => 'layout',
-      'bulk export' => TRUE,
-      'primary key' => 'lid',
-      'api' => array(
-        'owner' => 'panels',
-        'api' => 'layouts',
-        'minimum_version' => 1,
-        'current_version' => 1,
-      ),
-    ),
-    'fields' => array(
-      'lid' => array(
-        'type' => 'serial',
-        'description' => 'A database primary key to ensure uniqueness.',
-        'not null' => TRUE,
-        'no export' => TRUE,
-      ),
-      'name' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'Unique ID for this content. Used to identify it programmatically.',
-      ),
-      'admin_title' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'Administrative title for this layout.',
-      ),
-      'admin_description' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'description' => 'Administrative description for this layout.',
-        'object default' => '',
-      ),
-      'category' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'Administrative category for this layout.',
-      ),
-      'plugin' => array(
-        'type' => 'varchar',
-        'length' => '255',
-        'description' => 'The layout plugin that owns this layout.',
-      ),
-      'settings' => array(
-        'type' => 'text',
-        'size' => 'big',
-        'description' => 'Serialized settings for the actual layout. The contents of this field are up to the plugin that uses it.',
-        'serialize' => TRUE,
-        'object default' => array(),
-      ),
-    ),
-    'primary key' => array('lid'),
+      'description' => 'Contains exportable customized layouts for this site.',
+      'export' => array(
+          'identifier' => 'layout',
+          'bulk export' => TRUE,
+          'primary key' => 'lid',
+          'api' => array(
+              'owner' => 'panels',
+              'api' => 'layouts',
+              'minimum_version' => 1,
+              'current_version' => 1,
+          ),
+      ),
+      'fields' => array(
+          'lid' => array(
+              'type' => 'serial',
+              'description' => 'A database primary key to ensure uniqueness.',
+              'not null' => TRUE,
+              'no export' => TRUE,
+          ),
+          'name' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'Unique ID for this content. Used to identify it programmatically.',
+          ),
+          'admin_title' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'Administrative title for this layout.',
+          ),
+          'admin_description' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'description' => 'Administrative description for this layout.',
+              'object default' => '',
+          ),
+          'category' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'Administrative category for this layout.',
+          ),
+          'plugin' => array(
+              'type' => 'varchar',
+              'length' => '255',
+              'description' => 'The layout plugin that owns this layout.',
+          ),
+          'settings' => array(
+              'type' => 'text',
+              'size' => 'big',
+              'description' => 'Serialized settings for the actual layout. The contents of this field are up to the plugin that uses it.',
+              'serialize' => TRUE,
+              'object default' => array(),
+          ),
+      ),
+      'primary key' => array('lid'),
   );
 
   return $schema;
@@ -383,7 +395,6 @@ function panels_update_7300() {
  */
 function panels_update_7301() {
   // Load the schema.
-
   // Due to a previous failure, the field may already exist:
 
   $schema = panels_schema_4();
@@ -441,24 +452,24 @@ function panels_update_7302() {
 
   // Update all DB-based panes & displays to ensure that they all contain a UUID.
   $display_dids = db_select('panels_display')
-    ->fields('panels_display', array('did'))
-    ->condition(db_or()
-      ->condition('uuid', '')
-      ->isNull('uuid')
-    )
-    ->execute()
-    ->fetchCol();
+          ->fields('panels_display', array('did'))
+          ->condition(db_or()
+                  ->condition('uuid', '')
+                  ->isNull('uuid')
+          )
+          ->execute()
+          ->fetchCol();
 
   // Check the panes as well, for paranoia.
   $pane_dids = db_select('panels_pane')
-    ->distinct()
-    ->fields('panels_pane', array('did'))
-    ->condition(db_or()
-      ->condition('uuid', '')
-      ->isNull('uuid')
-    )
-    ->execute()
-    ->fetchCol();
+          ->distinct()
+          ->fields('panels_pane', array('did'))
+          ->condition(db_or()
+                  ->condition('uuid', '')
+                  ->isNull('uuid')
+          )
+          ->execute()
+          ->fetchCol();
 
   $dids = array_unique(array_merge($display_dids, $pane_dids));
 
@@ -468,8 +479,7 @@ function panels_update_7302() {
       panels_save_display($display);
     }
     $msg[] = t('Generated UUIDs for database-based panel displays and panes.');
-  }
-  else {
+  } else {
     $msg[] = t('No database-based panel displays or panes for which to generate UUIDs.');
   }
 
@@ -487,3 +497,22 @@ function panels_update_7303() {
     db_create_table($table_name, $schema[$table_name]);
   }
 }
+
+/**
+ * Add panels_display.title_url field.
+ */
+function panels_update_7304() {
+  // Load the schema.
+  $schema = panels_schema_7();
+  $table = 'panels_display';
+  $field = 'title_url';
+  $spec = $schema[$table]['fields'][$field];
+
+  if (!db_field_exists($table, $field)) {
+    // Re-define the column.
+    db_add_field($table, $field, $spec);
+    return t('Added panels_display.title_url field.');
+  }
+
+  return t('panels_pane.title_url field already existed, update skipped.');
+}
diff --git a/panels.module b/panels.module
index 4bb3bad..8a72fd7 100644
--- a/panels.module
+++ b/panels.module
@@ -705,7 +705,9 @@ class panels_display {
 
       case PANELS_TITLE_FIXED:
       case FALSE; // For old exported panels that are not in the database.
-        if (!empty($this->title)) {
+        if (!empty($this->title) && !empty($this->title_url)) {
+          return l(filter_xss_admin(ctools_context_keyword_substitute($this->title, array(), $this->context)), filter_xss_admin(ctools_context_keyword_substitute($this->title_url, array(), $this->context)), array('attributes' => array('class' => 'title-link')));         
+        }elseif(!empty($this->title)) {
           return filter_xss_admin(ctools_context_keyword_substitute($this->title, array(), $this->context));
         }
         return NULL;
