Index: guiframe/aboutbox.py
===================================================================
--- guiframe/aboutbox.py	(revision 41d466f6e37304375ace192af8fba17283851239)
+++ guiframe/aboutbox.py	(revision 278cc25c3642a38a5481c81615d2770b48793bcb)
@@ -28,8 +28,13 @@
     import imp
     path = os.getcwd()
-    if(os.path.isfile("%s/%s.py" % (path, 'config'))):
-            fObj, path, descr = imp.find_module('config', [path])
-            config = imp.load_module('config', fObj, path, descr)     
+    if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \
+      (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))):
+            fObj, path, descr = imp.find_module('local_config', [path])
+            config = imp.load_module('local_config', fObj, path, descr)  
+    else:
+        # Try simply importing local_config
+        import local_config as config
 except:
+    # Didn't find local config, load the default 
     import config
 
Index: guiframe/gui_manager.py
===================================================================
--- guiframe/gui_manager.py	(revision adfcab39b2de379200218754f1a1d8d380cce674)
+++ guiframe/gui_manager.py	(revision 278cc25c3642a38a5481c81615d2770b48793bcb)
@@ -15,7 +15,10 @@
     import imp
     path = os.getcwd()
-    if(os.path.isfile("%s/%s.py" % (path, 'config'))):
+    if(os.path.isfile("%s/%s.py" % (path, 'config'))) or \
+      (os.path.isfile("%s/%s.pyc" % (path, 'config'))):
             fObj, path, descr = imp.find_module('config', [path])
-            config = imp.load_module('config', fObj, path, descr)     
+            config = imp.load_module('config', fObj, path, descr)  
+    else:
+        raise RuntimeError, "Look for default config"   
 except:
     # Didn't find local config, load the default 
@@ -39,5 +42,7 @@
         
         path = os.path.dirname(__file__)
-        self.SetIcon(wx.Icon(os.path.join(path,'images/ball.ico'), wx.BITMAP_TYPE_ICO))
+        ico_file = os.path.join(path,'images/ball.ico')
+        if os.path.isfile(ico_file):
+            self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO))
         
         ## Application manager
@@ -58,11 +63,5 @@
         self.defaultPanel    = DefaultPanel(self, -1, style=wx.RAISED_BORDER)
 
-        # Set up the layout
-        self._setup_layout()
-        
-        # Set up the menu
-        self._setup_menus()
-        
-        self.Fit()
+        # self.build_gui()
        
         # Register the close event so it calls our own method
@@ -71,4 +70,13 @@
         self.Bind(EVT_STATUS, self._on_status_event)
              
