diff --git a/examples/PanningPlot.py b/examples/PanningPlot.py
new file mode 100644
index 0000000000000000000000000000000000000000..165240b2aeb95907fc512ce4143480720ed5f805
--- /dev/null
+++ b/examples/PanningPlot.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+Shows use of PlotWidget to display panning data
+
+"""
+import initExample ## Add path to library (just for examples; you do not need this)
+
+import pyqtgraph as pg
+from pyqtgraph.Qt import QtCore, QtGui
+import numpy as np
+
+win = pg.GraphicsWindow()
+win.setWindowTitle('pyqtgraph example: PanningPlot')
+
+plt = win.addPlot()
+#plt.setAutoVisibleOnly(y=True)
+curve = plt.plot()
+
+data = []
+count = 0
+def update():
+    global data, curve, count
+    data.append(np.random.normal(size=10) + np.sin(count * 0.1) * 5)
+    if len(data) > 100:
+        data.pop(0)
+    curve.setData(np.hstack(data))
+    count += 1
+
+timer = QtCore.QTimer()
+timer.timeout.connect(update)
+timer.start(50)
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+if __name__ == '__main__':
+    import sys
+    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+        QtGui.QApplication.instance().exec_()
diff --git a/pyqtgraph/graphicsItems/AxisItem.py b/pyqtgraph/graphicsItems/AxisItem.py
index 7081f0baad11b5023ec4a3ec2d3bfdae810d7558..c4e0138c6b168e91ad5de8532f6e4d3cd28d2ec0 100644
--- a/pyqtgraph/graphicsItems/AxisItem.py
+++ b/pyqtgraph/graphicsItems/AxisItem.py
@@ -380,7 +380,7 @@ class AxisItem(GraphicsWidget):
         This method is called whenever the axis needs to be redrawn and is a 
         good method to override in subclasses that require control over tick locations.
         
-        The return value must be a list of three tuples::
+        The return value must be a list of tuples, one for each set of ticks::
         
             [
                 (major tick spacing, offset),
diff --git a/pyqtgraph/graphicsItems/ViewBox/ViewBox.py b/pyqtgraph/graphicsItems/ViewBox/ViewBox.py
index 8769ed92a58347957f06e6d435f642874fe2c76e..338cdde4e17537365ca65168cef56c4e32df4ef2 100644
--- a/pyqtgraph/graphicsItems/ViewBox/ViewBox.py
+++ b/pyqtgraph/graphicsItems/ViewBox/ViewBox.py
@@ -950,7 +950,8 @@ class ViewBox(GraphicsWidget):
         dif = dif * -1
 
         ## Ignore axes if mouse is disabled
-        mask = np.array(self.state['mouseEnabled'], dtype=np.float)
+        mouseEnabled = np.array(self.state['mouseEnabled'], dtype=np.float)
+        mask = mouseEnabled.copy()
         if axis is not None:
             mask[1-axis] = 0.0
 
@@ -990,8 +991,8 @@ class ViewBox(GraphicsWidget):
             tr = self.childGroup.transform()
             tr = fn.invertQTransform(tr)
             
-            x = s[0] if mask[0] == 1 else None
-            y = s[1] if mask[1] == 1 else None
+            x = s[0] if mouseEnabled[0] == 1 else None
+            y = s[1] if mouseEnabled[1] == 1 else None
             
             center = Point(tr.map(ev.buttonDownPos(QtCore.Qt.RightButton)))
             self.scaleBy(x=x, y=y, center=center)
@@ -1321,6 +1322,8 @@ class ViewBox(GraphicsWidget):
                 k.destroyed.disconnect()
             except RuntimeError:  ## signal is already disconnected.
                 pass
+            except TypeError:  ## view has already been deleted (?)
+                pass
             
     def locate(self, item, timeout=3.0, children=False):
         """
diff --git a/pyqtgraph/multiprocess/processes.py b/pyqtgraph/multiprocess/processes.py
index 93a109ed87747b851fd847e1b76bdf89e39b3565..2b345e8b3cbacb859854d6a7dfb174ced2579048 100644
--- a/pyqtgraph/multiprocess/processes.py
+++ b/pyqtgraph/multiprocess/processes.py
@@ -79,7 +79,11 @@ class Process(RemoteEventHandler):
         sysPath = sys.path if copySysPath else None
         bootstrap = os.path.abspath(os.path.join(os.path.dirname(__file__), 'bootstrap.py'))
         self.debugMsg('Starting child process (%s %s)' % (executable, bootstrap))
-        self.proc = subprocess.Popen((executable, bootstrap), stdin=subprocess.PIPE)
+        
+        ## note: we need all three streams to have their own PIPE due to this bug:
+        ## http://bugs.python.org/issue3905 
+        self.proc = subprocess.Popen((executable, bootstrap), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        
         targetStr = pickle.dumps(target)  ## double-pickle target so that child has a chance to 
                                           ## set its sys.path properly before unpickling the target
         pid = os.getpid() # we must send pid to child because windows does not have getppid
diff --git a/pyqtgraph/widgets/GraphicsView.py b/pyqtgraph/widgets/GraphicsView.py
index dd49ab7dc70989da6bf809e5e7b5e0c8ee57b351..6ddfe93033f132767563049048b2809f9a59276b 100644
--- a/pyqtgraph/widgets/GraphicsView.py
+++ b/pyqtgraph/widgets/GraphicsView.py
@@ -181,8 +181,9 @@ class GraphicsView(QtGui.QGraphicsView):
         if self.centralWidget is not None:
             self.scene().removeItem(self.centralWidget)
         self.centralWidget = item
-        self.sceneObj.addItem(item)
-        self.resizeEvent(None)
+        if item is not None:
+            self.sceneObj.addItem(item)
+            self.resizeEvent(None)
         
     def addItem(self, *args):
         return self.scene().addItem(*args)
@@ -272,7 +273,8 @@ class GraphicsView(QtGui.QGraphicsView):
             scaleChanged = True
         self.range = newRect
         #print "New Range:", self.range
-        self.centralWidget.setGeometry(self.range)
+        if self.centralWidget is not None:
+            self.centralWidget.setGeometry(self.range)
         self.updateMatrix(propagate)
         if scaleChanged:
             self.sigScaleChanged.emit(self)