Index: src/sas/qtgui/ColorMap.py
===================================================================
--- src/sas/qtgui/ColorMap.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
+++ src/sas/qtgui/ColorMap.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -0,0 +1,209 @@
+"""
+Allows users to change the range of the current graph
+"""
+from PyQt4 import QtGui
+from PyQt4 import QtCore
+import path_prepare
+
+import matplotlib as mpl
+from matplotlib import pylab
+import numpy
+
+from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
+from sas.sasgui.guiframe.dataFitting import Data2D
+from sas.qtgui.GuiUtils import formatNumber
+
+DEFAULT_MAP = 'jet'
+
+# Local UI
+from sas.qtgui.UI.ColorMapUI import Ui_ColorMapUI
+
+class ColorMap(QtGui.QDialog, Ui_ColorMapUI):
+    def __init__(self, parent=None, cmap=None, vmin=0.0, vmax=100.0, data=None):
+        super(ColorMap, self).__init__()
+
+        self.setupUi(self)
+        assert(isinstance(data, Data2D))
+
+        self.data = data
+        self._cmap_orig = self._cmap = cmap if cmap is not None else DEFAULT_MAP
+        self.all_maps = [m for m in pylab.cm.datad]
+        self.maps = sorted(m for m in self.all_maps if not m.endswith("_r"))
+        self.rmaps = sorted(set(self.all_maps) - set(self.maps))
+
+        self.vmin = vmin
+        self.vmax = vmax
+
+        # Initialize detector labels
+        self.initDetectorData()
+
+        # Initialize the combo box
+        self.initMapCombobox()
+
+        # Add the color map component
+        self.initColorMap()
+
+        # Initialize validators on amplitude textboxes
+        validator_min = QtGui.QDoubleValidator(self.txtMinAmplitude)
+        validator_min.setNotation(0)
+        self.txtMinAmplitude.setValidator(validator_min)
+        validator_max = QtGui.QDoubleValidator(self.txtMaxAmplitude)
+        validator_max.setNotation(0)
+        self.txtMaxAmplitude.setValidator(validator_max)
+
+        # Enforce constant size on the widget
+        self.setFixedSize(self.minimumSizeHint())
+
+        # Handle combobox changes
+        self.cbColorMap.currentIndexChanged.connect(self.onMapIndexChange)
+
+        # Handle checkbox changes
+        self.chkReverse.stateChanged.connect(self.onColorMapReversed)
+
+        # Handle the reset button click
+        self.buttonBox.button(QtGui.QDialogButtonBox.Reset).clicked.connect(self.onReset)
+
+        # Handle the amplitude setup
+        self.txtMinAmplitude.editingFinished.connect(self.onAmplitudeChange)
+        self.txtMaxAmplitude.editingFinished.connect(self.onAmplitudeChange)
+
+    def cmap(self):
+        """
+        Getter for the color map
+        """
+        return self._cmap
+
+    def norm(self):
+        """
+        Getter for the color map norm
+        """
+        return (self._norm.vmin, self._norm.vmax)
+
+    def onReset(self, event):
+        """
+        Respond to the Reset button click
+        """
+        # Go back to original settings
+        self._cmap = self._cmap_orig
+        self._norm = mpl.colors.Normalize(vmin=self.vmin, vmax=self.vmax)
+        self.txtMaxAmplitude.clear()
+        self.txtMinAmplitude.clear()
+        self.initMapCombobox()
+        # Redraw the widget
+        self.redrawColorBar()
+        self.canvas.draw()
+
+    def initDetectorData(self):
+        """
+        Fill out the Detector labels
+        """
+        xnpts = len(self.data.x_bins)
+        ynpts = len(self.data.y_bins)
+        self.lblWidth.setText(formatNumber(xnpts))
+        self.lblHeight.setText(formatNumber(ynpts))
+        xmax = max(self.data.xmin, self.data.xmax)
+        ymax = max(self.data.ymin, self.data.ymax)
+        qmax = numpy.sqrt(numpy.power(xmax, 2) + numpy.power(ymax, 2))
+        self.lblQmax.setText(formatNumber(qmax))
+        self.lblStopRadius.setText(formatNumber(self.data.xmin))
+
+    def initMapCombobox(self):
+        """
+        Fill out the combo box with all available color maps
+        """
+        if self._cmap in self.rmaps:
+            maps = self.rmaps
+            # Assure correct state of the checkbox
+            self.chkReverse.setChecked(True)
+        else:
+            maps = self.maps
+            # Assure correct state of the checkbox
+            self.chkReverse.setChecked(False)
+
+        self.cbColorMap.addItems(maps)
+        # Set the default/passed map
+        self.cbColorMap.setCurrentIndex(self.cbColorMap.findText(self._cmap))
+
+    def initColorMap(self):
+        """
+        Prepare and display the color map
+        """
+        self.fig = mpl.figure.Figure(figsize=(4, 1))
+        self.ax1 = self.fig.add_axes([0.05, 0.65, 0.9, 0.15])
+        self._norm = mpl.colors.Normalize(vmin=self.vmin, vmax=self.vmax)
+        self.redrawColorBar()
+        self.canvas = FigureCanvas(self.fig)
+        layout = QtGui.QVBoxLayout()
+        layout.addWidget(self.canvas)
+        self.widget.setLayout(layout)
+
+    def onMapIndexChange(self, index):
+        """
+        Respond to the color map change event
+        """
+        new_map = str(self.cbColorMap.itemText(index))
+        self._cmap = new_map
+        self.redrawColorBar()
+        self.canvas.draw()
+
+    def redrawColorBar(self):
+        """
+        Call ColorbarBase with current values, effectively redrawing the widget
+        """
+        self.cb = mpl.colorbar.ColorbarBase(self.ax1, cmap=self._cmap,
+                                            norm=self._norm,
+                                            orientation='horizontal')
+        self.cb.set_label('Detector Colors')
+
+    def onColorMapReversed(self, isChecked):
+        """
+        Respond to ticking/unticking the color map reverse checkbox
+        """
+        current_map = str(self.cbColorMap.currentText())
+        if isChecked:
+            # Add "_r" to map name for the reversed version
+            new_map = current_map + "_r"
+            maps = self.rmaps
+            # Assure the reversed map exists.
+            if new_map not in maps:
+                new_map = maps[0]
+        else:
+            new_map = current_map[:-2] # "_r" = last two chars
+            maps = self.maps
+            # Base map for the reversed map should ALWAYS exist,
+            # but let's be paranoid here
+            if new_map not in maps:
+                new_map = maps[0]
+
+        self._cmap = new_map
+        # Clearning the content of the combobox.
+        # Needs signal blocking, or else onMapIndexChange() spoils it all
+        self.cbColorMap.blockSignals(True)
+        self.cbColorMap.clear()
+        # Add the new set of maps
+        self.cbColorMap.addItems(maps)
+        # Remove the signal block before the proper index set
+        self.cbColorMap.blockSignals(False)
+        self.cbColorMap.setCurrentIndex(self.cbColorMap.findText(new_map))
+
+    def onAmplitudeChange(self):
+        """
+        Respond to editing the amplitude fields
+        """
+        min_amp = self.vmin
+        max_amp = self.vmax
+
+        try:
+            min_amp = float(self.txtMinAmplitude.text())
+        except ValueError:
+            pass
+        try:
+            max_amp = float(self.txtMaxAmplitude.text())
+        except ValueError:
+            pass
+
+        self._norm = mpl.colors.Normalize(vmin=min_amp, vmax=max_amp)
+        self.redrawColorBar()
+        self.canvas.draw()
+
+        pass
Index: src/sas/qtgui/GUITests.py
===================================================================
--- src/sas/qtgui/GUITests.py	(revision 87cc73a1ade6168487d1841f4c285fadcf532e0c)
+++ src/sas/qtgui/GUITests.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -23,4 +23,5 @@
 from UnitTesting import PlotPropertiesTest
 from UnitTesting import PlotUtilitiesTest
