diff --git a/examples/Plotting.py b/examples/Plotting.py
index 79d0d4ac3b64962e375d161dd7b879ad5975ee16..cb5125035e6b47f7a578cdc0f45d9f5d4dc1e333 100644
--- a/examples/Plotting.py
+++ b/examples/Plotting.py
@@ -35,18 +35,20 @@ p3.plot(np.random.normal(size=100), pen=(200,200,200), symbolBrush=(255,0,0), sy
 
 win.nextRow()
 
-p4 = win.addPlot(title="Parametric")
+p4 = win.addPlot(title="Parametric, grid enabled")
 x = np.cos(np.linspace(0, 2*np.pi, 1000))
 y = np.sin(np.linspace(0, 4*np.pi, 1000))
 p4.plot(x, y)
+p4.showGrid(x=True, y=True)
 
-p5 = win.addPlot(title="Scatter plot with labels")
+p5 = win.addPlot(title="Scatter plot, axis labels, log scale")
 x = np.random.normal(size=1000) * 1e-5
 y = x*1000 + 0.005 * np.random.normal(size=1000)
+y -= y.min()-1.0
 p5.plot(x, y, pen=None, symbol='t', symbolPen=None, symbolSize=10, symbolBrush=(100, 100, 255, 50))
 p5.setLabel('left', "Y Axis", units='A')
 p5.setLabel('bottom', "Y Axis", units='s')
-
+p5.setLogMode(x=True, y=False)
 
 p6 = win.addPlot(title="Updating plot")
 curve = p6.plot(pen='y')
@@ -65,9 +67,10 @@ timer.start(50)
 
 win.nextRow()
 
-p7 = win.addPlot(title="Filled plot")
+p7 = win.addPlot(title="Filled plot, axis disabled")
 y = np.sin(np.linspace(0, 10, 1000)) + np.random.normal(size=1000, scale=0.1)
 p7.plot(y, fillLevel=-0.3, brush=(50,50,200,100))
+p7.showAxis('bottom', False)
 
 
 x2 = np.linspace(-100, 100, 1000)
diff --git a/examples/logAxis.py b/examples/logAxis.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e291fb2d4420d69bce4f2e7c412f359aba76c49
--- /dev/null
+++ b/examples/logAxis.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+import initExample ## Add path to library (just for examples; you do not need this)
+
+import numpy as np
+from pyqtgraph.Qt import QtGui, QtCore
+import pyqtgraph as pg
+
+
+app = QtGui.QApplication([])
+
+w = pg.GraphicsWindow()
+p1 = w.addPlot(0,0, title="X Semilog")
+p2 = w.addPlot(1,0, title="Y Semilog")
+p3 = w.addPlot(2,0, title="XY Log")
+p1.showGrid(True, True)
+p2.showGrid(True, True)
+p3.showGrid(True, True)
+p1.setLogMode(True, False)
+p2.setLogMode(False, True)
+p3.setLogMode(True, True)
+w.show()
+
+y = np.random.normal(size=1000)
+x = np.linspace(0, 1, 1000)
+p1.plot(x, y)
+p2.plot(x, y)
+p3.plot(x, y)
+
+
+
+#p.getAxis('bottom').setLogMode(True)
+
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+import sys
+if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+    app.exec_()
diff --git a/graphicsItems/AxisItem.py b/graphicsItems/AxisItem.py
index 563f3fb46f58e4110da9547dab97d44df8111ee6..bd72561fd325bc9f55d9f0a39b92329b1e588c5b 100644
--- a/graphicsItems/AxisItem.py
+++ b/graphicsItems/AxisItem.py
@@ -43,6 +43,7 @@ class AxisItem(GraphicsWidget):
         self.labelUnits = ''
         self.labelUnitPrefix=''
         self.labelStyle = {'color': '#CCC'}
+        self.logMode = False
         
         self.textHeight = 18
         self.tickLength = maxTickLength
@@ -76,6 +77,10 @@ class AxisItem(GraphicsWidget):
         self.prepareGeometryChange()
         self.update()
         
+    def setLogMode(self, log):
+        self.logMode = log
+        self.picture = None
+        self.update()
         
     def resizeEvent(self, ev=None):
         #s = self.size()
@@ -316,6 +321,9 @@ class AxisItem(GraphicsWidget):
         By default, this method calls tickSpacing to determine the correct tick locations.
         This is a good method to override in subclasses.
         """
+        if self.logMode:
+            return self.logTickValues(minVal, maxVal, size)
+            
         ticks = []
         tickLevels = self.tickSpacing(minVal, maxVal, size)
         for i in range(len(tickLevels)):
@@ -329,6 +337,16 @@ class AxisItem(GraphicsWidget):
             ticks.append((spacing, np.arange(num) * spacing + start))
         return ticks
     
+    def logTickValues(self, minVal, maxVal, size):
+        v1 = int(np.floor(minVal))
+        v2 = int(np.ceil(maxVal))
+        major = range(v1+1, v2)
+        
+        minor = []
+        for v in range(v1, v2):
+            minor.extend(v + np.log10(np.arange(1, 10)))
+        minor = filter(lambda x: x>minVal and x<maxVal, minor)
+        return [(1.0, major), (None, minor)]
 
     def tickStrings(self, values, scale, spacing):
         """Return the strings that should be placed next to ticks. This method is called 
@@ -343,6 +361,9 @@ class AxisItem(GraphicsWidget):
         be accompanied by a scale value of 1000. This indicates that the label is displaying 'mV', and 
         thus the tick should display 0.001 * 1000 = 1.
         """
+        if self.logMode:
+            return self.logTickStrings(values, scale, spacing)
+        
         places = max(0, np.ceil(-np.log10(spacing*scale)))
         strings = []
         for v in values:
@@ -354,6 +375,9 @@ class AxisItem(GraphicsWidget):
             strings.append(vstr)
         return strings
         
+    def logTickStrings(self, values, scale, spacing):
+        return ["%0.1g"%x for x in 10 ** np.array(values).astype(float)]
+        
     def drawPicture(self, p):
         
         p.setRenderHint(p.Antialiasing, False)
@@ -458,6 +482,8 @@ class AxisItem(GraphicsWidget):
             ## take a small sample of strings and measure their rendered text
             spacing, values = tickLevels[i]
             strings = self.tickStrings(values[:2], self.scale, spacing)
+            if len(strings) == 0:
+                continue
             textRects = [p.boundingRect(QtCore.QRectF(0, 0, 100, 100), QtCore.Qt.AlignCenter, s) for s in strings]
             if axis == 0:
                 textSize = np.max([r.height() for r in textRects])
diff --git a/graphicsItems/PlotItem/PlotItem.py b/graphicsItems/PlotItem/PlotItem.py
index 3028de7fceaf37482b4795f511ee1c97e6a23a6b..b566a8bf9a155952c8eafe67546a56020009434d 100644
--- a/graphicsItems/PlotItem/PlotItem.py
+++ b/graphicsItems/PlotItem/PlotItem.py
@@ -208,7 +208,7 @@ class PlotItem(GraphicsWidget):
         dv = QtGui.QDoubleValidator(self)
         
         menuItems = [
-            ('Fourier Transform', c.powerSpectrumGroup),
+            ('Transforms', c.transformGroup),
             ('Downsample', c.decimateGroup),
             ('Average', c.averageGroup),
             ('Alpha', c.alphaGroup),
@@ -272,10 +272,13 @@ class PlotItem(GraphicsWidget):
         c.alphaSlider.valueChanged.connect(self.updateAlpha)
         c.autoAlphaCheck.toggled.connect(self.updateAlpha)
 
-        c.gridGroup.toggled.connect(self.updateGrid)
+        c.xGridCheck.toggled.connect(self.updateGrid)
+        c.yGridCheck.toggled.connect(self.updateGrid)
         c.gridAlphaSlider.valueChanged.connect(self.updateGrid)
 
-        c.powerSpectrumGroup.toggled.connect(self.updateSpectrumMode)
+        c.fftCheck.toggled.connect(self.updateSpectrumMode)
+        c.logXCheck.toggled.connect(self.updateLogMode)
+        c.logYCheck.toggled.connect(self.updateLogMode)
         #c.saveSvgBtn.clicked.connect(self.saveSvgClicked)
         #c.saveSvgCurvesBtn.clicked.connect(self.saveSvgCurvesClicked)
         #c.saveImgBtn.clicked.connect(self.saveImgClicked)
@@ -332,6 +335,40 @@ class PlotItem(GraphicsWidget):
         """Return the ViewBox within."""
         return self.vb
     
+    def setLogMode(self, x, y):
+        """
+        Set log scaling for x and y axes.
+        This informs PlotDataItems to transform logarithmically and switches
+        the axes to use log ticking. 
+        
+        Note that *no other items* in the scene will be affected by
+        this; there is no generic way to redisplay a GraphicsItem
+        with log coordinates.
+        
+        """
+        self.ctrl.logXCheck.setChecked(x)
+        self.ctrl.logYCheck.setChecked(y)
+        
+    def showGrid(self, x=None, y=None, alpha=None):
+        """
+        Show or hide the grid for either axis.
+        
+        ==============  =====================================
+        **Arguments:**
+        x               (bool) Whether to show the X grid
+        y               (bool) Whether to show the Y grid
+        alpha           (0.0-1.0) Opacity of the grid
+        """
+        if x is None and y is None and alpha is None:
+            raise Exception("Must specify at least one of x, y, or alpha.")  ## prevent people getting confused if they just call showGrid()
+        
+        if x is not None:
+            self.ctrl.xGridCheck.setChecked(x)
+        if y is not None:
+            self.ctrl.yGridCheck.setChecked(y)
+        if alpha is not None:
+            v = np.clip(alpha, 0, 1)*self.ctrl.gridAlphaSlider.maximum()
+            self.ctrl.gridAlphaSlider.setValue(v)
         
     #def paint(self, *args):
         #prof = debug.Profiler('PlotItem.paint', disabled=True)
@@ -432,11 +469,13 @@ class PlotItem(GraphicsWidget):
         
         
     def updateGrid(self, *args):
-        g = self.ctrl.gridGroup.isChecked()
-        if g:
-            g = self.ctrl.gridAlphaSlider.value()
-        for k in self.scales:
-            self.scales[k]['item'].setGrid(g)
+        alpha = self.ctrl.gridAlphaSlider.value()
+        x = alpha if self.ctrl.xGridCheck.isChecked() else False
+        y = alpha if self.ctrl.xGridCheck.isChecked() else False
+        self.getAxis('top').setGrid(x)
+        self.getAxis('bottom').setGrid(x)
+        self.getAxis('left').setGrid(y)
+        self.getAxis('right').setGrid(y)
 
     def viewGeometry(self):
         """Return the screen geometry of the viewbox"""
@@ -754,7 +793,8 @@ class PlotItem(GraphicsWidget):
             ## configure curve for this plot
             (alpha, auto) = self.alphaState()
             item.setAlpha(alpha, auto)
-            item.setFftMode(self.ctrl.powerSpectrumGroup.isChecked())
+            item.setFftMode(self.ctrl.fftCheck.isChecked())
+            item.setLogMode(self.ctrl.logXCheck.isChecked(), self.ctrl.logYCheck.isChecked())
             item.setDownsampling(self.downsampleMode())
             item.setPointMode(self.pointMode())
             
@@ -864,7 +904,18 @@ class PlotItem(GraphicsWidget):
         return item
 
     def scatterPlot(self, *args, **kargs):
-        print "PlotItem.scatterPlot is deprecated. Use PlotItem.plot instead."
+        if 'pen' in kargs:
+            kargs['symbolPen'] = kargs['pen']
+        kargs['pen'] = None
+            
+        if 'brush' in kargs:
+            kargs['symbolBrush'] = kargs['brush']
+            del kargs['brush']
+            
+        if 'size' in kargs:
+            kargs['symbolSize'] = kargs['size']
+            del kargs['size']
+
         return self.plot(*args, **kargs)
         #sp = ScatterPlotItem(*args, **kargs)
         #self.addItem(sp)
@@ -1155,6 +1206,12 @@ class PlotItem(GraphicsWidget):
         self.updateAlpha()
         self.updateDecimation()
         
+        if 'powerSpectrumGroup' in state:
+            state['fftCheck'] = state['powerSpectrumGroup']
+        if 'gridGroup' in state:
+            state['xGridCheck'] = state['gridGroup']
+            state['yGridCheck'] = state['gridGroup']
+            
         self.stateGroup.setState(state)
         #self.updateXScale()
         #self.updateYScale()
@@ -1183,12 +1240,24 @@ class PlotItem(GraphicsWidget):
       
     def updateSpectrumMode(self, b=None):
         if b is None:
-            b = self.ctrl.powerSpectrumGroup.isChecked()
+            b = self.ctrl.fftCheck.isChecked()
         for c in self.curves:
             c.setFftMode(b)
         self.enableAutoRange()
         self.recomputeAverages()
             
+    def updateLogMode(self):
+        x = self.ctrl.logXCheck.isChecked()
+        y = self.ctrl.logYCheck.isChecked()
+        for c in self.curves:
+            c.setLogMode(x,y)
+        self.getAxis('bottom').setLogMode(x)
+        self.getAxis('top').setLogMode(x)
+        self.getAxis('left').setLogMode(y)
+        self.getAxis('right').setLogMode(y)
+        self.enableAutoRange()
+        self.recomputeAverages()
+        
         
     def updateDownsampling(self):
         ds = self.downsampleMode()
@@ -1291,8 +1360,13 @@ class PlotItem(GraphicsWidget):
             raise Exception("Scale '%s' not found. Scales are: %s" % (key, str(self.scales.keys())))
         
     def getScale(self, key):
-        self._checkScaleKey(key)
-        return self.scales[key]['item']
+        return self.getAxis(key)
+        
+    def getAxis(self, name):
+        """Return the specified AxisItem. 
+        *name* should be 'left', 'bottom', 'top', or 'right'."""
+        self._checkScaleKey(name)
+        return self.scales[name]['item']
         
     def setLabel(self, axis, text=None, units=None, unitPrefix=None, **args):
         """
diff --git a/graphicsItems/PlotItem/plotConfigTemplate.py b/graphicsItems/PlotItem/plotConfigTemplate.py
index e8b28bb16124986fb283d072f3e621751fa354be..9a107e9d273003db8d2d304b601dc4d75dadc60d 100644
--- a/graphicsItems/PlotItem/plotConfigTemplate.py
+++ b/graphicsItems/PlotItem/plotConfigTemplate.py
@@ -2,8 +2,8 @@
 
 # Form implementation generated from reading ui file 'plotConfigTemplate.ui'
 #
-# Created: Fri Jan 20 11:24:44 2012
-#      by: PyQt4 UI code generator 4.8.3
+# Created: Sat Apr 21 14:42:02 2012
+#      by: PyQt4 UI code generator 4.8.5
 #
 # WARNING! All changes made in this file will be lost!
 
@@ -18,8 +18,11 @@ class Ui_Form(object):
     def setupUi(self, Form):
         Form.setObjectName(_fromUtf8("Form"))
         Form.resize(258, 605)
+        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
         self.averageGroup = QtGui.QGroupBox(Form)
         self.averageGroup.setGeometry(QtCore.QRect(10, 200, 242, 182))
+        self.averageGroup.setToolTip(QtGui.QApplication.translate("Form", "Display averages of the curves displayed in this plot. The parameter list allows you to choose parameters to average over (if any are available).", None, QtGui.QApplication.UnicodeUTF8))
+        self.averageGroup.setTitle(QtGui.QApplication.translate("Form", "Average", None, QtGui.QApplication.UnicodeUTF8))
         self.averageGroup.setCheckable(True)
         self.averageGroup.setChecked(False)
         self.averageGroup.setObjectName(_fromUtf8("averageGroup"))
@@ -31,7 +34,8 @@ class Ui_Form(object):
         self.avgParamList.setObjectName(_fromUtf8("avgParamList"))
         self.gridLayout_5.addWidget(self.avgParamList, 0, 0, 1, 1)
         self.decimateGroup = QtGui.QGroupBox(Form)
-        self.decimateGroup.setGeometry(QtCore.QRect(0, 30, 242, 160))
+        self.decimateGroup.setGeometry(QtCore.QRect(0, 70, 242, 160))
+        self.decimateGroup.setTitle(QtGui.QApplication.translate("Form", "Downsample", None, QtGui.QApplication.UnicodeUTF8))
         self.decimateGroup.setCheckable(True)
         self.decimateGroup.setObjectName(_fromUtf8("decimateGroup"))
         self.gridLayout_4 = QtGui.QGridLayout(self.decimateGroup)
@@ -39,69 +43,102 @@ class Ui_Form(object):
         self.gridLayout_4.setSpacing(0)
         self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
         self.manualDecimateRadio = QtGui.QRadioButton(self.decimateGroup)
+        self.manualDecimateRadio.setText(QtGui.QApplication.translate("Form", "Manual", None, QtGui.QApplication.UnicodeUTF8))
         self.manualDecimateRadio.setChecked(True)
         self.manualDecimateRadio.setObjectName(_fromUtf8("manualDecimateRadio"))
         self.gridLayout_4.addWidget(self.manualDecimateRadio, 0, 0, 1, 1)
         self.downsampleSpin = QtGui.QSpinBox(self.decimateGroup)
         self.downsampleSpin.setMinimum(1)
         self.downsampleSpin.setMaximum(100000)
-        self.downsampleSpin.setProperty(_fromUtf8("value"), 1)
+        self.downsampleSpin.setProperty("value", 1)
         self.downsampleSpin.setObjectName(_fromUtf8("downsampleSpin"))
         self.gridLayout_4.addWidget(self.downsampleSpin, 0, 1, 1, 1)
         self.autoDecimateRadio = QtGui.QRadioButton(self.decimateGroup)
+        self.autoDecimateRadio.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
         self.autoDecimateRadio.setChecked(False)
         self.autoDecimateRadio.setObjectName(_fromUtf8("autoDecimateRadio"))
         self.gridLayout_4.addWidget(self.autoDecimateRadio, 1, 0, 1, 1)
         self.maxTracesCheck = QtGui.QCheckBox(self.decimateGroup)
+        self.maxTracesCheck.setToolTip(QtGui.QApplication.translate("Form", "If multiple curves are displayed in this plot, check this box to limit the number of traces that are displayed.", None, QtGui.QApplication.UnicodeUTF8))
+        self.maxTracesCheck.setText(QtGui.QApplication.translate("Form", "Max Traces:", None, QtGui.QApplication.UnicodeUTF8))
         self.maxTracesCheck.setObjectName(_fromUtf8("maxTracesCheck"))
         self.gridLayout_4.addWidget(self.maxTracesCheck, 2, 0, 1, 1)
         self.maxTracesSpin = QtGui.QSpinBox(self.decimateGroup)
+        self.maxTracesSpin.setToolTip(QtGui.QApplication.translate("Form", "If multiple curves are displayed in this plot, check \"Max Traces\" and set this value to limit the number of traces that are displayed.", None, QtGui.QApplication.UnicodeUTF8))
         self.maxTracesSpin.setObjectName(_fromUtf8("maxTracesSpin"))
         self.gridLayout_4.addWidget(self.maxTracesSpin, 2, 1, 1, 1)
         self.forgetTracesCheck = QtGui.QCheckBox(self.decimateGroup)
+        self.forgetTracesCheck.setToolTip(QtGui.QApplication.translate("Form", "If MaxTraces is checked, remove curves from memory after they are hidden (saves memory, but traces can not be un-hidden).", None, QtGui.QApplication.UnicodeUTF8))
+        self.forgetTracesCheck.setText(QtGui.QApplication.translate("Form", "Forget hidden traces", None, QtGui.QApplication.UnicodeUTF8))
         self.forgetTracesCheck.setObjectName(_fromUtf8("forgetTracesCheck"))
         self.gridLayout_4.addWidget(self.forgetTracesCheck, 3, 0, 1, 2)
-        self.powerSpectrumGroup = QtGui.QGroupBox(Form)
-        self.powerSpectrumGroup.setGeometry(QtCore.QRect(0, 0, 242, 41))
-        self.powerSpectrumGroup.setCheckable(True)
-        self.powerSpectrumGroup.setChecked(False)
-        self.powerSpectrumGroup.setObjectName(_fromUtf8("powerSpectrumGroup"))
+        self.transformGroup = QtGui.QFrame(Form)
+        self.transformGroup.setGeometry(QtCore.QRect(0, 0, 154, 79))
+        self.transformGroup.setObjectName(_fromUtf8("transformGroup"))
+        self.gridLayout = QtGui.QGridLayout(self.transformGroup)
+        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+        self.fftCheck = QtGui.QCheckBox(self.transformGroup)
+        self.fftCheck.setText(QtGui.QApplication.translate("Form", "Power Spectrum (FFT)", None, QtGui.QApplication.UnicodeUTF8))
+        self.fftCheck.setObjectName(_fromUtf8("fftCheck"))
+        self.gridLayout.addWidget(self.fftCheck, 0, 0, 1, 1)
+        self.logXCheck = QtGui.QCheckBox(self.transformGroup)
+        self.logXCheck.setText(QtGui.QApplication.translate("Form", "Log X", None, QtGui.QApplication.UnicodeUTF8))
+        self.logXCheck.setObjectName(_fromUtf8("logXCheck"))
+        self.gridLayout.addWidget(self.logXCheck, 1, 0, 1, 1)
+        self.logYCheck = QtGui.QCheckBox(self.transformGroup)
+        self.logYCheck.setText(QtGui.QApplication.translate("Form", "Log Y", None, QtGui.QApplication.UnicodeUTF8))
+        self.logYCheck.setObjectName(_fromUtf8("logYCheck"))
+        self.gridLayout.addWidget(self.logYCheck, 2, 0, 1, 1)
         self.pointsGroup = QtGui.QGroupBox(Form)
-        self.pointsGroup.setGeometry(QtCore.QRect(10, 520, 234, 58))
+        self.pointsGroup.setGeometry(QtCore.QRect(10, 550, 234, 58))
+        self.pointsGroup.setTitle(QtGui.QApplication.translate("Form", "Points", None, QtGui.QApplication.UnicodeUTF8))
         self.pointsGroup.setCheckable(True)
         self.pointsGroup.setObjectName(_fromUtf8("pointsGroup"))
         self.verticalLayout_5 = QtGui.QVBoxLayout(self.pointsGroup)
         self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
         self.autoPointsCheck = QtGui.QCheckBox(self.pointsGroup)
+        self.autoPointsCheck.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
         self.autoPointsCheck.setChecked(True)
         self.autoPointsCheck.setObjectName(_fromUtf8("autoPointsCheck"))
         self.verticalLayout_5.addWidget(self.autoPointsCheck)
-        self.gridGroup = QtGui.QGroupBox(Form)
-        self.gridGroup.setGeometry(QtCore.QRect(10, 460, 234, 60))
-        self.gridGroup.setCheckable(True)
-        self.gridGroup.setChecked(False)
+        self.gridGroup = QtGui.QFrame(Form)
+        self.gridGroup.setGeometry(QtCore.QRect(10, 460, 221, 81))
         self.gridGroup.setObjectName(_fromUtf8("gridGroup"))
-        self.verticalLayout_4 = QtGui.QVBoxLayout(self.gridGroup)
-        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
+        self.gridLayout_2 = QtGui.QGridLayout(self.gridGroup)
+        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
+        self.xGridCheck = QtGui.QCheckBox(self.gridGroup)
+        self.xGridCheck.setText(QtGui.QApplication.translate("Form", "Show X Grid", None, QtGui.QApplication.UnicodeUTF8))
+        self.xGridCheck.setObjectName(_fromUtf8("xGridCheck"))
+        self.gridLayout_2.addWidget(self.xGridCheck, 0, 0, 1, 2)
+        self.yGridCheck = QtGui.QCheckBox(self.gridGroup)
+        self.yGridCheck.setText(QtGui.QApplication.translate("Form", "Show Y Grid", None, QtGui.QApplication.UnicodeUTF8))
+        self.yGridCheck.setObjectName(_fromUtf8("yGridCheck"))
+        self.gridLayout_2.addWidget(self.yGridCheck, 1, 0, 1, 2)
         self.gridAlphaSlider = QtGui.QSlider(self.gridGroup)
         self.gridAlphaSlider.setMaximum(255)
-        self.gridAlphaSlider.setProperty(_fromUtf8("value"), 70)
+        self.gridAlphaSlider.setProperty("value", 70)
         self.gridAlphaSlider.setOrientation(QtCore.Qt.Horizontal)
         self.gridAlphaSlider.setObjectName(_fromUtf8("gridAlphaSlider"))
-        self.verticalLayout_4.addWidget(self.gridAlphaSlider)
+        self.gridLayout_2.addWidget(self.gridAlphaSlider, 2, 1, 1, 1)
+        self.label = QtGui.QLabel(self.gridGroup)
+        self.label.setText(QtGui.QApplication.translate("Form", "Opacity", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setObjectName(_fromUtf8("label"))
+        self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1)
         self.alphaGroup = QtGui.QGroupBox(Form)
         self.alphaGroup.setGeometry(QtCore.QRect(10, 390, 234, 60))
+        self.alphaGroup.setTitle(QtGui.QApplication.translate("Form", "Alpha", None, QtGui.QApplication.UnicodeUTF8))
         self.alphaGroup.setCheckable(True)
         self.alphaGroup.setObjectName(_fromUtf8("alphaGroup"))
         self.horizontalLayout = QtGui.QHBoxLayout(self.alphaGroup)
         self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
         self.autoAlphaCheck = QtGui.QCheckBox(self.alphaGroup)
+        self.autoAlphaCheck.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
         self.autoAlphaCheck.setChecked(False)
         self.autoAlphaCheck.setObjectName(_fromUtf8("autoAlphaCheck"))
         self.horizontalLayout.addWidget(self.autoAlphaCheck)
         self.alphaSlider = QtGui.QSlider(self.alphaGroup)
         self.alphaSlider.setMaximum(1000)
-        self.alphaSlider.setProperty(_fromUtf8("value"), 1000)
+        self.alphaSlider.setProperty("value", 1000)
         self.alphaSlider.setOrientation(QtCore.Qt.Horizontal)
         self.alphaSlider.setObjectName(_fromUtf8("alphaSlider"))
         self.horizontalLayout.addWidget(self.alphaSlider)
@@ -110,21 +147,5 @@ class Ui_Form(object):
         QtCore.QMetaObject.connectSlotsByName(Form)
 
     def retranslateUi(self, Form):
-        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
-        self.averageGroup.setToolTip(QtGui.QApplication.translate("Form", "Display averages of the curves displayed in this plot. The parameter list allows you to choose parameters to average over (if any are available).", None, QtGui.QApplication.UnicodeUTF8))
-        self.averageGroup.setTitle(QtGui.QApplication.translate("Form", "Average", None, QtGui.QApplication.UnicodeUTF8))
-        self.decimateGroup.setTitle(QtGui.QApplication.translate("Form", "Downsample", None, QtGui.QApplication.UnicodeUTF8))
-        self.manualDecimateRadio.setText(QtGui.QApplication.translate("Form", "Manual", None, QtGui.QApplication.UnicodeUTF8))
-        self.autoDecimateRadio.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
-        self.maxTracesCheck.setToolTip(QtGui.QApplication.translate("Form", "If multiple curves are displayed in this plot, check this box to limit the number of traces that are displayed.", None, QtGui.QApplication.UnicodeUTF8))
-        self.maxTracesCheck.setText(QtGui.QApplication.translate("Form", "Max Traces:", None, QtGui.QApplication.UnicodeUTF8))
-        self.maxTracesSpin.setToolTip(QtGui.QApplication.translate("Form", "If multiple curves are displayed in this plot, check \"Max Traces\" and set this value to limit the number of traces that are displayed.", None, QtGui.QApplication.UnicodeUTF8))
-        self.forgetTracesCheck.setToolTip(QtGui.QApplication.translate("Form", "If MaxTraces is checked, remove curves from memory after they are hidden (saves memory, but traces can not be un-hidden).", None, QtGui.QApplication.UnicodeUTF8))
-        self.forgetTracesCheck.setText(QtGui.QApplication.translate("Form", "Forget hidden traces", None, QtGui.QApplication.UnicodeUTF8))
-        self.powerSpectrumGroup.setTitle(QtGui.QApplication.translate("Form", "Power Spectrum", None, QtGui.QApplication.UnicodeUTF8))
-        self.pointsGroup.setTitle(QtGui.QApplication.translate("Form", "Points", None, QtGui.QApplication.UnicodeUTF8))
-        self.autoPointsCheck.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
-        self.gridGroup.setTitle(QtGui.QApplication.translate("Form", "Grid", None, QtGui.QApplication.UnicodeUTF8))
-        self.alphaGroup.setTitle(QtGui.QApplication.translate("Form", "Alpha", None, QtGui.QApplication.UnicodeUTF8))
-        self.autoAlphaCheck.setText(QtGui.QApplication.translate("Form", "Auto", None, QtGui.QApplication.UnicodeUTF8))
+        pass
 
diff --git a/graphicsItems/PlotItem/plotConfigTemplate.ui b/graphicsItems/PlotItem/plotConfigTemplate.ui
index a9ae33d6d8de299ba971649372fceb0c5c0b4f78..a1807fd64549cf2584a9e374872b85f49c9dcf4e 100644
--- a/graphicsItems/PlotItem/plotConfigTemplate.ui
+++ b/graphicsItems/PlotItem/plotConfigTemplate.ui
@@ -50,7 +50,7 @@
    <property name="geometry">
     <rect>
      <x>0</x>
-     <y>30</y>
+     <y>70</y>
      <width>242</width>
      <height>160</height>
     </rect>
@@ -130,30 +130,44 @@
     </item>
    </layout>
   </widget>
-  <widget class="QGroupBox" name="powerSpectrumGroup">
+  <widget class="QFrame" name="transformGroup">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>242</width>
-     <height>41</height>
+     <width>154</width>
+     <height>79</height>
     </rect>
    </property>
-   <property name="title">
-    <string>Power Spectrum</string>
-   </property>
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>false</bool>
-   </property>
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <widget class="QCheckBox" name="fftCheck">
+      <property name="text">
+       <string>Power Spectrum (FFT)</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="0">
+     <widget class="QCheckBox" name="logXCheck">
+      <property name="text">
+       <string>Log X</string>
+      </property>
+     </widget>
+    </item>
+    <item row="2" column="0">
+     <widget class="QCheckBox" name="logYCheck">
+      <property name="text">
+       <string>Log Y</string>
+      </property>
+     </widget>
+    </item>
+   </layout>
   </widget>
   <widget class="QGroupBox" name="pointsGroup">
    <property name="geometry">
     <rect>
      <x>10</x>
-     <y>520</y>
+     <y>550</y>
      <width>234</width>
      <height>58</height>
     </rect>
@@ -177,26 +191,31 @@
     </item>
    </layout>
   </widget>
-  <widget class="QGroupBox" name="gridGroup">
+  <widget class="QFrame" name="gridGroup">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>460</y>
-     <width>234</width>
-     <height>60</height>
+     <width>221</width>
+     <height>81</height>
     </rect>
    </property>
-   <property name="title">
-    <string>Grid</string>
-   </property>
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>false</bool>
-   </property>
-   <layout class="QVBoxLayout" name="verticalLayout_4">
-    <item>
+   <layout class="QGridLayout" name="gridLayout_2">
+    <item row="0" column="0" colspan="2">
+     <widget class="QCheckBox" name="xGridCheck">
+      <property name="text">
+       <string>Show X Grid</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="0" colspan="2">
+     <widget class="QCheckBox" name="yGridCheck">
+      <property name="text">
+       <string>Show Y Grid</string>
+      </property>
+     </widget>
+    </item>
+    <item row="2" column="1">
      <widget class="QSlider" name="gridAlphaSlider">
       <property name="maximum">
        <number>255</number>
@@ -209,6 +228,13 @@
       </property>
      </widget>
     </item>
+    <item row="2" column="0">
+     <widget class="QLabel" name="label">
+      <property name="text">
+       <string>Opacity</string>
+      </property>
+     </widget>
+    </item>
    </layout>
   </widget>
   <widget class="QGroupBox" name="alphaGroup">