diff --git a/docroot/sites/all/modules/upgrade_status/upgrade_status.compare.inc b/docroot/sites/all/modules/upgrade_status/upgrade_status.compare.inc
index a9b17f9..cbd2b62 100644
--- a/docroot/sites/all/modules/upgrade_status/upgrade_status.compare.inc
+++ b/docroot/sites/all/modules/upgrade_status/upgrade_status.compare.inc
@@ -94,7 +94,20 @@ function upgrade_status_calculate_project_data($available) {
     return $projects->data;
   }
   $projects = update_get_projects();
+
+  // US: Special handling for obsolete projects.
+  foreach ($projects as $key => $project) {
+    if (upgrade_status_obsolete($projects, $key)) {
+      // Add the project that makes this one obsolete to the list of those to
+      // grab information about.
+      foreach ($projects[$key]['replaced_by'] as $replacement) {
+        $projects[$replacement['name']] = $available[$replacement['name']];
+      }
+    }
+  }
+
   update_process_project_info($projects);
+
   $settings = variable_get('upgrade_status_settings', array());
   foreach ($projects as $project => $project_info) {
     if (isset($available[$project])) {
@@ -188,6 +201,7 @@ function upgrade_status_calculate_project_data($available) {
 #        $projects[$project]['reason'] = t('No available releases found');
 #        continue;
 #      }
+
       foreach ($available[$project]['releases'] as $version => $release) {
         // US: insecure, unpublished, revoked, unsupported have no meaning.
 
@@ -302,6 +316,12 @@ function upgrade_status_calculate_project_data($available) {
       $projects[$project]['status'] = UPGRADE_STATUS_CORE;
       $projects[$project]['reason'] = t('In core');
     }
+    // US: Check if the project is obsolete.
+    elseif (upgrade_status_obsolete($projects, $project)) {
+      $projects[$project]['status'] = UPGRADE_STATUS_OBSOLETE;
+      $projects[$project]['reason'] = t('Made obsolete by');
+    }
+    // US: No release for target version found.
     else {
       $projects[$project]['status'] = UPDATE_UNKNOWN;
       $projects[$project]['reason'] = t('No available releases found');
@@ -675,3 +695,41 @@ function upgrade_status_moved_into_core(&$projects, $project) {
   return $core;
 }
 
+/**
+ * Return status and notice about modules that have been made obsolete.
+ *
+ * Assign custom upgrade information for certain modules.
+ *
+ * @param $projects
+ *   Array of projects from upgrade_status_calculate_project_data().
+ * @param $project
+ *   Project name to check.
+ * @return
+ *   TRUE if module has been made obsolete by an alternative.
+ */
+function upgrade_status_obsolete(&$projects, $project) {
+  $obsolete = TRUE;
+
+  switch ($project) {
+    case 'content_profile':
+      $projects[$project]['obsolete_since'] = '7.x';
+      $projects[$project]['replaced_by'][0]['name'] = 'profile2';
+      break;
+
+    case 'fckeditor':
+      $projects[$project]['obsolete_since'] = '5.x';
+      $projects[$project]['replaced_by'][0]['name'] = 'ckeditor';
+      break;
+
+    case 'nodewords':
+      $projects[$project]['obsolete_since'] = '7.x';
+      $projects[$project]['replaced_by'][0]['name'] = 'metatags';
+      $projects[$project]['replaced_by'][1]['name'] = 'metatags_quick';
+      break;
+
+    default:
+      $obsolete = FALSE;
+  }
+
+  return $obsolete;
+}
diff --git a/docroot/sites/all/modules/upgrade_status/upgrade_status.fetch.inc b/docroot/sites/all/modules/upgrade_status/upgrade_status.fetch.inc
index 6625ef8..aa9af10 100644
--- a/docroot/sites/all/modules/upgrade_status/upgrade_status.fetch.inc
+++ b/docroot/sites/all/modules/upgrade_status/upgrade_status.fetch.inc
@@ -49,9 +49,24 @@ function _upgrade_status_refresh() {
 
   $available = array();
   $data = array();
+
 #  $site_key = md5($base_url . drupal_get_private_key());
   $projects = update_get_projects();
 
+  // US: Special handling for obsolete projects.
+  // Add replacement modules to the list of projects to get XML data for.
+  foreach ($projects as $key => $project) {
+    if (upgrade_status_obsolete($projects, $key)) {
+      // Add the project that makes this one obsolete to the list of those to
+      // grab information about.
+      foreach ($projects[$key]['replaced_by'] as $replacement) {
+        $projects[$replacement['name']] = array(
+          'name' => $replacement['name'],
+        );
+      }
+    }
+  }
+
   $version = variable_get('upgrade_status_core_version', UPGRADE_STATUS_CORE_VERSION);
 
   // Now that we have the list of projects, we should also clear our cache of
@@ -59,7 +74,7 @@ function _upgrade_status_refresh() {
   // to clear out the stale data at this point.
   _update_cache_clear('upgrade_status_available_releases');
   $max_fetch_attempts = variable_get('update_max_fetch_attempts', UPDATE_MAX_FETCH_ATTEMPTS);
-  
+
   foreach ($projects as $key => $project) {
     // US: No site key to avoid hi-jacking module usage statistics.
     $url = _upgrade_status_build_fetch_url($project, $version);
@@ -124,4 +139,3 @@ function _upgrade_status_build_fetch_url($project, $version) {
   $url .= '/'. $name .'/'. $version;
   return $url;
 }
-
diff --git a/docroot/sites/all/modules/upgrade_status/upgrade_status.module b/docroot/sites/all/modules/upgrade_status/upgrade_status.module
index 6de0336..b432c97 100644
--- a/docroot/sites/all/modules/upgrade_status/upgrade_status.module
+++ b/docroot/sites/all/modules/upgrade_status/upgrade_status.module
@@ -27,6 +27,11 @@ define('UPGRADE_STATUS_STABLE', 5);
 define('UPGRADE_STATUS_CORE', 5000);
 
 /**
+ * Project has become obsolete by an alternative.
+ */
+define('UPGRADE_STATUS_OBSOLETE', 3000);
+
+/**
  * Implementation of hook_help().
  */
 function upgrade_status_help($path, $arg) {
@@ -116,4 +121,3 @@ function upgrade_status_refresh() {
   module_load_include('inc', 'upgrade_status', 'upgrade_status.fetch');
   return _upgrade_status_refresh();
 }
-
diff --git a/docroot/sites/all/modules/upgrade_status/upgrade_status.report.inc b/docroot/sites/all/modules/upgrade_status/upgrade_status.report.inc
index 2478c9e..8c429f3 100644
--- a/docroot/sites/all/modules/upgrade_status/upgrade_status.report.inc
+++ b/docroot/sites/all/modules/upgrade_status/upgrade_status.report.inc
@@ -60,10 +60,14 @@ function theme_upgrade_status_report($data) {
     if ($project['name'] == 'upgrade_status') {
       continue;
     }
+    
     switch ($project['status']) {
       case UPDATE_CURRENT:
       case UPGRADE_STATUS_STABLE:
       case UPGRADE_STATUS_CORE:
+      // @todo: Colour obsolete modules according to their replacement project
+      // info in $data.
+      case UPGRADE_STATUS_OBSOLETE:
         $class = 'ok';
         $icon = theme('image', 'misc/watchdog-ok.png', t('ok'), t('ok'));
         break;
@@ -122,6 +126,9 @@ function theme_upgrade_status_report($data) {
       case UPGRADE_STATUS_STABLE:
         $row .= '<span class="current">'. t('Available') .'</span>';
         break;
+      case UPGRADE_STATUS_OBSOLETE:
+        $row .= '<span class="current">'. t('Made obsolete') .'</span>';
+        break;
       case UPGRADE_STATUS_CORE:
         $row .= '<span class="current">'. t('In core') .'</span>';
         break;
@@ -244,10 +251,23 @@ function theme_upgrade_status_report($data) {
       $row .= "</div>\n";  // extra div.
     }
 
-    $row .= '<div class="includes">';
-    sort($project['includes']);
-    $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes'])));
-    $row .= "</div>\n";
+    if (isset($project['includes'])) {
+      $row .= '<div class="includes">';
+      sort($project['includes']);
+      $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes'])));
+      $row .= "</div>\n";
+    }
+
+    if (isset($project['replaced_by'])) {
+      $row .= '<div class="includes">';
+      $replacements = array();
+      foreach ($project['replaced_by'] as $replacement) {
+        $replacements[] = t('!name @version', array('!name' => l($data[$replacement['name']]['title'], $data[$replacement['name']]['link']), '@version' => $data[$replacement['name']]['recommended']));
+      }
+      $replaced = implode(', ', $replacements);
+      $row .= t('Replaced by: !replaced', array('!replaced' => $replaced));
+      $row .= "</div>\n";
+    }
 
     if (!empty($project['base_themes'])) {
       $row .= '<div class="basethemes">';
@@ -369,4 +389,3 @@ function upgrade_status_core_version_form_submit($form, &$form_state) {
     variable_del('upgrade_status_core_version');
   }
 }
-