+from UnitTesting import ColorMapTest
 
 def suite():
@@ -48,4 +49,5 @@
         unittest.makeSuite(PlotPropertiesTest.PlotPropertiesTest, 'test'),
         unittest.makeSuite(PlotUtilitiesTest.PlotUtilitiesTest, 'test'),
+        unittest.makeSuite(ColorMapTest.ColorMapTest, 'test'),
     )
     return unittest.TestSuite(suites)
Index: src/sas/qtgui/Plotter.py
===================================================================
--- src/sas/qtgui/Plotter.py	(revision 0f3c22d6d78f70dfa622751e9a7254328e99bf1c)
+++ src/sas/qtgui/Plotter.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -28,6 +28,4 @@
         self.plot_dict = {}
 
-        # Simple window for data display
-        self.txt_widget = QtGui.QTextEdit(None)
         # Window for text add
         self.addText = AddText(self)
@@ -336,29 +334,4 @@
             self.canvas.draw_idle()
 
-    def onDataInfo(self, plot_data):
-        """
-        Displays data info text window for the selected plot
-        """
-        text_to_show = GuiUtils.retrieveData1d(plot_data)
-        # Hardcoded sizes to enable full width rendering with default font
-        self.txt_widget.resize(420,600)
-
-        self.txt_widget.setReadOnly(True)
-        self.txt_widget.setWindowFlags(QtCore.Qt.Window)
-        self.txt_widget.setWindowIcon(QtGui.QIcon(":/res/ball.ico"))
-        self.txt_widget.setWindowTitle("Data Info: %s" % plot_data.filename)
-        self.txt_widget.insertPlainText(text_to_show)
-
-        self.txt_widget.show()
-        # Move the slider all the way up, if present
-        vertical_scroll_bar = self.txt_widget.verticalScrollBar()
-        vertical_scroll_bar.triggerAction(QtGui.QScrollBar.SliderToMinimum)
-
-    def onSavePoints(self, plot_data):
-        """
-        Saves plot data to a file
-        """
-        GuiUtils.saveData1D(plot_data)
-
     def onLinearFit(self, id):
         """
Index: src/sas/qtgui/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotter2D.py	(revision b46f285a3e36e0f686120f9c8095a9c6da2d81b0)
+++ src/sas/qtgui/Plotter2D.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -2,6 +2,8 @@
 import numpy
 import pylab
+import functools
 
 from PyQt4 import QtGui
+from PyQt4 import QtCore
 
 DEFAULT_CMAP = pylab.cm.jet
@@ -10,4 +12,5 @@
 import sas.qtgui.PlotUtilities as PlotUtilities
 from sas.qtgui.PlotterBase import PlotterBase
+from sas.qtgui.ColorMap import ColorMap
 from sas.sasgui.guiframe.dataFitting import Data2D
 
@@ -22,4 +25,8 @@
         self.dimension = dimension
         super(Plotter2DWidget, self).__init__(parent, manager=manager, quickplot=quickplot)
+
+        self.cmap = DEFAULT_CMAP.name
+        # Default scale
+        self.scale = 'log_{10}'
 
     @property
@@ -55,23 +62,5 @@
 
         # Toggle the scale
-        zmin_2D_temp = self.zmin
-        zmax_2D_temp = self.zmax
-        # self.scale predefined in the baseclass
-        if self.scale == 'log_{10}':
-            self.scale = 'linear'
-            if not self.zmin is None:
-                zmin_2D_temp = numpy.power(10, self.zmin)
-            if not self.zmax is None:
-                zmax_2D_temp = numpy.power(10, self.zmax)
-        else:
-            self.scale = 'log_{10}'
-            if not self.zmin is None:
-                # min log value: no log(negative)
-                if self.zmin <= 0:
-                    zmin_2D_temp = MIN_Z
-                else:
-                    zmin_2D_temp = numpy.log10(self.zmin)
-            if not self.zmax is None:
-                zmax_2D_temp = numpy.log10(self.zmax)
+        zmin_2D_temp, zmax_2D_temp = self.calculateDepth()
 
         # Prepare and show the plot
@@ -85,4 +74,27 @@
                       zmax=zmax_2D_temp)
 
+    def calculateDepth(self):
+        """
+        Re-calculate the plot depth parameters depending on the scale
+        """
+        # Toggle the scale
+        zmin_temp = self.zmin
+        zmax_temp = self.zmax
+        # self.scale predefined in the baseclass
+        if self.scale == 'log_{10}':
+            if self.zmin is not None:
+                zmin_temp = numpy.power(10, self.zmin)
+            if self.zmax is not None:
+                zmax_temp = numpy.power(10, self.zmax)
+        else:
+            if self.zmin is not None:
+                # min log value: no log(negative)
+                zmin_temp = MIN_Z if self.zmin <= 0 else numpy.log10(self.zmin)
+            if self.zmax is not None:
+                zmax_temp = numpy.log10(self.zmax)
+
+        return (zmin_temp, zmax_temp)
+
+
     def createContextMenu(self):
         """