+    def build_gui(self):
+        # Set up the layout
+        self._setup_layout()
+        
+        # Set up the menu
+        self._setup_menus()
+        
+        self.Fit()
+             
     def _setup_layout(self):
         """
@@ -86,4 +94,18 @@
         
         self._mgr.Update()
+
+    def add_perspective(self, plugin):
+        """
+            Add a perspective if it doesn't already
+            exist.
+        """
+        is_loaded = False
+        for item in self.plugins:
+             if plugin.__class__==item.PLUGIN_ID.__class__:
+                 print "Plugin %s already loaded" % plugin.__class__.__name__
+                 is_loaded = True
+                 
+        if not is_loaded:
+            self.plugins.append(plugin)
       
     def _find_plugins(self, dir="perspectives"):
@@ -96,4 +118,12 @@
         print "Looking for plug-ins in %s" % dir
         # List of plug-in objects
+        
+        #path_exe = os.getcwd()
+        #path_plugs = os.path.join(path_exe, dir)
+        f = open("load.log",'w') 
+        f.write(os.getcwd()+'\n\n')
+        #f.write(str(os.listdir(dir))+'\n')
+        
+        
         plugins = []
         # Go through files in panels directory
@@ -113,6 +143,9 @@
                     try:
                         if toks[1]=='':
+                            f.write("trying to import \n")
                             mod_path = '.'.join([dir, name])
+                            f.write("mod_path= %s\n" % mod_path)
                             module = __import__(mod_path, globals(), locals(), [name])
+                            f.write(str(module)+'\n')
                         else:
                             (file, path, info) = imp.find_module(name, path)
@@ -128,4 +161,5 @@
                     except:
                         print sys.exc_value
+                        f.write(str(sys.exc_value)+'\n')
                     finally:
                         if not file==None:
@@ -134,4 +168,6 @@
             # Should raise and catch at a higher level and display error on status bar
             pass   
+        f.write(str(plugins)+'\n')
+        f.close()
         return plugins
     
@@ -516,5 +552,4 @@
             print "Special?", self.frame.special.__class__.__name__
             self.frame.special.SetCurrent()
-        self.frame.post_init()
         self.SetTopWindow(self.frame)
         return True
@@ -527,4 +562,17 @@
         self.frame.set_manager(manager)
         
+    def build_gui(self):
+        """
+            Build the GUI
+        """
+        self.frame.build_gui()
+        self.frame.post_init()
+        
+    def add_perspective(self, perspective):
+        """
+            Manually add a perspective to the application GUI
+        """
+        self.frame.add_perspective(perspective)
+        
 
 if __name__ == "__main__": 
Index: guiframe/local_perspectives/plotting/plotting.py
===================================================================
--- guiframe/local_perspectives/plotting/plotting.py	(revision 383189f93b8a847747da53572f1ff813438ceb3a)
+++ guiframe/local_perspectives/plotting/plotting.py	(revision 278cc25c3642a38a5481c81615d2770b48793bcb)
@@ -52,4 +52,7 @@
         ## Unique ID (from gui_manager)
         self.uid = None
+        
+        ## Action IDs for internal call-backs
+        self.action_ids = {}
         
         ## Graph        
@@ -83,9 +86,9 @@
         # Check axis labels
         #TODO: Should re-factor this
-        if event.plot._xunit != self.graph.prop["xunit"]:
-            self.graph.xaxis(event.plot._xaxis, event.plot._xunit)
-            
-        if event.plot._yunit != self.graph.prop["yunit"]:
-            self.graph.yaxis(event.plot._yaxis, event.plot._yunit)
+        #if event.plot._xunit != self.graph.prop["xunit"]:
+        self.graph.xaxis(event.plot._xaxis, event.plot._xunit)
+            
+        #if event.plot._yunit != self.graph.prop["yunit"]:
+        self.graph.yaxis(event.plot._yaxis, event.plot._yunit)
       
         self.graph.render(self)
@@ -100,4 +103,12 @@
         slicerpop = PanelMenu()
         slicerpop.set_plots(self.plots)
+                
+        # Option to save the data displayed
+        id = wx.NewId()
+        for plot in self.graph.plottables:
+            name = plot.name
+            slicerpop.Append(id, "&Save %s points" % name)
+            self.action_ids[str(id)] = plot
+            wx.EVT_MENU(self, id, self._onSave)
                 
         # Various plot options
@@ -127,4 +138,53 @@
         pos = self.ScreenToClient(pos)
         self.PopupMenu(slicerpop, pos)
+    
+    def _onSave(self, evt):
+        """
+            Save a data set to a text file
+            @param evt: Menu event
+        """
+        import os
+        id = str(evt.GetId())
+        if id in self.action_ids:         
+            
+            path = None
+            dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.txt", wx.SAVE)
+            if dlg.ShowModal() == wx.ID_OK:
+                path = dlg.GetPath()
+                mypath = os.path.basename(path)
+                print path
+            dlg.Destroy()
+            
+            if not path == None:
+                out = open(path, 'w')
+                has_errors = True
+                if self.action_ids[id].dy==None or self.action_ids[id].dy==[]:
+                    has_errors = False
+                    
+                # Sanity check
+                if has_errors:
+                    try:
+                        if len(self.action_ids[id].y) != len(self.action_ids[id].dy):
+                            print "Y and dY have different lengths"
+                            has_errors = False
+                    except:
+                        has_errors = False
+                
+                if has_errors:
+                    out.write("<X>   <Y>   <dY>\n")
+                else:
+                    out.write("<X>   <Y>\n")
+                    
+                for i in range(len(self.action_ids[id].x)):
+                    if has_errors:
+                        out.write("%g  %g  %g\n" % (self.action_ids[id].x[i], 
+                                                    self.action_ids[id].y[i],
+                                                    self.action_ids[id].dy[i]))
+                    else:
+                        out.write("%g  %g\n" % (self.action_ids[id].x[i], 
+                                                self.action_ids[id].y[i]))
+                        
+                out.close()
+    
     
     def _onToggleScale(self, event):
Index: guiframe/release_notes.txt
===================================================================
--- guiframe/release_notes.txt	(revision fa452e471c6ce4cbed5568fd2e50738be64862c3)
+++ guiframe/release_notes.txt	(revision 278cc25c3642a38a5481c81615d2770b48793bcb)
@@ -23,3 +23,7 @@
 	- Make sure that when a plottable is sent a second time for update, that we replace the lables too!
 	- Add help menu entry for each module	
+	- Put debug info in log file, because we can't access it from a py2exe executable
+	- Allow the application to load perspectives by hand. Then the automatic loading is only
+	  for additionally installed plug-ins.
+	- Fix the damned images directory folder...
 	
