diff --git a/apps.manifest.inc b/apps.manifest.inc
index e82e1fe..b4b8826 100755
--- a/apps.manifest.inc
+++ b/apps.manifest.inc
@@ -9,7 +9,8 @@ define("APPS_ENABLED", 1);
 define("APPS_DISABLED", 0);
 define("APPS_INCOMPATIBLE", -1);
 define("APPS_INSTALLABLE", 2);
-
+define("APPS_INSTALLABLE", 2);
+define("APPS_UPGRADEABLE", 3);
 
 function apps_server_local($server) {
   $apps = array();
@@ -313,6 +314,7 @@ function apps_manifest($server) {
       $app['incompatable'] = FALSE;
       $app['installed'] = (bool) $current_app_module;
       $app['dep_installed'] = TRUE;
+      $app['upgradeable'] = $app['installed'] && isset($current_app_module->info['version']) && version_compare($current_app_module->info['version'], $app['version'], 'lt');
       $app['disabled'] = $current_app_module && empty($current_app_module->status) && $current_app_module->schema_version > SCHEMA_UNINSTALLED;
       $app['featured'] = ($app['machine_name'] == $manifest['featured app']);
       $app['server'] = $server;
@@ -329,6 +331,7 @@ function apps_manifest($server) {
         $incompatable = $current ? (bool) drupal_check_incompatibility($version, $current->info['version']) : FALSE;
         $installed = (bool) $current;
         $enabled = $current && $current->status;
+
         $status = $incompatable ? APPS_INCOMPATIBLE : (!$installed ? APPS_INSTALLABLE : ($enabled ? APPS_ENABLED : APPS_DISABLED));
 
         if($status == APPS_INCOMPATIBLE) {
@@ -364,7 +367,22 @@ function apps_manifest($server) {
           $app['libraries'][$name_version] = $info;
         }
       }
-      $app['status'] = $app['incompatable'] ? APPS_INCOMPATIBLE : (!$app['installed'] || !$app['dep_installed'] ? APPS_INSTALLABLE : ($app['enabled'] ? APPS_ENABLED : APPS_DISABLED));
+
+      if ($app['incompatable']) {
+        $app['status'] = APPS_INCOMPATIBLE;
+      }
+      elseif (!$app['installed'] || !$app['dep_installed']) {
+        $app['status'] = APPS_INSTALLABLE;
+      }
+      elseif ($app['upgradeable']) {
+        $app['status'] = APPS_UPGRADEABLE;
+      }
+      elseif ($app['enabled']) {
+        $app['status'] = APPS_ENABLED;
+      }
+      else {
+        $app['status'] = APPS_DISABLED;
+      }
       $apps[$app['machine_name']] = $app;
       
     }
diff --git a/apps.pages.inc b/apps.pages.inc
index a1a4021..c14feb1 100755
--- a/apps.pages.inc
+++ b/apps.pages.inc
@@ -46,12 +46,19 @@ function apps_manage_page($server_name) {
  * callback for listing of installed apps
  */
 function apps_update_page($server_name) { 
-  apps_include('manifest'); 
-  // find all updateable apps (NOTE: currently this never retruns anything
-  //$apps = apps_apps($server_name, array("updateable" =>TRUE), TRUE);
-  return array(
+  apps_include('manifest');
+  $element = array(
     '#theme'=> 'apps_update_page',
   );
+  // find all installed apps
+  try {
+    $apps = apps_apps($server_name, array("upgradeable" =>TRUE), TRUE);
+    $element['apps'] = $apps;
+  }
+  catch (Exception $e) {
+    drupal_set_message("There was the following error - " . $e->getMessage(), 'warning');
+  }
+  return $element;
 }
 
 /**
@@ -145,6 +152,8 @@ function _apps_app_access($perm, $server_name, $action, $app_name) {
         return ($app['status'] === APPS_ENABLED);
       case 'install':
         return ($app['status'] === APPS_INSTALLABLE);
+      case 'upgrade':
+        return ($app['status'] === APPS_UPGRADEABLE);
       case 'configure-action':
       case 'configure': 
         return (bool) apps_app_callback($app, "configure form") || apps_app_callback($app, "demo content enabled callback");
@@ -269,6 +278,10 @@ function apps_app_uninstall($server_name, $app_name) {
   drupal_goto($next);
 }
 
+function apps_app_upgrade() {
+  return t('Coming Soon');
+}
+
 /**
  * Callback for app configure page
  */
diff --git a/apps.register.inc b/apps.register.inc
index 51c9284..a12ded0 100755
--- a/apps.register.inc
+++ b/apps.register.inc
@@ -64,6 +64,13 @@ function _apps_menu() {
       'access arguments' => array('pages', '_apps_app_access', 'administer apps', $server['name'], 'install', APPSERVER_BASEPATH_DEPTH + 3),
       'type'=> MENU_LOCAL_ACTION,
     ) + $app_common;
+    $menu["$APPSERVER_BASEPATH/{$server['name']}/app/%/upgrade"] = array(
+      'title' => "Upgrade App",
+      'page callback' => 'apps_app_upgrade',
+      'page arguments' => array($server['name'], APPSERVER_BASEPATH_DEPTH + 3),
+      'access arguments' => array('pages', '_apps_app_access', 'administer apps', $server['name'], 'upgrade', APPSERVER_BASEPATH_DEPTH + 3),
+      'type'=> MENU_LOCAL_ACTION,
+    ) + $app_common;
     $menu["$APPSERVER_BASEPATH/{$server['name']}/app/%/disable"] = array(
       'title' => "Disable App",
       'page callback' => 'apps_app_disable',
diff --git a/theme/apps-update-page.tpl.php b/theme/apps-update-page.tpl.php
index 87dffc6..f3e2d7b 100755
--- a/theme/apps-update-page.tpl.php
+++ b/theme/apps-update-page.tpl.php
@@ -1,4 +1,5 @@
-<div id="app-wrapper">
-  <h2>Currently Under Development</h2>
-</div>
-
+<?php if (isset($content['apps'])) : ?>
+  <div id="apps-list">
+    <?php print drupal_render($content['apps']) ?>
+  </div>
+<?php endif; ?>
\ No newline at end of file
diff --git a/theme/apps.theme.inc b/theme/apps.theme.inc
index 30daca9..153fde0 100755
--- a/theme/apps.theme.inc
+++ b/theme/apps.theme.inc
@@ -36,7 +36,9 @@ function apps_preprocess_apps_app_teaser(&$vars) {
       'disabled' :
       (($status === APPS_INCOMPATIBLE) ?
         'incompatible' :
-        'available'
+        (($status === APPS_UPGRADEABLE)) ?
+          'upgradeable' :
+          'available'
       )
     );
   
