Index: src/sas/plottools/PlotPanel.py
===================================================================
--- src/sas/plottools/PlotPanel.py	(revision 098f3d277d54e6ae4bae35ed0188be84b67fb171)
+++ src/sas/plottools/PlotPanel.py	(revision d3d67f06423dc337fd087c81b7cbd502dc7e1084)
@@ -22,5 +22,4 @@
 
 from plottables import Graph
-from plottables import Text
 from TextDialog import TextDialog
 from LabelDialog import LabelDialog
@@ -33,5 +32,6 @@
 import numpy
 
-from sas.guiframe.events import StatusEvent
+from ..guiframe.events import StatusEvent
+from .toolbar import NavigationToolBar, PlotPrintout, bind
 
 def show_tree(obj, d=0):
@@ -89,18 +89,4 @@
             lo, hi = math.pow(10., lo), math.pow(10., hi)
     return (lo, hi)
-
-
-def CopyImage(canvas):
-    """
-    0: matplotlib plot
-    1: wx.lib.plot
-    2: other
-    """
-    bmp = wx.BitmapDataObject()
-    bmp.SetBitmap(canvas.bitmap)
-
-    wx.TheClipboard.Open()
-    wx.TheClipboard.SetData(bmp)
-    wx.TheClipboard.Close()
 
 
@@ -334,6 +320,7 @@
         """
         self.enable_toolbar = True
-        from toolbar import NavigationToolBar
         self.toolbar = NavigationToolBar(parent=self, canvas=self.canvas)
+        bind(self.toolbar, wx.EVT_TOOL, self.onResetGraph, id=self.toolbar._NTB2_RESET)
+        bind(self.toolbar, wx.EVT_TOOL, self.onContextMenu, id=self.toolbar._NTB2_HOME)
         self.toolbar.Realize()
         ## The 'SetToolBar()' is not working on MAC: JHC
@@ -1966,4 +1953,7 @@
         self.toolbar.update()
 
+    def onPrint(self, event=None):
+        self.toolbar.print_figure(event)
+
     def onPrinterSetup(self, event=None):
         """
@@ -1988,6 +1978,6 @@
 
             #now create the printpeview object
-            _preview = wx.PrintPreview(PlotPrintout(self,'test'),
-                                       PlotPrintout(self,'test'))
+            _preview = wx.PrintPreview(PlotPrintout(self.canvas),
+                                       PlotPrintout(self.canvas))
             #and tie it to a printpreview frame then show it
             _frame = wx.PreviewFrame(_preview, _plot, "Print Preview", wx.Point(100, 100), wx.Size(600, 650))
@@ -1999,22 +1989,10 @@
             pass
 
