diff --git a/Codec/Archive/Zip.hs b/Codec/Archive/Zip.hs
--- a/Codec/Archive/Zip.hs
+++ b/Codec/Archive/Zip.hs
@@ -65,7 +65,7 @@
 import System.FilePath
 import System.Directory ( doesDirectoryExist, getDirectoryContents, createDirectoryIfMissing )
 import qualified Control.Monad.State as S
-import Control.Monad ( when, unless, zipWithM )
+import Control.Monad ( when, unless, zipWithM, liftM )
 import System.Directory ( getModificationTime )
 import System.IO ( stderr, hPutStrLn )
 import qualified Data.Digest.CRC32 as CRC32
@@ -468,6 +468,12 @@
 --
 -- >    file name (variable size)
 -- >    extra field (variable size)
+--
+-- Note that if bit 3 of the general purpose bit flag is set, then the
+-- compressed size will be 0 and the size will be stored instead in a
+-- data descriptor record AFTER the file contents. The record normally
+-- begins with the signature 0x08074b50, then 4 bytes crc-32, 4 bytes
+-- compressed size, 4 bytes uncompressed size.
 
 getLocalFile :: Get (Maybe (Word32, B.ByteString))
 getLocalFile = do
@@ -478,7 +484,7 @@
       offset <- bytesRead
       skip 4  -- signature
       skip 2  -- version
-      skip 2  -- general purpose bit flag
+      bitflag <- getWord16le
       skip 2  -- compressionMethod
       skip 2  -- last mod file time
       skip 2  -- last mod file date
@@ -491,7 +497,25 @@
       extraFieldLength <- getWord16le
       skip (fromIntegral fileNameLength)  -- filename
       skip (fromIntegral extraFieldLength) -- extra field
-      compressedData <- getLazyByteString (fromIntegral compressedSize)
+      compressedData <- if bitflag .&. 0O10 == 0
+          then getLazyByteString (fromIntegral compressedSize)
+          else -- If bit 3 of general purpose bit flag is set,
+               -- then we need to read until we get to the
+               -- data descriptor record.  We assume that the
+               -- record has signature 0x08074b50; this is not required
+               -- by the specification but is common.
+               do raw <- many $ do
+                           s <- lookAhead getWord32le
+                           if s == 0x08074b50
+                              then return Nothing
+                              else liftM Just getWord8
+                  skip 4 -- signature
+                  skip 4 -- crc32
+                  cs <- getWord32le  -- compressed size
+                  skip 4 -- uncompressed size
+                  if fromIntegral cs == length raw
+                     then return $ B.pack raw
+                     else fail "Content size mismatch in data descriptor record" 
       return $ Just (fromIntegral offset, compressedData)
 
 putLocalFile :: Entry -> Put
diff --git a/Zip.hs b/Zip.hs
--- a/Zip.hs
+++ b/Zip.hs
@@ -45,7 +45,7 @@
   progname <- getProgName
   let header = "Usage: " ++ progname ++ " [OPTION...] archive files..."
   (opts, args) <- case getOpt Permute options argv of
-      (o, _, _)      | Version `elem` o -> putStrLn "version 0.1.1.3" >> exitWith ExitSuccess
+      (o, _, _)      | Version `elem` o -> putStrLn "version 0.1.1.4" >> exitWith ExitSuccess
       (o, _, _)      | Help `elem` o    -> error $ usageInfo header options
       (o, (a:as), [])                   -> return (o, a:as)
       (_, _, errs)                      -> error $ concat errs ++ "\n" ++ usageInfo header options
diff --git a/zip-archive.cabal b/zip-archive.cabal
--- a/zip-archive.cabal
+++ b/zip-archive.cabal
@@ -1,5 +1,5 @@
 Name:                zip-archive
-Version:             0.1.1.3
+Version:             0.1.1.4
 Cabal-version:       >= 1.2
 Build-type:          Simple
 Synopsis:            Library for creating and modifying zip archives.
@@ -22,13 +22,13 @@
 
 Library 
   if flag(splitBase)
-    Build-depends:   base >= 3, pretty, containers
+    Build-depends:   base >= 3 && < 5, pretty, containers
   else
     Build-depends:   base < 3
   Build-depends:     binary, zlib, filepath, directory, bytestring >= 0.9.0, array, mtl, utf8-string >= 0.3.1, old-time, digest >= 0.0.0.1
   Exposed-modules:   Codec.Archive.Zip
   Hs-Source-Dirs:    .
-  Ghc-Options:       -Wall -O2
+  Ghc-Options:       -Wall
   Extensions:        CPP
   if os(windows)
     cpp-options:     -D_WINDOWS
@@ -41,4 +41,4 @@
   else
     Buildable:       False
   Main-is:           Zip.hs
-  Ghc-Options:       -Wall -O2
+  Ghc-Options:       -Wall
