diff --git a/Data/LHE.hs b/Data/LHE.hs
--- a/Data/LHE.hs
+++ b/Data/LHE.hs
@@ -6,8 +6,8 @@
 
 -}
 module Data.LHE (
-  parseEventFile,
-  parseEvents,
+  parseFile,
+  parse,
 ) where
 
 import qualified Data.ByteString.Char8 as S
@@ -17,18 +17,43 @@
 
 import Data.LHA
 
+data RawRun = RawRun [String] [[String]]
+  deriving (Eq, Show)
+
 data RawEvent = RawEvent [String] [[String]]
   deriving (Eq, Show)
 
-parseEventFile :: String -> IO [Event]
-parseEventFile fname = do
-  S.readFile fname >>= return . parseEvents fname
+parseFile :: String -> IO (Run, [Event])
+parseFile fname = S.readFile fname >>= return . parse fname
 
-parseEvents :: String -> S.ByteString -> [Event]
-parseEvents fname dat =
-  let re = parseRawEvents fname dat in
+parse :: String -> S.ByteString -> (Run, [Event])
+parse fname dat =
+  let doc = xmlParse fname $ S.unpack dat in
+    (runFromDoc doc, eventsFromDoc doc)
+
+runFromDoc = makeRun . rawRunFromDoc
+
+eventsFromDoc d =
+  let re = rawEventsFromDoc d in
     map makeEvent re
 
+makeRun :: RawRun -> Run
+makeRun (RawRun (bpdg1:bpdg2:be1:be2:pdfg1:pdfg2:pdfs1:pdfs2:idwt:nproc:[]) ps) = Run
+  { runBeam = ( Beam (read bpdg1) (parseDouble be1) (read pdfg1) (read pdfs1)
+              , Beam (read bpdg1) (parseDouble be1) (read pdfg1) (read pdfs1)
+              )
+  , idwt    = read idwt
+  , nProc   = read nproc
+  , procs   = map makeProc ps
+  }
+
+makeProc :: [String] -> Subprocess
+makeProc (d1:d2:d3:i1:[]) = Subprocess
+  (parseDouble d1)
+  (parseDouble d2)
+  (parseDouble d3)
+  (read i1)
+
 makeEvent :: RawEvent -> Event
 makeEvent (RawEvent (n:idpr:xwgt:scal:aqed:aqcd:[]) rps) = Event
   { nPart     = read n
@@ -56,24 +81,35 @@
   }
 
 parseRawEventFile :: String -> IO [RawEvent]
-parseRawEventFile fname = do
-  S.readFile fname >>= return . parseRawEvents fname
+parseRawEventFile fname = S.readFile fname >>= return . parseRawEvents fname
 
 parseRawEvents :: String -> S.ByteString -> [RawEvent]
-parseRawEvents fname dat =
-  let Document _ _ (Elem eName _ eList) _ = xmlParse fname (S.unpack dat) in
-    map (getRawEvent . getElem) $ filter isEvent eList
+parseRawEvents fname dat = rawEventsFromDoc $ xmlParse fname $ S.unpack dat
+
+getElem (CElem (Elem _ _ c) _) = head $ filter isCString c
+  where isCString (CString _ _ _) = True
+        isCString _ = False
+
+rawEventsFromDoc (Document _ _ (Elem eName _ eList) _) =
+  map (getRawEvent . getElem) $ filter isEvent eList
   where
     isEvent (CElem (Elem (N "event") _ _) _) = True
     isEvent _ = False
-    isCString (CString _ _ _) = True
-    isCString _ = False
     parseLine = words
-    getElem (CElem (Elem _ _ c) _) = head $ filter isCString c
     getRawEvent (CString _ eStr _) =
       let eLines = filter (\x -> length x > 2) $ lines eStr in
         RawEvent (parseLine $ head eLines) (map parseLine $ tail eLines)
     getRawEvent _ = RawEvent [] []
+
+rawRunFromDoc (Document _ _ (Elem eName _ eList) _) =
+  getRawRun $ getElem $ head $ filter isInit eList
+  where
+    isInit (CElem (Elem (N "init") _ _) _) = True
+    isInit _ = False
+    getRawRun (CString _ rStr _) =
+      let rLines = filter (\x -> length x > 2) $ lines rStr in
+        RawRun (words $ head rLines) (map words $ tail rLines)
+    getRawRun _ = RawRun [] []
 
 parseDouble :: String -> Double
 parseDouble = read . reverse . dropWhile (=='.') . reverse
diff --git a/lhe.cabal b/lhe.cabal
--- a/lhe.cabal
+++ b/lhe.cabal
@@ -1,5 +1,5 @@
 Name:                lhe
-Version:             0.4
+Version:             0.5
 Synopsis:            Parser and writer for Les-Houches event files
 Description:         This package implements a parser and writer for the Les-Houches event file format as described in hep-ph/0609017
 License:             MIT