-    def onPrint(self, event=None):
-        """
-        Matplotlib canvas can no longer print itself so using wx.Printer.  
-        Need therefore to also define a Printout object.
+    def OnCopyFigureMenu(self, evt):
+        """
+        Copy the current figure to clipboard
         """
         try:
-            _printer = wx.Printer()
-            _printer.Print(self.canvas, PlotPrintout(self,'test'), True)
-        except:
-            traceback.print_exc()
-            pass
-
-    def OnCopyFigureMenu(self, evt):
-        """
-        Copy the current figure to clipboard
-        """
-        try:
-            CopyImage(self.canvas)
+            self.toolbar.copy_figure()
         except:
             print "Error in copy Image"
@@ -2046,36 +2024,2 @@
             self._drawn += 1
         self.gui_repaint(drawDC=wx.PaintDC(self))
-
-class PlotPrintout(wx.Printout):
-    """
-    Create the wx.Printout object for matplotlib figure from the PlotPanel.
-    Provides the required OnPrintPage and HasPage overrides.  Other methods
-    may be added/overriden in the future.
-    :TODO: this needs LOTS of TLC .. but fixes immediate problem
-    """
-    def __init__(self, figure, title, size=None, dpi=None, **kwargs):
-        """
-        Initialize wx.Printout and get passed figure object
-        """
-        wx.Printout.__init__(self)
-        self.figure = figure
-
-    def OnPrintPage(self, page):
-        """
-        Most rudimentry OnPrintPage overide.  instatiates a dc object, gets
-        its size, gets the size of the figure object, scales it to the dc
-        canvas size keeping the aspect ratio intact, then prints as bitmap
-        """
-        _dc = self.GetDC()
-        (_dcX, _dcY) = _dc.GetSizeTuple()
-        (_bmpX,_bmpY) = self.figure.canvas.GetSize()
-        _scale = min(_dcX/_bmpX, _dcY/_bmpY)
-        _dc.SetUserScale(_scale, _scale)
-        _dc.DrawBitmap(self.figure.canvas.bitmap, 0, 0, False,)
-        return True
-
-    def GetPageInfo(self):
-        """
-        just sets the page to 1 - no flexibility for now
-        """
-        return (1, 1, 1, 1)
Index: src/sas/plottools/config.py
===================================================================
--- src/sas/plottools/config.py	(revision 794922220f2fb3b23dd08c648aabf87b4850596c)
+++ src/sas/plottools/config.py	(revision d3d67f06423dc337fd087c81b7cbd502dc7e1084)
@@ -58,2 +58,10 @@
 matplotlib.rcParams[param] = 0.05
 matplotlib.rcParams['legend.numpoints'] = 1
+
+# this should happen after initial matplotlib configuration
+from .toolbar import NavigationToolBar
+from matplotlib.backends import backend_wxagg
+backend_wxagg.NavigationToolbar2WxAgg = NavigationToolBar
+
+# CRUFT: bumps 0.7.5.6 and older uses wrong toolbar
+backend_wxagg.NavigationToolbar2Wx = NavigationToolBar
Index: src/sas/plottools/toolbar.py
===================================================================
--- src/sas/plottools/toolbar.py	(revision 1170492a6ae9898b8c1ee6716645dfea0394f8a5)
+++ src/sas/plottools/toolbar.py	(revision d3d67f06423dc337fd087c81b7cbd502dc7e1084)
@@ -31,12 +31,12 @@
     def _init_toolbar(self):
         self._parent = self.canvas.GetParent()
-        _NTB2_HOME = wx.NewId()
+        self._NTB2_HOME = wx.NewId()
         self._NTB2_BACK = wx.NewId()
         self._NTB2_FORWARD = wx.NewId()
         self._NTB2_PAN = wx.NewId()
         self._NTB2_ZOOM = wx.NewId()
-        _NTB2_SAVE = wx.NewId()
-        _NTB2_PRINT = wx.NewId()
-        _NTB2_RESET = wx.NewId()
+        self._NTB2_SAVE = wx.NewId()
+        self._NTB2_PRINT = wx.NewId()
+        self._NTB2_RESET = wx.NewId()
 
         # for mpl 1.2+ compatibility
@@ -53,5 +53,5 @@
         context_tip += '    right-click the data symbols.'
         context = wx.ArtProvider.GetBitmap(wx.ART_LIST_VIEW, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_HOME, context, context_tip, context_tip)
+        self.AddSimpleTool(self._NTB2_HOME, context, context_tip, context_tip)
 
         self.InsertSeparator(1)
@@ -69,28 +69,25 @@
 
         self.AddSeparator()
-        self.AddSimpleTool(_NTB2_SAVE, _load_bitmap('filesave.png'),
+        self.AddSimpleTool(self._NTB2_SAVE, _load_bitmap('filesave.png'),
                            'Save', 'Save plot contents to file')
 
         print_bmp = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_PRINT, print_bmp, 'Print', 'Print plot')
+        self.AddSimpleTool(self._NTB2_PRINT, print_bmp, 'Print', 'Print plot')
 
         reset_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range')
+        self.AddSimpleTool(self._NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range')
 
-        bind(self, wx.EVT_TOOL, self.on_menu, id=_NTB2_HOME)
+        bind(self, wx.EVT_TOOL, self.context_menu, id=self._NTB2_HOME)
         bind(self, wx.EVT_TOOL, self.forward, id=self._NTB2_FORWARD)
         bind(self, wx.EVT_TOOL, self.back, id=self._NTB2_BACK)
         bind(self, wx.EVT_TOOL, self.zoom, id=self._NTB2_ZOOM)
         bind(self, wx.EVT_TOOL, self.pan, id=self._NTB2_PAN)
-        bind(self, wx.EVT_TOOL, self.save_figure, id=_NTB2_SAVE)
-        bind(self, wx.EVT_TOOL, self.on_print, id=_NTB2_PRINT)
-        bind(self, wx.EVT_TOOL, self.on_reset, id=_NTB2_RESET)
+        bind(self, wx.EVT_TOOL, self.save_figure, id=self._NTB2_SAVE)
+        bind(self, wx.EVT_TOOL, self.print_figure, id=self._NTB2_PRINT)
+        bind(self, wx.EVT_TOOL, self.home, id=self._NTB2_RESET)
 
         self.Realize()
 
     def on_menu(self, event):
-        """
-            Plot menu
-        """
         try:
             self._parent.onToolContextMenu(event=event)
@@ -98,19 +95,80 @@
             logging.error("Plot toolbar could not show menu")
 
-    def on_reset(self, event):
+    def context_menu(self, event):
         """