@@ -90,4 +102,37 @@
         """
         self.defaultContextMenu()
+
+        self.contextMenu.addSeparator()
+        self.actionDataInfo = self.contextMenu.addAction("&DataInfo")
+        self.actionDataInfo.triggered.connect(
+                              functools.partial(self.onDataInfo, self.data))
+
+        self.actionSavePointsAsFile = self.contextMenu.addAction("&Save Points as a File")
+        self.actionSavePointsAsFile.triggered.connect(
+                                functools.partial(self.onSavePoints, self.data))
+        self.contextMenu.addSeparator()
+
+        self.actionCircularAverage = self.contextMenu.addAction("&Perform Circular Average")
+        self.actionCircularAverage.triggered.connect(self.onCircularAverage)
+
+        self.actionSectorView = self.contextMenu.addAction("&Sector [Q View]")
+        self.actionSectorView.triggered.connect(self.onSectorView)
+        self.actionAnnulusView = self.contextMenu.addAction("&Annulus [Phi View]")
+        self.actionAnnulusView.triggered.connect(self.onAnnulusView)
+        self.actionBoxSum = self.contextMenu.addAction("&Box Sum")
+        self.actionBoxSum.triggered.connect(self.onBoxSum)
+        self.actionBoxAveragingX = self.contextMenu.addAction("&Box Averaging in Qx")
+        self.actionBoxAveragingX.triggered.connect(self.onBoxAveragingX)
+        self.actionBoxAveragingY = self.contextMenu.addAction("&Box Averaging in Qy")
+        self.actionBoxAveragingY.triggered.connect(self.onBoxAveragingY)
+        self.contextMenu.addSeparator()
+        self.actionEditGraphLabel = self.contextMenu.addAction("&Edit Graph Label")
+        self.actionEditGraphLabel.triggered.connect(self.onEditgraphLabel)
+        self.contextMenu.addSeparator()
+        self.actionColorMap = self.contextMenu.addAction("&2D Color Map")
+        self.actionColorMap.triggered.connect(self.onColorMap)
+        self.contextMenu.addSeparator()
+        self.actionChangeScale = self.contextMenu.addAction("Toggle Linear/Log Scale")
+        self.actionChangeScale.triggered.connect(self.onToggleScale)
 
     def createContextMenuQuick(self):
@@ -111,5 +156,62 @@
         Toggle axis and replot image
         """
