diff --git a/dicom.cabal b/dicom.cabal
--- a/dicom.cabal
+++ b/dicom.cabal
@@ -1,5 +1,5 @@
 name:                dicom
-version:             0.2.0.0
+version:             0.3.0.0
 synopsis:            A library for reading and writing DICOM files in the Explicit VR Little Endian transfer syntax.
 license:             GPL-3
 license-file:        LICENSE
diff --git a/src/Data/DICOM/Object.hs b/src/Data/DICOM/Object.hs
--- a/src/Data/DICOM/Object.hs
+++ b/src/Data/DICOM/Object.hs
@@ -95,8 +95,14 @@
 
 data ElementContent
   = BytesContent B.ByteString
-  | SequenceContent Sequence deriving (Show, Eq)
+  | FragmentContent [B.ByteString]
+  | SequenceContent Sequence deriving Eq
 
+instance Show ElementContent where
+  showsPrec p (BytesContent _)    = showParen (p > 10) $ showString "BytesContent {..}"
+  showsPrec p (FragmentContent f) = showParen (p > 10) $ showString "FragmentContent { length = " . shows (length f) . showString " }"
+  showsPrec p (SequenceContent s) = showParen (p > 10) $ showString "SequenceContent " . showsPrec 11 s
+
 data Element = Element
   { elementTag     :: Tag
   , elementVL      :: VL
@@ -126,7 +132,10 @@
     content <- case _vr of
       SQ -> SequenceContent <$> readSequence _vl
       _  -> case _vl of
-              UndefinedValueLength -> failWithOffset "Undefined VL not implemented"
+              UndefinedValueLength ->
+                case _tag of
+                  PixelData -> FragmentContent <$> readFragmentData
+                  _ -> failWithOffset "Undefined VL not implemented"
               _ -> do
                 bytes <- getByteString $ fromIntegral $ runVL _vl
                 return $ BytesContent bytes
@@ -141,6 +150,7 @@
     case elementContent el of
       SequenceContent s -> writeSequence (elementVL el) s
       BytesContent bs -> putByteString bs
+      FragmentContent _ -> fail "Fragment content is not supported for writing."
 
 readSequence :: VL -> Get Sequence
 readSequence UndefinedValueLength = do
@@ -159,6 +169,19 @@
       putWord32le 0
     _ -> return ()
 
+readFragmentData :: Get [B.ByteString]
+readFragmentData = do
+  els <- untilG (isSequenceDelimitationItem <$> get) $ do
+    t <- get
+    case t of
+      Item -> do
+        itemLength <- getWord32le
+        getByteString $ fromIntegral $ itemLength
+      _ -> failWithOffset "Expected Item tag"
+  SequenceDelimitationItem <- get
+  skip 4
+  return els
+
 instance Binary SequenceItem where
   get = do
     t <- get
@@ -174,7 +197,7 @@
           _ -> do
             els <- untilByteCount (fromIntegral itemLength) get
             return $ SequenceItem itemLength els
-      _ -> failWithOffset "Unexpected tag"
+      _ -> failWithOffset "Expected Item tag"
   put si = do
     put Item
     putWord32le $ sequenceItemLength si
@@ -201,7 +224,7 @@
   start <- bytesRead
   flip untilG a $ do
     end <- bytesRead
-    return (end - start < count)
+    return (end - start >= count)
 
 isVLReserved :: VR -> Bool
 isVLReserved OB = True
@@ -355,4 +378,3 @@
 
 object :: [Element] -> Object
 object = Object . sortBy (compare `on` elementTag)
-
diff --git a/src/Data/DICOM/Tag.hs b/src/Data/DICOM/Tag.hs
--- a/src/Data/DICOM/Tag.hs
+++ b/src/Data/DICOM/Tag.hs
@@ -23,6 +23,7 @@
   , pattern Item
   , pattern ItemDelimitationItem
   , pattern SequenceDelimitationItem
+  , pattern PixelData
 
   , tag
   ) where
@@ -66,6 +67,8 @@
 pattern Item                         = Tag SequenceGroup (TagElement 0xE000)
 pattern ItemDelimitationItem         = Tag SequenceGroup (TagElement 0xE00D)
 pattern SequenceDelimitationItem     = Tag SequenceGroup (TagElement 0xE0DD)
+
+pattern PixelData                    = Tag (TagGroup 0x7FE0) (TagElement 0x0010)
 
 -- Smart constructors
 
