diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,12 +3,13 @@
 env:
 # - GHCVER=7.6.3 # todo: re-enable this
  - GHCVER=7.8.3 # see note about Alex/Happy
+ - GHCVER=7.10.1 # see note about Alex/Happy
 
 before_install:
  - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
  - travis_retry sudo apt-get update
- - travis_retry sudo apt-get install cabal-install-1.18 ghc-$GHCVER libgsl0-dev liblapack-dev
- - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/1.18/bin:$PATH
+ - travis_retry sudo apt-get install cabal-install-1.22 ghc-$GHCVER libgsl0-dev liblapack-dev
+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/1.22/bin:$PATH
 
 install:
  - cabal update
@@ -26,7 +27,7 @@
  - cabal sdist   # tests that a source-distribution can be generated
 
 # The following scriptlet checks that the resulting source distribution can be built & installed
- - export SRC_TGZ=$(cabal-1.18 info . | awk '{print $2 ".tar.gz";exit}') ;
+ - export SRC_TGZ=$(cabal-1.22 info . | awk '{print $2 ".tar.gz";exit}') ;
    cd dist/;
    if [ -f "$SRC_TGZ" ]; then
       cabal install "$SRC_TGZ";
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -31,3 +31,7 @@
 ---
 * Hierarchical visibility clicking and inconsistent state
 * Merge new signal tree with old
+
+0.5.0.4
+---
+* Performance improvement
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013, Greg Horn
+Copyright (c) 2013-2015, Greg Horn
 
 All rights reserved.
 
diff --git a/Plot-ho-matic.cabal b/Plot-ho-matic.cabal
--- a/Plot-ho-matic.cabal
+++ b/Plot-ho-matic.cabal
@@ -1,11 +1,11 @@
 name:                Plot-ho-matic
-version:             0.5.0.3
+version:             0.5.0.4
 synopsis:            Real-time line plotter for protobuf-like data
 license:             BSD3
 license-file:        LICENSE
 author:              Greg Horn
 maintainer:          gregmainland@gmail.com
-copyright:           Copyright (c) 2013-2014, Greg Horn
+copyright:           Copyright (c) 2013-2015, Greg Horn
 category:            Graphics
 build-type:          Simple
 cabal-version:       >=1.10
diff --git a/src/PlotHo.hs b/src/PlotHo.hs
--- a/src/PlotHo.hs
+++ b/src/PlotHo.hs
@@ -270,10 +270,8 @@
         msg <- if statsEnabled
                then do
                  stats <- GHC.Stats.getGCStats
-                 return $ init $ unlines
-                   [ printf "The current memory usage is %.2f MB"
-                     ((realToFrac (GHC.Stats.currentBytesUsed stats) :: Double) /(1024*1024))
-                   ]
+                 return $ printf "The current memory usage is %.2f MB"
+                   ((realToFrac (GHC.Stats.currentBytesUsed stats) :: Double) /(1024*1024))
                else return "(enable GHC statistics with +RTS -T)"
         Gtk.postGUISync $ Gtk.labelSetText statsLabel ("Welcome to Plot-ho-matic!\n" ++ msg)
         statsWorker
diff --git a/src/PlotHo/GraphWidget.hs b/src/PlotHo/GraphWidget.hs
--- a/src/PlotHo/GraphWidget.hs
+++ b/src/PlotHo/GraphWidget.hs
@@ -6,7 +6,7 @@
        ) where
 
 import qualified Control.Concurrent as CC
-import Control.Monad ( when, unless )
+import Control.Monad ( void, when, unless )
 import qualified Data.IORef as IORef
 import qualified Data.Map as M
 import Data.Maybe ( isJust, fromJust )
@@ -62,10 +62,22 @@
   chartCanvas <- Gtk.drawingAreaNew
   _ <- Gtk.widgetSetSizeRequest chartCanvas 250 250
 
+  latestRenderableMVar <- CC.newEmptyMVar
+
   let redraw :: IO ()
       redraw = do
         renderable <- makeRenderable
-        chartGtkUpdateCanvas renderable chartCanvas
+        maybeLatestRenderable <- CC.tryTakeMVar latestRenderableMVar
+        case maybeLatestRenderable of
+         -- the other action is still waiting
+         Just _ -> CC.putMVar latestRenderableMVar renderable
+         -- there is no action waiting, post the action
+         Nothing -> do CC.putMVar latestRenderableMVar renderable
+                       void $ flip Gtk.idleAdd Gtk.priorityDefaultIdle $ do
+                         -- this might not be the same one if the messages have accumulated
+                         latestRenderable <- CC.takeMVar latestRenderableMVar
+                         chartGtkUpdateCanvas latestRenderable chartCanvas
+                         return False -- we're done now, don't call this again
 
   _ <- Gtk.onExpose chartCanvas $ const (redraw >> return True)
 
diff --git a/src/PlotHo/PlotTypes.hs b/src/PlotHo/PlotTypes.hs
--- a/src/PlotHo/PlotTypes.hs
+++ b/src/PlotHo/PlotTypes.hs
@@ -24,6 +24,7 @@
   , lviGetter :: Maybe (a -> [[(Double,Double)]])
   , lviMarked :: MarkedState
   }
+
 instance Show (ListViewInfo a) where
   show (ListViewInfo n t _ m) = "ListViewInfo " ++ show (n,t,m)
 