+        # self.scale predefined in the baseclass
+        if self.scale == 'log_{10}':
+            self.scale = 'linear'
+        else:
+            self.scale = 'log_{10}'
+
         self.plot()
+
+    def onCircularAverage(self):
+        """
+        """
+        pass
+
+    def onSectorView(self):
+        """
+        """
+        pass
+
+    def onAnnulusView(self):
+        """
+        """
+        pass
+
+    def onBoxSum(self):
+        """
+        """
+        pass
+
+    def onBoxAveragingX(self):
+        """
+        """
+        pass
+
+    def onBoxAveragingY(self):
+        """
+        """
+        pass
+
+    def onEditgraphLabel(self):
+        """
+        """
+        pass
+
+    def onColorMap(self):
+        """
+        Display the color map dialog and modify the plot's map accordingly
+        """
+        color_map_dialog = ColorMap(self, cmap=self.cmap,
+                                    zmin=self.vmin,
+                                    zmax=self.vmax,
+                                    data=self.data)
+
+        if color_map_dialog.exec_() == QtGui.QDialog.Accepted:
+            self.cmap = color_map_dialog.cmap()
+            self.vmin, self.vmax = color_map_dialog.norm()
+            # Redraw the chart with new cmap
+            self.plot()
+        pass
 
     def showPlot(self, data, qx_data, qy_data, xmin, xmax, ymin, ymax,
@@ -140,5 +242,5 @@
             try:
                 if  self.zmin <= 0  and len(output[output > 0]) > 0:
-                    zmin_temp = self.zmin_2D
+                    zmin_temp = self.zmin
                     output[output > 0] = numpy.log10(output[output > 0])
                 elif self.zmin <= 0:
@@ -185,4 +287,7 @@
             cb.set_label('$' + self.scale + '$')
 
+            self.vmin = cb.vmin
+            self.vmax = cb.vmax
+
         else:
             # clear the previous 2D from memory
Index: src/sas/qtgui/PlotterBase.py
===================================================================
--- src/sas/qtgui/PlotterBase.py	(revision b46f285a3e36e0f686120f9c8095a9c6da2d81b0)
+++ src/sas/qtgui/PlotterBase.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -3,4 +3,5 @@
 
 from PyQt4 import QtGui
+from PyQt4 import QtCore
 
 # TODO: Replace the qt4agg calls below with qt5 equivalent.
@@ -16,4 +17,6 @@
 from sas.sasgui.plottools.binder import BindArtist
 
+import sas.qtgui.GuiUtils as GuiUtils
+from sas.sasgui.guiframe.dataFitting import Data1D, Data2D
 from sas.qtgui.ScaleProperties import ScaleProperties
 from sas.qtgui.WindowTitle import WindowTitle
@@ -37,4 +40,7 @@
         # ... and the toolbar with all the default MPL buttons
         self.toolbar = NavigationToolbar(self.canvas, self)
+
+        # Simple window for data display
+        self.txt_widget = QtGui.QTextEdit(None)
 
         # Set the layout and place the canvas widget in it.
@@ -474,2 +480,33 @@
             if self._scale_yhi is not None and self._scale_ylo is not None:
                 ax.set_ylim(self._scale_ylo, self._scale_yhi)
+
+    def onDataInfo(self, plot_data):
+        """
+        Displays data info text window for the selected plot
+        """
+        if isinstance(plot_data, Data1D):
+            text_to_show = GuiUtils.retrieveData1d(plot_data)
+        else:
+            text_to_show = GuiUtils.retrieveData2d(plot_data)
+        # Hardcoded sizes to enable full width rendering with default font
+        self.txt_widget.resize(420,600)
+
+        self.txt_widget.setReadOnly(True)
+        self.txt_widget.setWindowFlags(QtCore.Qt.Window)
+        self.txt_widget.setWindowIcon(QtGui.QIcon(":/res/ball.ico"))
+        self.txt_widget.setWindowTitle("Data Info: %s" % plot_data.filename)
+        self.txt_widget.insertPlainText(text_to_show)
+
+        self.txt_widget.show()
+        # Move the slider all the way up, if present
+        vertical_scroll_bar = self.txt_widget.verticalScrollBar()
+        vertical_scroll_bar.triggerAction(QtGui.QScrollBar.SliderToMinimum)
+
+    def onSavePoints(self, plot_data):
+        """
+        Saves plot data to a file
+        """
+        if isinstance(plot_data, Data1D):
+            GuiUtils.saveData1D(plot_data)
+        else:
+            GuiUtils.saveData2D(plot_data)
Index: src/sas/qtgui/UI/ColorMapUI.ui
===================================================================
--- src/sas/qtgui/UI/ColorMapUI.ui	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
+++ src/sas/qtgui/UI/ColorMapUI.ui	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ColorMapUI</class>
+ <widget class="QDialog" name="ColorMapUI">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>450</width>
+    <height>329</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Color Map</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="main_resources.qrc">
+    <normaloff>:/res/ball.ico</normaloff>:/res/ball.ico</iconset>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_5">
+   <item row="1" column="1">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>62</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="3" column="0" colspan="3">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="0" column="0" colspan="2">
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Color map</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="text">
+           <string>Select color map</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QComboBox" name="cbColorMap">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select color map from the list.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="1" column="0">
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <widget class="QLabel" name="label_2">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter value for minimum color map amplitude.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Min amplitude for color map</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="txtMinAmplitude">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter value for minimum color map amplitude.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="label_3">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter value for maximum color map amplitude.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Max amplitude for color map</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QLineEdit" name="txtMaxAmplitude">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter value for maximum color map amplitude.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="2" column="0">
+       <widget class="QCheckBox" name="chkReverse">
+        <property name="toolTip">
+         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use the color-reversed map.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+        </property>
+        <property name="text">
+         <string>Reverse map</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="0" column="2">
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="title">
+      <string>Detector</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_4">
+      <item row="0" column="0">
+       <layout class="QGridLayout" name="gridLayout_3">
+        <item row="0" column="0">
+         <widget class="QLabel" name="label_4">
+          <property name="text">
+           <string>Width in pixels</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QLabel" name="lblWidth">
+          <property name="text">
+           <string>0</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="label_5">
+          <property name="text">
+           <string>Height in pixels</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QLabel" name="lblHeight">
+          <property name="text">
+           <string>0</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0">
+         <widget class="QLabel" name="label_6">
+          <property name="text">
+           <string>Q max</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QLabel" name="lblQmax">
+          <property name="text">
+           <string>0</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0">
+         <widget class="QLabel" name="label_7">
+          <property name="text">
+           <string>Beam stop radius</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="1">
+         <widget class="QLabel" name="lblStopRadius">
+          <property name="text">
+           <string>TextLabel</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="3">
+    <widget class="QWidget" name="widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+  </layout>
+  <zorder>groupBox</zorder>
+  <zorder>widget</zorder>
+  <zorder>groupBox_2</zorder>
+  <zorder>verticalSpacer</zorder>
+ </widget>
+ <resources>
+  <include location="main_resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ColorMapUI</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ColorMapUI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
Index: src/sas/qtgui/UnitTesting/ColorMapTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/ColorMapTest.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
+++ src/sas/qtgui/UnitTesting/ColorMapTest.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -0,0 +1,83 @@
+import sys
+import unittest
+import numpy
+
+from PyQt4 import QtGui
+from mock import MagicMock
+
+# set up import paths
+import path_prepare
+
+from sas.sasgui.guiframe.dataFitting import Data2D
+import sas.qtgui.Plotter2D as Plotter2D
+from UnitTesting.TestUtils import WarningTestNotImplemented
+
+# Local
+from sas.qtgui.ColorMap import ColorMap
+
+app = QtGui.QApplication(sys.argv)
+
+class ColorMapTest(unittest.TestCase):
+    '''Test the ColorMap'''
+    def setUp(self):
+        '''Create the ColorMap'''
+        self.plotter = Plotter2D.Plotter2D(None, quickplot=True)
+
+        self.data = Data2D(image=[0.1]*4,
+                           qx_data=[1.0, 2.0, 3.0, 4.0],
+                           qy_data=[10.0, 11.0, 12.0, 13.0],
+                           dqx_data=[0.1, 0.2, 0.3, 0.4],
+                           dqy_data=[0.1, 0.2, 0.3, 0.4],
+                           q_data=[1,2,3,4],
+                           xmin=-1.0, xmax=5.0,
+                           ymin=-1.0, ymax=15.0,
+                           zmin=-1.0, zmax=20.0)
+
+        self.data.title="Test data"
+        self.data.id = 1
+        self.widget = ColorMap(parent=self.plotter, data=self.data)
+
+    def tearDown(self):
+        '''Destroy the GUI'''
+        self.widget.close()
+        self.widget = None
+
+    def testDefaults(self):
+        '''Test the GUI in its default state'''
+        self.assertIsInstance(self.widget, QtGui.QDialog)
+
+        WarningTestNotImplemented()
+
+    def testOnReset(self):
+        '''Check the dialog reset function'''
+        WarningTestNotImplemented()
+
+    def testInitDetectorData(self):
+        '''Check the detector data generator'''
+        # possibly to fold into testDefaults
+        WarningTestNotImplemented()
+
+    def testInitMapCombobox(self):
+        '''Test the combo box initializer'''
+        # possible to fold into testDefaults
+        WarningTestNotImplemented()
+
+    def testOnMapIndexChange(self):
+        '''Test the response to the combo box index change'''
+        WarningTestNotImplemented()
+
+    def testRedrawColorBar(self):
+        '''Test the color bar redrawing'''
+        WarningTestNotImplemented()
+
+    def testOnColorMapReversed(self):
+        '''Test reversing the color map functionality'''
+        WarningTestNotImplemented()
+
+    def testOnAmplitudeChange(self):
+        '''Check the callback method for responding to changes in textboxes'''
+        WarningTestNotImplemented()
+
+
+if __name__ == "__main__":
+    unittest.main()
Index: src/sas/qtgui/UnitTesting/Plotter2DTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/Plotter2DTest.py	(revision b46f285a3e36e0f686120f9c8095a9c6da2d81b0)
+++ src/sas/qtgui/UnitTesting/Plotter2DTest.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -13,4 +13,5 @@
 from sas.sasgui.guiframe.dataFitting import Data1D
 from sas.sasgui.guiframe.dataFitting import Data2D
+from UnitTesting.TestUtils import WarningTestNotImplemented
 
 # Tested module
@@ -60,4 +61,12 @@
 
         self.assertTrue(FigureCanvas.draw_idle.called)
+
+    def testCalculateDepth(self):
+        ''' Test the depth calculator '''
+        WarningTestNotImplemented()
+
+    def testOnColorMap(self):
+        ''' Respond to the color map event '''
+        WarningTestNotImplemented()
 
     def testOnToggleScale(self):
Index: src/sas/qtgui/UnitTesting/TestUtils.py
===================================================================
--- src/sas/qtgui/UnitTesting/TestUtils.py	(revision db5cd8da62c5627b9811d209d913219ab45e3c75)
+++ src/sas/qtgui/UnitTesting/TestUtils.py	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
Index: src/sas/qtgui/run_tests.bat
===================================================================
--- src/sas/qtgui/run_tests.bat	(revision 87cc73a1ade6168487d1841f4c285fadcf532e0c)
+++ src/sas/qtgui/run_tests.bat	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -22,2 +22,3 @@
 python -m UnitTesting.PlotPropertiesTest
 python -m UnitTesting.PlotUtilitiesTest
+python -m UnitTesting.ColorMapTest
Index: src/sas/qtgui/run_tests.sh
===================================================================
--- src/sas/qtgui/run_tests.sh	(revision 87cc73a1ade6168487d1841f4c285fadcf532e0c)
+++ src/sas/qtgui/run_tests.sh	(revision 092a3d9e371190b241becedfa1c1b6039185593a)
@@ -21,2 +21,3 @@
 python -m UnitTesting.PlotPropertiesTest
 python -m UnitTesting.PlotUtilitiesTest
+python -m UnitTesting.ColorMapTest