-            Reset plot
+        Default context menu for a plot panel
+
         """
+        # Slicer plot popup menu
+        wx_id = wx.NewId()
+        popup = wx.Menu()
+        popup.Append(wx_id, '&Save image', 'Save image as PNG')
+        wx.EVT_MENU(self, wx_id, self.save_figure)
+
+        wx_id = wx.NewId()
+        popup.Append(wx_id, '&Print image', 'Print image ')
+        wx.EVT_MENU(self, wx_id, self.print_figure)
+
+        wx_id = wx.NewId()
+        popup.Append(wx_id, '&Copy to Clipboard', 'Copy image to the clipboard')
+        wx.EVT_MENU(self, wx_id, self.copy_figure)
+
+        # Show the popup menu relative to the location of the toolbar
+        self.PopupMenu(popup, (0,0))
+
+
+    def print_figure(self, event):
         try:
-            self._parent.onResetGraph(event=event)
+            _printer = wx.Printer()
+            _printer.Print(self.canvas, PlotPrintout(self.canvas), True)
         except:
-            logging.error("Plot toolbar could not reset plot")
+            import traceback
+            logging.error(traceback.format_exc())
 
-    def on_print(self, event):
+    def copy_figure(self, event):
+        copy_image_to_clipboard(self.canvas)
+
+class PlotPrintout(wx.Printout):
+    """
+    Create the wx.Printout object for matplotlib figure from the PlotPanel.
+    Provides the required OnPrintPage and HasPage overrides.  Other methods
+    may be added/overriden in the future.
+    :TODO: this needs LOTS of TLC .. but fixes immediate problem
+    """
+    def __init__(self, canvas):
         """
-            Print
+        Initialize wx.Printout and get passed figure object
         """
-        try:
-            self._parent.onPrint(event=event)
-        except:
-            logging.error("Plot toolbar could not print")
+        wx.Printout.__init__(self)
+        self.canvas = canvas
+
+    def OnPrintPage(self, page):
+        """
+        Most rudimentry OnPrintPage overide.  instatiates a dc object, gets
+        its size, gets the size of the figure object, scales it to the dc
+        canvas size keeping the aspect ratio intact, then prints as bitmap
+        """
+        _dc = self.GetDC()
+        (_dcX, _dcY) = _dc.GetSizeTuple()
+        (_bmpX,_bmpY) = self.canvas.GetSize()
+        _scale = min(_dcX/_bmpX, _dcY/_bmpY)
+        _dc.SetUserScale(_scale, _scale)
+        _dc.DrawBitmap(self.canvas.bitmap, 0, 0, False,)
+        return True
+
+    def GetPageInfo(self):
+        """
+        just sets the page to 1 - no flexibility for now
+        """
+        return (1, 1, 1, 1)
+
+
+def copy_image_to_clipboard(canvas):
+    bmp = wx.BitmapDataObject()
+    bmp.SetBitmap(canvas.bitmap)
+
+    wx.TheClipboard.Open()
+    wx.TheClipboard.SetData(bmp)
+    wx.TheClipboard.Close()
+
+
