Index: src/sas/qtgui/Plotter.py
===================================================================
--- src/sas/qtgui/Plotter.py	(revision 3b7b21819920f53359a9aa32d2375d265b2fd88d)
+++ src/sas/qtgui/Plotter.py	(revision c4e54008b22a99cb838269a4dfa2d88e1259f308)
@@ -73,14 +73,19 @@
         self.canvas.draw()
 
+    def contextMenu(self):
+        """
+        Define common context menu and associated actions for the MPL widget
+        """
+        self.defaultContextMenu()
+
+
     def contextMenuQuickPlot(self):
         """
         Define context menu and associated actions for the quickplot MPL widget
         """
-        # Actions
-        self.contextMenu = QtGui.QMenu(self)
-        self.actionSaveImage = self.contextMenu.addAction("Save Image")
-        self.actionPrintImage = self.contextMenu.addAction("Print Image")
-        self.actionCopyToClipboard = self.contextMenu.addAction("Copy to Clipboard")
-        self.contextMenu.addSeparator()
+        # Default actions
+        self.defaultContextMenu()
+
+        # Additional actions
         self.actionToggleGrid = self.contextMenu.addAction("Toggle Grid On/Off")
         self.contextMenu.addSeparator()
@@ -88,7 +93,4 @@
 
         # Define the callbacks
-        self.actionSaveImage.triggered.connect(self.onImageSave)
-        self.actionPrintImage.triggered.connect(self.onImagePrint)
-        self.actionCopyToClipboard.triggered.connect(self.onClipboardCopy)
         self.actionToggleGrid.triggered.connect(self.onGridToggle)
         self.actionChangeScale.triggered.connect(self.onScaleChange)
Index: src/sas/qtgui/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotter2D.py	(revision fecfe283c4a23a8b1ec879117e43b24a7fce28a4)
+++ src/sas/qtgui/Plotter2D.py	(revision c4e54008b22a99cb838269a4dfa2d88e1259f308)
@@ -78,14 +78,16 @@
                       zmax=zmax_2D_temp)
 
+    def contextMenu(self):
+        """
+        Define common context menu and associated actions for the MPL widget
+        """
+        self.defaultContextMenu()
+
     def contextMenuQuickPlot(self):
         """
         Define context menu and associated actions for the quickplot MPL widget
         """
-        # Actions
-        self.contextMenu = QtGui.QMenu(self)
-        self.actionSaveImage = self.contextMenu.addAction("Save Image")
-        self.actionPrintImage = self.contextMenu.addAction("Print Image")
-        self.actionCopyToClipboard = self.contextMenu.addAction("Copy to Clipboard")
-        self.contextMenu.addSeparator()
+        self.defaultContextMenu()
+
         if self.dimension == 2:
             self.actionToggleGrid = self.contextMenu.addAction("Toggle Grid On/Off")
@@ -94,10 +96,7 @@
 
         # Define the callbacks
-        self.actionSaveImage.triggered.connect(self.onImageSave)
-        self.actionPrintImage.triggered.connect(self.onImagePrint)
-        self.actionCopyToClipboard.triggered.connect(self.onClipboardCopy)
+        self.actionChangeScale.triggered.connect(self.onToggleScale)
         if self.dimension == 2:
             self.actionToggleGrid.triggered.connect(self.onGridToggle)
-        self.actionChangeScale.triggered.connect(self.onToggleScale)
 
     def onToggleScale(self, event):
Index: src/sas/qtgui/PlotterBase.py
===================================================================
--- src/sas/qtgui/PlotterBase.py	(revision 3b7b21819920f53359a9aa32d2375d265b2fd88d)
+++ src/sas/qtgui/PlotterBase.py	(revision c4e54008b22a99cb838269a4dfa2d88e1259f308)
@@ -145,8 +145,8 @@
         self.manager.communicator.activeGraphsSignal.emit(PlotHelper.currentPlots())
 
-    def contextMenu(self):
-        """
-        Define common context menu and associated actions for the MPL widget
-        TODO: move to plotter1d/plotter2d
+    def defaultContextMenu(self):
+        """
+        Content of the dialog-universal context menu:
+        Save, Print and Copy
         """
         # Actions
@@ -162,4 +162,11 @@
         self.actionCopyToClipboard.triggered.connect(self.onClipboardCopy)
 
+    def contextMenu(self):
+        """
+        Define common context menu and associated actions for the MPL widget
+        TODO: move to plotter1d/plotter2d
+        """
+        raise NotImplementedError("Context menu method must be implemented in derived class.")
+
     def contextMenuQuickPlot(self):
         """
Index: src/sas/qtgui/UnitTesting/PlotterBaseTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/PlotterBaseTest.py	(revision 3b7b21819920f53359a9aa32d2375d265b2fd88d)
+++ src/sas/qtgui/UnitTesting/PlotterBaseTest.py	(revision c4e54008b22a99cb838269a4dfa2d88e1259f308)
@@ -1,5 +1,5 @@
 import sys
 import unittest
