diff --git a/internetmarke.cabal b/internetmarke.cabal
--- a/internetmarke.cabal
+++ b/internetmarke.cabal
@@ -1,5 +1,5 @@
 Name:           internetmarke
-Version:        0.0.1
+Version:        0.0.2
 License:        GPL
 License-File:   LICENSE
 Author:         Henning Thielemann <haskell@henning-thielemann.de>
@@ -47,7 +47,7 @@
 
 Executable internetmarke
   Build-Depends:
-    explicit-exception >= 0.0.1 && < 0.1,
+    explicit-exception >= 0.0.2 && < 0.1,
     mtl >= 1.1 && < 1.2,
     process >= 1.0 && < 1.1,
     parsec >= 2.1 && < 2.2,
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -15,7 +15,8 @@
 
 import System.Cmd (rawSystem, )
 import System.Process (runInteractiveProcess, waitForProcess, )
-import System.IO (hGetContents, )
+import System.IO (withFile, hGetContents, hGetChar, IOMode(ReadMode), )
+import System.IO.Error (ioeGetFileName, isDoesNotExistError, )
 
 import Paths_internetmarke (getDataDir, )
 import System.Console.GetOpt (getOpt, ArgOrder(..), OptDescr(..), ArgDescr(..), usageInfo, )
@@ -24,8 +25,9 @@
 
 import Control.Monad (liftM, liftM2, liftM3, when, guard, )
 import Control.Monad.Trans (lift, )
+import Control.Monad.State (StateT, evalStateT, gets, modify, )
 import qualified Control.Monad.Exception.Synchronous as Exc
-import Control.Exception (try, )
+import Control.Exception (try, ioErrors, )
 
 
 data Picture = Picture {
@@ -309,18 +311,67 @@
 
       Exc.fromEitherT $ readJpegFile jpegPath
 
-loadMatrixCode :: Int -> Exc.ExceptionalT String IO (JpegFile,JpegFile)
-loadMatrixCode n =
-   liftM2 (,)
-      (loadPPMasJPEG $ matrixCodePathPrefix ++ "-" ++ showInt3 (3*n))
-      (loadPPMasJPEG $ matrixCodePathPrefix ++ "-" ++ showInt3 (3*n+1))
+{- lazy hGetContents fails badly here, because the stream is closed before we can check its content
+checkFilePrefix :: String -> FilePath -> IO Bool
+checkFilePrefix prefix path =
+   withFile path ReadMode (fmap (isPrefixOf prefix) . hGetContents)
+-}
 
+checkFilePrefix :: String -> FilePath -> Exc.ExceptionalT String IO Bool
+checkFilePrefix prefix path =
+   Exc.catchT
+      (Exc.fromEitherT $ try $
+       withFile path ReadMode $ \h ->
+          fmap and $ mapM (\c -> fmap (c==) (hGetChar h)) prefix)
+      (\e ->
+          (case ioErrors e of
+             Just ioe ->
+                when (isDoesNotExistError ioe)
+                   (Exc.throwT $
+                       "file " ++ show (maybe "" id (ioeGetFileName ioe)) ++ " not found for opening.\n" ++
+                       "This may indicate that there are no images with the expected sizes,\n" ++
+                       "which in turn may mean, that the Post company changed the sizes of the Data Code Matrix.")
+             _ -> return ()) >>
+          Exc.throwT (show e))
 
+lazyMonadicAnd :: (Monad m) => m Bool -> m Bool -> m Bool
+lazyMonadicAnd m0 m1 =
+   m0 >>= \b ->
+   if b
+     then m1
+     else return False
+
+{- |
+We identify the matrix code according to its size.
+If the Post changes the sizes this will fail.
+-}
+loadMatrixCode :: StateT Int (Exc.ExceptionalT String IO) (JpegFile,JpegFile)
+loadMatrixCode =
+   do fn0 <- gets makeMatrixCodePath
+      modify succ
+      fn1 <- gets makeMatrixCodePath
+
+      b <- lift $
+         checkFilePrefix "P6\n30 156\n" (fn0++".ppm") `lazyMonadicAnd`
+         checkFilePrefix "P6\n156 156\n" (fn1++".ppm")
+      if b
+        then
+          do modify succ
+             lift $ liftM2 (,)
+                (loadPPMasJPEG fn0)
+                (loadPPMasJPEG fn1)
+        else
+          loadMatrixCode
+
+
 -- * process shell arguments
 
 matrixCodePathPrefix :: FilePath
 matrixCodePathPrefix  =  "/tmp/internetmarke"
 
+makeMatrixCodePath :: Int -> FilePath
+makeMatrixCodePath n  =  matrixCodePathPrefix ++ "-" ++ showInt3 n
+
 logoFileName :: FilePath
 logoFileName  =  "Deutsche-Post-Logo.svg"
 
@@ -402,7 +453,7 @@
 
    exitCodeToException $
       rawSystem "pdfimages" [pdfInput, matrixCodePathPrefix]
-   codeFiles <- mapM loadMatrixCode (zipWith const [0..] stamps)
+   codeFiles <- evalStateT (mapM (const loadMatrixCode) stamps) 0
 
    imageFile <- Traversable.mapM (Exc.fromEitherT . readJpegFile) $ optPicture flags
 
