Index: src/sas/qtgui/GuiManager.py
===================================================================
--- src/sas/qtgui/GuiManager.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
+++ src/sas/qtgui/GuiManager.py	(revision 9e426c11367c4fe13f88ce18932880794884e04f)
@@ -1,3 +1,7 @@
 import sys
+import subprocess
+import logging
+import json
+import webbrowser
 
 from PyQt4 import QtCore
@@ -9,6 +13,9 @@
 # General SAS imports
 from sas.sasgui.guiframe.data_manager import DataManager
+from sas.sasgui.guiframe.proxy import Connection
+
 import LocalConfig
 from GuiUtils import *
+from UI.AcknowledgementsUI import Acknowledgements
 
 # Perspectives
@@ -21,4 +28,6 @@
     Main SasView window functionality
     """
+    HELP_DIRECTORY_LOCATION="html"
+
     def __init__(self, mainWindow=None, reactor=None, parent=None):
         """
@@ -56,5 +65,9 @@
         self.dockedFilesWidget.setWidget(self.filesWidget)
         self._workspace.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockedFilesWidget)
+
+        self.ackWidget = Acknowledgements()
+
         # Disable the close button (?)
+
         # Show the Welcome panel
         self.welcomePanel = WelcomePanel()
@@ -63,5 +76,11 @@
         # Current help file
         self._helpView = QtWebKit.QWebView()
-        self._helpLocation = "html/index.html"
+        # Needs URL like path, so no path.join() here
+        self._helpLocation = self.HELP_DIRECTORY_LOCATION + "/index.html"
+
+        # Current tutorial location
+        self._tutorialLocation = os.path.join(self.HELP_DIRECTORY_LOCATION,
+                                              "_downloads",
+                                              "Tutorial.pdf")
 
         #==========================================================
@@ -77,5 +96,4 @@
         """
         """
-        print("FILE %s "%data)
         pass
     
@@ -161,6 +179,91 @@
             logging.info(msg)
 
+    def quitApplication(self):
+        """
+        Close the reactor and exit nicely.
+        """
+        # Display confirmation messagebox
+        quit_msg = "Are you sure you want to exit the application?"
+        reply = QtGui.QMessageBox.question(
+                        self._parent,
+                        'Warning',
+                        quit_msg,
+                        QtGui.QMessageBox.Yes,
+                        QtGui.QMessageBox.No)
+
+        if reply == QtGui.QMessageBox.No:
+            return
+
+        # Exit if yes
+        reactor.callFromThread(reactor.stop)
+        reactor.stop
+        sys.exit()
+
+    def checkUpdate(self):
+        """
+        Check with the deployment server whether a new version
+        of the application is available.
+        A thread is started for the connecting with the server. The thread calls
+        a call-back method when the current version number has been obtained.
+        """
+        version_info = {"version": "0.0.0"}
+        c = Connection(LocalConfig.__update_URL__, LocalConfig.UPDATE_TIMEOUT)
+        response = c.connect()
+        if response is not None:
+            try:
+                content = response.read().strip()
+                logging.info("Connected to www.sasview.org. Latest version: %s"
+                             % (content))
+                version_info = json.loads(content)
+            except:
+                logging.info("Failed to connect to www.sasview.org")
+        self.processVersion(version_info)  
+  
+    def processVersion(self, version_info, standalone=False):
+        """
+        Call-back method for the process of checking for updates.
+        This methods is called by a VersionThread object once the current
+        version number has been obtained. If the check is being done in the
+        background, the user will not be notified unless there's an update.
+
+        :param version: version string
+        :param standalone: True of the update is being checked in
+           the background, False otherwise.
+
+        """
+        try:
+            version = version_info["version"]
+            if version == "0.0.0":
+                msg = "Could not connect to the application server."
+                msg += " Please try again later."
+                #self.SetStatusText(msg)
+                self.communicate.statusBarUpdateSignal.emit(msg)
+
+            elif cmp(version, LocalConfig.__version__) > 0:
+                msg = "Version %s is available! " % str(version)
+                if not standalone:
+                    if "download_url" in version_info:
+                        webbrowser.open(version_info["download_url"])
+                    else:
+                        webbrowser.open(LocalConfig.__download_page__)
+                else:
+                    msg += "See the help menu to download it."
+                self.communicate.statusBarUpdateSignal.emit(msg)
+            else:
+                msg = "You have the latest version"
+                msg += " of %s" % str(LocalConfig.__appname__)
+                self.communicate.statusBarUpdateSignal.emit(msg)
+        except:
+            msg = "guiframe: could not get latest application"
+            msg += " version number\n  %s" % sys.exc_value
+            logging.error(msg)
+            if not standalone:
+                msg = "Could not connect to the application server."
+                msg += " Please try again later."
+                self.communicate.statusBarUpdateSignal.emit(msg)
+
     def addCallbacks(self):
         """
+        Method defining all signal connections for the gui manager
         """
         self.communicate = Communicate()
@@ -234,5 +337,5 @@
     def actionLoadData(self):
         """
-        Load file from Data Explorer
+        Menu File/Load Data File(s)
         """
         self.filesWidget.loadFile()
@@ -240,4 +343,5 @@
     def actionLoad_Data_Folder(self):
         """
+        Menu File/Load Data Folder
         """
         self.filesWidget.loadFolder()
@@ -272,15 +376,5 @@
         Close the reactor, exit the application.
         """
-        # display messagebox
-        quit_msg = "Are you sure you want to exit the application?"
-        reply = QtGui.QMessageBox.question(self._parent, 'Warning', quit_msg,
-                QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
-
-        if reply == QtGui.QMessageBox.No:
-            return
-
-        # exit if yes
-        reactor.callFromThread(reactor.stop)
-        sys.exit()
+        self.quitApplication()
 
     #============ EDIT =================
@@ -509,4 +603,7 @@
     def actionDocumentation(self):
         """
+        Display the documentation
+
+        TODO: use QNetworkAccessManager to assure _helpLocation is valid
         """
         self._helpView.load(QtCore.QUrl(self._helpLocation))
@@ -515,17 +612,22 @@
     def actionTutorial(self):
         """
-        """
-        print("actionTutorial TRIGGERED")
-        pass
+        Open the tutorial PDF file with default PDF renderer
+        """
+        # Not terribly safe here. Shell injection warning.
+        # isfile() helps but this probably needs a better solution.
+        if os.path.isfile(self._tutorialLocation):
+            result = subprocess.Popen([self._tutorialLocation], shell=True)
 
     def actionAcknowledge(self):
         """
-        """
-        print("actionAcknowledge TRIGGERED")
-        pass
+        Open the Acknowledgements widget
+        """
+        self.ackWidget.show()
 
     def actionAbout(self):
         """
-        """
+        Open the About box
+        """
+        
         print("actionAbout TRIGGERED")
         pass
@@ -533,6 +635,8 @@
     def actionCheck_for_update(self):
         """
-        """
-        print("actionCheck_for_update TRIGGERED")
-        pass
-
+        Menu Help/Check for Update
+        """
+        self.checkUpdate()
+
+        pass
+