-from mock import MagicMock
+from mock import patch, MagicMock
 
 from PyQt4 import QtGui
@@ -15,4 +15,5 @@
 #import sas.qtgui.GuiUtils as GuiUtils
 from sas.qtgui.GuiUtils import *
+import sas.qtgui.PlotHelper as PlotHelper
 
 # Tested module
@@ -30,7 +31,4 @@
             def perspective(self):
                 return MyPerspective()
-
-        #PlotterBase.PlotterBase.updatePlotHelper = MagicMock()
-        #self.plotter = PlotterBase.PlotterBase(None, manager=dummy_manager())
 
         PlotterBase.PlotterBase.contextMenuQuickPlot = MagicMock()
@@ -64,13 +62,12 @@
     def testContextMenu(self):
         ''' Test the default context menu '''
-        pass
-
-    def testContextMenuQuickPlot(self):
-        ''' Test the default quick context menu '''
-        pass
+        with self.assertRaises(NotImplementedError):
+            self.plotter.contextMenu()
 
     def testClean(self):
         ''' test the graph cleanup '''
-        pass
+        self.plotter.figure.delaxes = MagicMock()
+        self.plotter.clean()
+        self.assertTrue(self.plotter.figure.delaxes.called)
 
     def testPlot(self):
@@ -79,23 +76,82 @@
             self.plotter.plot()
 
-    def testOnCloseEvent(self):
+    def notestOnCloseEvent(self):
         ''' test the plotter close behaviour '''
-        pass
+        PlotHelper.deletePlot = MagicMock()
+        self.plotter.closeEvent(None)
+        self.assertTrue(PlotHelper.deletePlot.called)
 
     def testOnImageSave(self):
         ''' test the workspace save '''
-        pass
+        self.plotter.toolbar.save_figure = MagicMock()
+        self.plotter.onImageSave()
+        self.assertTrue(self.plotter.toolbar.save_figure.called)
 
     def testOnImagePrint(self):
         ''' test the workspace print '''
-        pass
+        QtGui.QPainter.end = MagicMock()
+        QtGui.QLabel.render = MagicMock()
 
-    def tesOonClipboardCopy(self):
-        ''' test the workspace copy '''
-        pass
+        # First, let's cancel printing
+        QtGui.QPrintDialog.exec_ = MagicMock(return_value=QtGui.QDialog.Rejected)
+        self.plotter.onImagePrint()
+        self.assertFalse(QtGui.QPainter.end.called)
+        self.assertFalse(QtGui.QLabel.render.called)
+
+        # Let's print now
+        QtGui.QPrintDialog.exec_ = MagicMock(return_value=QtGui.QDialog.Accepted)
+        self.plotter.onImagePrint()
+        self.assertTrue(QtGui.QPainter.end.called)
+        self.assertTrue(QtGui.QLabel.render.called)
+
+    def testOnClipboardCopy(self):
+        ''' test the workspace screen copy '''
+        QtGui.QClipboard.setPixmap = MagicMock()
+        self.plotter.onClipboardCopy()
+        self.assertTrue(QtGui.QClipboard.setPixmap.called)
 
     def testOnGridToggle(self):
         ''' test toggling the grid lines '''
-        pass
+        # Check the toggle
+        orig_toggle = self.plotter.grid_on
+        
+        FigureCanvas.draw_idle = MagicMock()
+        self.plotter.onGridToggle()
+
+        self.assertTrue(FigureCanvas.draw_idle.called)
+        self.assertTrue(self.plotter.grid_on != orig_toggle)
+
+    def testDefaultContextMenu(self):
+        """ Test the right click default menu """
+
+        self.plotter.defaultContextMenu()
+
+        actions = self.plotter.contextMenu.actions()
+        self.assertEqual(len(actions), 4)
+
+        # Trigger Save Image and make sure the method is called
+        self.assertEqual(actions[0].text(), "Save Image")
+        self.plotter.toolbar.save_figure = MagicMock()
+        actions[0].trigger()
+        self.assertTrue(self.plotter.toolbar.save_figure.called)
+
+        # Trigger Print Image and make sure the method is called
+        self.assertEqual(actions[1].text(), "Print Image")
+        QtGui.QPrintDialog.exec_ = MagicMock(return_value=QtGui.QDialog.Rejected)
+        actions[1].trigger()
+        self.assertTrue(QtGui.QPrintDialog.exec_.called)
+
+        # Trigger Copy to Clipboard and make sure the method is called
+        self.assertEqual(actions[2].text(), "Copy to Clipboard")
+
+        # Spy on cliboard's dataChanged() signal
+        self.clipboard_called = False
+        def done():
+            self.clipboard_called = True
+        QtCore.QObject.connect(app.clipboard(), QtCore.SIGNAL("dataChanged()"), done)
+        actions[2].trigger()
+        QtGui.qApp.processEvents()
+        # Make sure clipboard got updated.
+        self.assertTrue(self.clipboard_called)
 
 
