diff --git a/follow.css b/follow.css
index 77813b7..6274cbb 100644
--- a/follow.css
+++ b/follow.css
@@ -1,4 +1,6 @@
 
+/* Adds default icon for custom links; custom icons can be set through the Build menu and are displayed with inline styles.  Built-in network icons are listed below. */
+
 a.follow-link {
 	height: 30px;
 	display: block;
@@ -6,6 +8,7 @@ a.follow-link {
 	padding-left: 28px;
 	background-position: 0 0;
 	background-repeat: no-repeat;
+	background-image: url(icons/small/icon-generic.png);
 }
 
 a.follow-link-facebook {
diff --git a/follow.install b/follow.install
index 1fb823b..2c72fc3 100644
--- a/follow.install
+++ b/follow.install
@@ -65,6 +65,27 @@ function follow_schema() {
         'size' => 'tiny',
         'description' => 'The weight of this {follow_links}.',
       ),
+      'tooltip' => array(
+	'type'=> 'varchar',
+	'length' => 255,
+	'not null' => TRUE,
+	'default' => '',
+	'description' => 'Custom tooltip',
+      ),
+      'domain' => array(
+	'type'=> 'varchar',
+	'length' => 255,
+	'not null' => TRUE,
+	'default' => '',
+	'description' => 'Domain for validating custom network link',
+      ),
+      'image' => array(
+	'type'=> 'varchar',
+	'length' => 255,
+	'not null' => TRUE,
+	'default' => '',
+	'description' => 'Icon for custom network link',
+      ),
     ),
     'primary key' => array('lid'),
     'unique keys' => array(
@@ -180,3 +201,28 @@ function follow_update_6003() {
 
   return $ret;
 }
+
+/** Add fields for:
+    - Custom tooltip
+    - Domain for validating custom network links
+    - Icon image for custom network links
+*/
+function follow_update_6004() {
+  $ret = array();
+  if (!db_column_exists('follow_links', 'tooltip')) {
+    $schema = follow_schema();
+    $tooltip = $schema['follow_links']['fields']['tooltip'];
+    db_add_field($ret, 'follow_links', 'tooltip', $tooltip);
+  }
+  if (!db_column_exists('follow_links', 'domain')) {
+    $schema = follow_schema();
+    $domain = $schema['follow_links']['fields']['domain'];
+    db_add_field($ret, 'follow_links', 'domain', $domain);
+  }
+  if (!db_column_exists('follow_links', 'image')) {
+    $schema = follow_schema();
+    $image = $schema['follow_links']['fields']['image'];
+    db_add_field($ret, 'follow_links', 'image', $image);
+  }
+  return $ret;
+}
diff --git a/follow.module b/follow.module
index 48f58b2..b1a5b8e 100644
--- a/follow.module
+++ b/follow.module
@@ -42,6 +42,21 @@ function follow_menu() {
     'page arguments' => array('follow_links_form'),
     'access arguments' => array('edit site follow links'),
   );
+  // Adding tabs to the Build page
+  $items['admin/build/follow/config'] = array(
+    'title' => 'Configure',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => 0,
+  );
+  $items['admin/build/follow/add'] = array(
+    'title' => 'Add custom site link',
+    'description' => 'Add custom sitewide follow link',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('follow_links_form_add'),
+    'access arguments' => array('edit site follow links'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 10,
+  );
 
   $items['user/%/follow'] = array(
     'title' => 'My follow links',
@@ -358,20 +373,34 @@ function theme_follow_links($variables) {
 function theme_follow_link($variables) {
   $link = $variables['link'];
   $network = $variables['network'];
-  $title = !empty($link->title) ? $link->title : $network['title'];
+  if (!empty($link->title))
+    // Use custom title, if there is one
+    $title = $link->title;
+  elseif (!empty($network['title']))
+    // If not, then use built-in network title, if there is one
+    $title = $network['title'];
+  else
+    // If not, that means it's a custom added link.  Just use the name as the title.
+    $title = $link->name;
 
   // @see follow_link_tooltip().
   $tooltip_callback = (isset($network['tooltip callback']) && function_exists($network['tooltip callback'])) ? $network['tooltip callback'] : 'follow_link_tooltip';
-  $tooltip = $tooltip_callback($title, $variables);
+  // Use custom tooltip, if there is one.  Otherwise use default.
+  $tooltip = !empty($link->tooltip) ? $link->tooltip : $tooltip_callback($title, $variables);
 
   $classes = array();
   $classes[] = 'follow-link';
   $classes[] = "follow-link-{$link->name}";
   $classes[] = $link->uid ? 'follow-link-user' : 'follow-link-site';
 
+  // Add custom icon as an inline style, otherwise keep blank to use default icon
+  $image = $link->image;
+  $style = !empty($image) ? "background-image: url(" . base_path() . $image . ");" : '';
+
   $attributes = array(
     'class' => implode(' ', $classes),
     'title' => $tooltip,
+    'style' => $style,
   );
   $link->options['attributes'] = $attributes;
 
@@ -436,19 +465,22 @@ function follow_links_form(&$form_state, $uid = 0) {
   $networks = follow_networks_load($uid, TRUE);
 
   // Put all our existing links at the top, sorted by weight.
+  // Use built-in network name, if there is one; otherwise use custom name.  Also add custom tooltip, if there is one.
   if (is_array($links)) {
     foreach ($links as $name => $link) {
-      $title = $networks[$name]['title'];
-      $form['follow_links'][$name] = _follow_links_form_link($link, $title, $uid);
+      $title = !empty($networks[$name]['title']) ? $networks[$name]['title'] : $name;
+      $tooltip = $networks[$name]['tooltip'];
+      $form['follow_links'][$name] = _follow_links_form_link($link, $title, $uid, $tooltip);
       // Unset this specific network so we don't add the same one again below.
       unset($networks[$name]);
     }
   }
   // Now add all the empty ones.
+  // Include custom tooltip, if there is one.
   foreach ($networks as $name => $info) {
     $link = new stdClass();
     $link->name = $name;
-    $form['follow_links'][$name] = _follow_links_form_link($link, $info['title'], $uid);
+    $form['follow_links'][$name] = _follow_links_form_link($link, $info['title'], $uid, $info['tooltip']);
   }
 
   $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
@@ -458,8 +490,9 @@ function follow_links_form(&$form_state, $uid = 0) {
 
 /**
  * Helper function to create an individual link form element.
+ * Includes custom tooltip, if there is one.
  */
-function _follow_links_form_link($link, $title, $uid) {
+function _follow_links_form_link($link, $title, $uid, $tooltip) {
   $elements = array();
 
   $elements['name'] = array(
@@ -480,6 +513,8 @@ function _follow_links_form_link($link, $title, $uid) {
     '#type' => 'textfield',
     '#follow_network' => $link->name,
     '#follow_uid' => $uid,
+    // Add domain to validate custom links
+    '#domain' => $link->domain,
     '#default_value' => isset($link->url) ? $link->url : '',
     '#element_validate' => array('follow_url_validate'),
   );
@@ -491,7 +526,13 @@ function _follow_links_form_link($link, $title, $uid) {
     '#size' => 15,
     '#access' => user_access('change follow link titles') && !empty($link->url),
   );
-
+  // Add custom tooltip, if there is one.
+  $elements['tooltip'] = array(
+    '#type' => 'textfield',
+    '#size' => 15,
+    '#default_value' => isset($link->tooltip) ? $link->tooltip : '',
+    '#access' => !empty($link->url),
+  );
   return $elements;
 }
 
@@ -567,8 +608,9 @@ function follow_url_validate($form) {
   $info = $networks[$form['#follow_network']];
 
   // @see follow_network_regex().
+  // Adds domain handler for custom links
   $regex_callback = (isset($info['regex callback']) && function_exists($info['regex callback'])) ? $info['regex callback'] : 'follow_network_regex';
-  $regex = $regex_callback($info);
+  $regex = $regex_callback($info, $form['#domain']);
 
   $parsed = follow_parse_url($url);
   if($url && !preg_match($regex, $parsed['path'])) {
@@ -591,9 +633,10 @@ function follow_url_validate($form) {
  * @return
  *   A string, regular expression used to validate the submitted url.
  */
-function follow_network_regex($network_info) {
-  // An external link.
-  return '@^https?://([a-z0-9\-_.]+\\.|)' . str_replace('.', '\\.', $network_info['domain']) . '/@i';
+function follow_network_regex($network_info, $alternative) {
+  // An external link.  If it's not a built-in network, use $alternative for custom link domain
+  $domain = !empty($network_info['domain']) ? $network_info['domain'] : $alternative;
+  return '@^https?://([a-z0-9\-_.]+\\.|)' . str_replace('.', '\\.', $domain) . '/@i';
 }
 
 /**
@@ -653,6 +696,29 @@ function follow_links_form_submit($form, &$form_state) {
       follow_link_save($link);
     }
   }
+  drupal_set_message(t('Changes saved.'));
+}
+
+/**
+ * Submit handler for the follow_links_form_add.
+ */
+function follow_links_form_add_submit($form, &$form_state) {
+  $validators = array();
+  $dest = file_directory_path();
+  $file = file_save_upload('image', $validators, $dest, FILE_EXISTS_REPLACE);
+  $image = $file->filepath;
+
+  $values = $form_state['values'];
+  $link = $values['follow_links_add'];
+  $link = (object) $link;
+  $link->url = trim($link->url);
+  $link->uid = $values['uid'];
+  $link->image = $image;
+
+  follow_link_save($link);
+  drupal_set_message(t('Your custom network link has been saved to ' . $image . '.'));
+  if ($file == 0)
+    drupal_set_message(t("I can't upload to " . $image . " ."));
 }
 
 /**
@@ -676,6 +742,8 @@ function theme_follow_links_form($form) {
       if (user_access('change follow link titles')) {
         $row[] = drupal_render($form['follow_links'][$key]['title']);
       }
+      // Add an extra box for a custom tooltip
+      $row[] = drupal_render($form['follow_links'][$key]['tooltip']);
 
       // Now, render the weight row.
       $form['follow_links'][$key]['weight']['#attributes']['class'] = 'follow-links-weight';
@@ -693,10 +761,12 @@ function theme_follow_links_form($form) {
   }
 
   // Render a list of header titles, and our array of rows, into a table.
+  // Includes titles for 'Custom Name' and 'Custom Tooltip'
   $header = array(t('Name'), t('URL'));
   if (user_access('change follow link titles')) {
-    $header[] = t('Customized Name');
+    $header[] = t('Custom Name');
   }
+  $header[] = t('Custom Tooltip');
   $header[] = t('Weight');
   $disabled_header = array(t('Name'), t('URL'));
 
@@ -778,6 +848,7 @@ function follow_link_save($link) {
 function follow_link_delete($lid) {
   $sql = 'DELETE FROM {follow_links} WHERE lid = %d';
   db_query($sql, $lid);
+  drupal_set_message(t('Link deleted.'));
 }
 
 /**
@@ -887,4 +958,57 @@ function follow_default_networks($uid) {
     );
   }
   return $networks;
-}
\ No newline at end of file
+}
+
+/** Add link page */
+function follow_links_form_add(&$form_state) {
+  $form = array();
+  $form['follow_links_add'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Add a custom network link'),
+    '#description' => t("If your favorite network isn't in the list, you can add it here."),
+    '#collapsible' => FALSE,
+    '#tree' => TRUE,
+  );
+  $form['follow_links_add']['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#description' => t('Machine-readable name for the system.  No spaces or punctuation, except underscore.'),
+    '#required' => TRUE,
+  );
+  $form['follow_links_add']['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Title'),
+    '#description' => t('This is the "human-readable" name that will show up on your menu.'),
+    '#required' => FALSE,
+  );
+  $form['follow_links_add']['domain'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Domain'),
+    '#description' => t('Enter just the domain, for validation purposes.  Eg. facebook.com'),
+    '#required' => TRUE,
+  );
+  $form['follow_links_add']['url'] = array(
+    '#type' => 'textfield',
+    '#title' => t('URL'),
+    '#description' => t('Actual web address of your public profile page on the social network.  Include the domain.'),
+    '#required' => TRUE,
+  );
+  $form['follow_links_add']['tooltip'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Tooltip'),
+    '#description' => t('Optional: you can add a custom tooltip that will show up when you hover the mouse over the link.'),
+    '#required' => FALSE,
+  );
+  $form['image'] = array(
+    '#type' => 'file', 
+    '#title' => t('Upload icon'), 
+  );
+
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+
+  $form['#redirect'] = 'admin/build/follow';
+  $form['#attributes']['enctype'] = "multipart/form-data";
+
+  return $form;
+}
