diff --git a/Bio/Alignment/PSL.hs b/Bio/Alignment/PSL.hs
--- a/Bio/Alignment/PSL.hs
+++ b/Bio/Alignment/PSL.hs
@@ -8,6 +8,7 @@
 
 import qualified Data.ByteString.Lazy.Char8 as B
 import Data.ByteString.Lazy.Char8 (ByteString)
+import Data.List (intersperse)
 
 -- encodes the fields in a Blat PSL record
 -- NB! laziness issues, if not fully evaluated, this will hang onto the input.
@@ -17,24 +18,16 @@
                  , qname :: ByteString, qsize, qstart, qend :: Int
                  , tname :: ByteString, tsize, tstart, tend :: Int
                  , blockcount :: Int, blocksizes, qstarts, tstarts :: [Int]
-                 } deriving Show
-{-
-sread :: ByteString -> Strand
-sread b = case B.uncons b of 
-  Just ('-',_) -> Minus
-  Just ('+',_) -> Plus
-  _ -> error ("Cant't parse '"++B.unpack b++"' as strand")
+                 } deriving (Eq)
 
-swrite :: Strand -> ByteString
-swrite Minus = B.pack "-"
-swrite Plus  = B.pack "+"
--}
+instance Show PSL where 
+  show = B.unpack . unparsePSL . return
 
 readPSL :: FilePath -> IO [PSL]
 readPSL f = parsePSL `fmap` B.readFile f
 
 writePSL :: FilePath -> [PSL] -> IO ()
-writePSL f =  B.writeFile f . unparsePSL
+writePSL f =  B.writeFile f . B.append pslHeader . unparsePSL 
 
 parsePSL :: ByteString -> [PSL]
 parsePSL s = map parseLine $ B.lines $ dropHeader
@@ -51,11 +44,18 @@
 
 
 unparsePSL :: [PSL] -> ByteString
-unparsePSL bs = addHeader $ B.unlines $ map format1 bs
-  where addHeader = B.append pslHeader
-        format1 :: PSL -> ByteString
-        format1 = undefined
+unparsePSL = B.unlines . map format1
+  where format1 :: PSL -> ByteString
+        format1 (PSL m mm rm nc qc ql tgc tgl st qn qsz qst qed tn tsz tst ted bc bs qss tss) = 
+          B.concat $ intersperse tab $ (map showint [m, mm, rm, nc, qc, ql, tgc, tgl]
+                                        ++[st,qn]++map showint [qsz,qst,qed]
+                                        ++[tn]   ++map showint [tsz,tst,ted]
+                                        ++[showint bc]++map showlist [bs,qss,tss])
+        tab = B.pack "\t"
+        showint  = B.pack . show
+        showlist = B.pack . concat . map (++",") . map show
 
+pslHeader :: ByteString
 pslHeader = B.pack ("psLayout version 3\n\n"
                     ++"match\tmis- \trep. \tN's\tQ gap\tQ gap\tT gap\tT gap\tstrand\tQ        \tQ   \tQ    \tQ  \tT        \tT   \tT    \tT  \tblock\tblockSizes \tqStarts\t tStarts\n"
                     ++"     \tmatch\tmatch\t   \tcount\tbases\tcount\tbases\t      \tname     \tsize\tstart\tend\tname     \tsize\tstart\tend\tcount\n"
diff --git a/Bio/Sequence/Fasta.hs b/Bio/Sequence/Fasta.hs
--- a/Bio/Sequence/Fasta.hs
+++ b/Bio/Sequence/Fasta.hs
@@ -30,10 +30,7 @@
 
 -- import Data.Char (isSpace)
 import Data.List (groupBy,intersperse)
-import Data.Int
-import Data.Maybe
 import System.IO
-import Control.Monad
 
 import qualified Data.ByteString.Lazy.Char8 as B
 import qualified Data.ByteString.Lazy as BB
@@ -175,7 +172,7 @@
 -- | Split lines into blocks starting with '>' characters
 --   Filter out # comments (but not semicolons?)
 blocks :: [ByteString] -> [[ByteString]]
-blocks = groupBy (const (('>' /=) . B.head)) . filter ((/='#') . B.head) . filter (not . B.null)
+blocks = groupBy (const (('>' /=) . B.head)) . filter ((/='#') . B.head) . dropWhile (('>' /=) . B.head) . filter (not . B.null)
 
 countSeqs :: FilePath -> IO Int
 countSeqs f = do
diff --git a/bio.cabal b/bio.cabal
--- a/bio.cabal
+++ b/bio.cabal
@@ -1,5 +1,5 @@
 Name:                bio
-Version:             0.4.4
+Version:             0.4.5
 License:             LGPL
 License-file:        LICENSE
 Author:              Ketil Malde
