diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index de2d595fb10f9b4fa9c8919374b27b807d46f3a7..1b85f645e87961fe2ad377438fc63d5068879895 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -62,6 +62,7 @@
 #include "llsdutil_math.h"
 #include "lleventapi.h"
 #include "llcorehttputil.h"
+#include "lldir.h"
 
 #if LL_WINDOWS
 #include "lldxhardware.h"
@@ -89,6 +90,7 @@ class LLFloaterAbout
 	static LLSD getInfo();
 	void onClickCopyToClipboard();
 	void onClickUpdateCheck();
+    void setUpdateListener();
 
 private:
 	void setSupportText(const std::string& server_release_notes_url);
@@ -98,6 +100,9 @@ class LLFloaterAbout
 
 	// callback method for manual checks
 	static bool callbackCheckUpdate(LLSD const & event);
+    
+    // listener name for update checks
+    static const std::string sCheckUpdateListenerName;
 	
     static void startFetchServerReleaseNotes();
     static void fetchServerReleaseNotesCoro(const std::string& cap_url);
@@ -131,6 +136,9 @@ BOOL LLFloaterAbout::postBuild()
 
 	getChild<LLUICtrl>("copy_btn")->setCommitCallback(
 		boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
+    
+    getChild<LLUICtrl>("update_btn")->setCommitCallback(
+        boost::bind(&LLFloaterAbout::setUpdateListener, this));
 
 	static const LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor");
 
@@ -326,6 +334,94 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
 							   FALSE, LLStyle::Params() .color(about_color));
 }
 
+//This is bound as a callback in postBuild()
+void LLFloaterAbout::setUpdateListener()
+{
+    typedef std::vector<std::string> vec;
+    
+    //There are four possibilities:
+    //no downloads directory or version directory in "getOSUserAppDir()/downloads"
+    //   => no update
+    //version directory exists and .done file is not present
+    //   => download in progress
+    //version directory exists and .done file exists
+    //   => update ready for install
+    //version directory, .done file and either .skip or .next file exists
+    //   => update deferred
+    BOOL downloads = false;
+    std::string downloadDir = "";
+    BOOL done = false;
+    BOOL next = false;
+    BOOL skip = false;
+    
+    LLSD info(LLFloaterAbout::getInfo());
+    std::string version = info["VIEWER_VERSION_STR"].asString();
+    std::string appDir = gDirUtilp->getOSUserAppDir();
+    
+    //drop down two directory levels so we aren't searching for markers among the log files and crash dumps
+    //or among other possible viewer upgrade directories if the resident is running multiple viewer versions
+    //we should end up with a path like ../downloads/1.2.3.456789
+    vec file_vec = gDirUtilp->getFilesInDir(appDir);
+    
+    for(vec::const_iterator iter=file_vec.begin(); iter!=file_vec.end(); ++iter)
+    {
+        if ( (iter->rfind("downloads") ) )
+        {
+            vec dir_vec = gDirUtilp->getFilesInDir(*iter);
+            for(vec::const_iterator dir_iter=dir_vec.begin(); dir_iter!=dir_vec.end(); ++dir_iter)
+            {
+                if ( (dir_iter->rfind(version)))
+                {
+                    downloads = true;
+                    downloadDir = *dir_iter;
+                }
+            }
+        }
+    }
+    
+    if ( downloads )
+    {
+        for(vec::const_iterator iter=file_vec.begin(); iter!=file_vec.end(); ++iter)
+        {
+            if ( (iter->rfind(version)))
+            {
+                if ( (iter->rfind(".done") ) )
+                {
+                    done = true;
+                }
+                else if ( (iter->rfind(".next") ) )
+                {
+                    next = true;
+                }
+                else if ( (iter->rfind(".skip") ) )
+                {
+                    skip = true;
+                }
+            }
+        }
+    }
+    
+    if ( ! downloads)
+    {
+        LLNotificationsUtil::add("UpdateViewerUpToDate");
+    }
+    else
+    {
+        if ( ! done )
+        {
+            LLNotificationsUtil::add("UpdateDownloadInProgress");
+        }
+        else if ( !next and !skip )
+        {
+            LLNotificationsUtil::add("UpdateDownloadComplete");
+        }
+        else //done and there is a next or skip
+        {
+            LLNotificationsUtil::add("UpdateDeferred");
+        }
+    }
+}
+
 ///----------------------------------------------------------------------------
 /// LLFloaterAboutUtil
 ///----------------------------------------------------------------------------
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index c4190a49407a61785637f1c800cf63d040aa2367..2a320c84fbaa894a00533e88b5cbde17c76fc226 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4029,10 +4029,9 @@ An update was downloaded. It will be installed during restart.
 
   <notification
  icon="alertmodal.tga"
- name="UpdateCheckError"
+ name="UpdateDeferred"
  type="alertmodal">
-An error occurred while checking for update.
-Please try again later.
+An update was downloaded that you previously chose to skip or defer to the next start up.
     <tag>confirm</tag>
     <usetemplate
      name="okbutton"