diff --git a/Tools/StatePlot.hs b/Tools/StatePlot.hs
--- a/Tools/StatePlot.hs
+++ b/Tools/StatePlot.hs
@@ -43,8 +43,8 @@
 diffToMillis t2 t1 = fromIntegral (truncate (1000000*d)) / 1000
  where d = diffUTCTime (localTimeToUTC utc t2) (localTimeToUTC utc t1)
 
-renderEvents :: Double -> Double -> [Event] -> Renderable ()
-renderEvents bandHeight ticksIntervalMs es = Renderable {minsize = return (0,0), render = render'}
+renderEvents :: Double -> Double -> [Event] -> (Event -> Event -> Ordering) -> Renderable ()
+renderEvents bandHeight ticksIntervalMs es cmpTracks = Renderable {minsize = return (0,0), render = render'}
   where 
     events = sortBy (comparing time) es
     minTime = time $ head events
@@ -52,20 +52,17 @@
     time2ms t = diffToMillis t minTime
     rangeMs = time2ms maxTime
     ticks = takeWhile (<rangeMs) $ iterate (+ticksIntervalMs) 0
-    tracks = sortBy (comparing (time . head)) . groupBy ((==) `on` track) . sortBy (comparing track) $ events
+    tracks = sortBy (\as bs -> cmpTracks (head as) (head bs)) . groupBy ((==) `on` track) . sortBy (comparing track) $ events
 
     maybeM :: (Monad m) => (a -> m b) -> Maybe a -> m ()
     maybeM f Nothing  = return ()
     maybeM f (Just x) = f x >> return ()
 
-    bars track = execWriter $ evalStateT (mapM step (track++[Event maxTime undefined End])) Nothing
+    bars track = execWriter . (`evalStateT` Nothing) . mapM_ step $ track++[Event maxTime undefined End]
       where
-        step (Event t _ (Begin c)) = do
-          get >>= maybeM (\(t0,c0) -> tell [(time2ms t0, time2ms t, c0)])
-          put (Just (t,c))
-        step (Event t _ End      ) = do
+        step (Event t _ edge) = do
           get >>= maybeM (\(t0,c0) -> tell [(time2ms t0, time2ms t, c0)])
-          put Nothing
+          put (case edge of { Begin c -> Just (t,c); End -> Nothing })
 
     render' (w,h) = do
       let ms2x ms = 10 + ms / rangeMs * (w - 10)
@@ -101,7 +98,7 @@
 
 showHelp = mapM_ putStrLn [
     "splot - a tool for visualizing the lifecycle of many concurrent multi-stage processes. See http://www.haskell.org/haskellwiki/Splot",
-    "Usage: splot [-o PNGFILE] [-w WIDTH] [-h HEIGHT] [-bh BARHEIGHT] [-tf TIMEFORMAT]",
+    "Usage: splot [-o PNGFILE] [-w WIDTH] [-h HEIGHT] [-bh BARHEIGHT] [-tf TIMEFORMAT] [-sort SORT]",
     "             [-tickInterval TICKINTERVAL]",
     "  -o PNGFILE    - filename to which the output will be written in PNG format.",
     "                  If omitted, it will be shown in a window.",
@@ -111,6 +108,8 @@
     "  -tf           - time format, as in http://linux.die.net/man/3/strptime but with ",
     "                  fractional seconds supported via %OS - will parse 12.4039 or 12,4039",
     "  -tickInterval - ticks on the X axis will be this often (in millis).",
+    "  -sort SORT    - sort tracks by SORT, where: 'time' - sort by time of first event, ",
+    "                  'name' - sort by track name",
     "",
     "Input is read from stdin. Example input (speaks for itself):",
     "2010-10-21 16:45:09,431 >foo green",
@@ -138,7 +137,8 @@
   let outPNG = getArg "o" "" args
   input <- B.getContents
   let events = parse parseTime `map` B.lines input
-  let pic = renderEvents bandHeight ticksIntervalMs events
+  let cmpTracks = case getArg "sort" "time"  args of { "time" -> comparing time ; "name" -> comparing track }
+  let pic = renderEvents bandHeight ticksIntervalMs events cmpTracks
   case outPNG of
     "" -> renderableToWindow pic w h
     f  -> const () `fmap` renderableToPNGFile pic w h outPNG
diff --git a/splot.cabal b/splot.cabal
--- a/splot.cabal
+++ b/splot.cabal
@@ -1,5 +1,5 @@
 Name: splot
-Version: 0.1.3
+Version: 0.1.4
 License: BSD3
 License-file: LICENSE
 Copyright: Eugene Kirpichov, 2010
