Index: src/main/java/org/apache/james/mime4j/message/Message.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Message.java	(revision 698866)
+++ src/main/java/org/apache/james/mime4j/message/Message.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.james.mime4j.message;
 
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.MimeIOException;
 import org.apache.james.mime4j.field.Field;
 import org.apache.james.mime4j.field.UnstructuredField;
 import org.apache.james.mime4j.parser.MimeEntityConfig;
@@ -55,11 +56,16 @@
      * 
      * @param is the stream to parse.
      * @throws IOException on I/O errors.
+     * @throws MimeIOException on MIME protocol violations.
      */
-    public Message(InputStream is, MimeEntityConfig config) throws MimeException, IOException {
+    public Message(InputStream is, MimeEntityConfig config) throws IOException {
         MimeStreamParser parser = new MimeStreamParser(config);
         parser.setContentHandler(new MessageBuilder(this));
-        parser.parse(is);
+        try {
+            parser.parse(is);
+        } catch (MimeException ex) {
+            throw new MimeIOException(ex);
+        }
     }
 
     /**
Index: src/main/java/org/apache/james/mime4j/message/Header.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Header.java	(revision 698866)
+++ src/main/java/org/apache/james/mime4j/message/Header.java	(working copy)
@@ -32,6 +32,7 @@
 import java.util.List;
 
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.MimeIOException;
 import org.apache.james.mime4j.field.ContentTypeField;
 import org.apache.james.mime4j.field.Field;
 import org.apache.james.mime4j.parser.AbstractContentHandler;
@@ -61,8 +62,11 @@
      * Creates a new <code>Header</code> from the specified stream.
      * 
      * @param is the stream to read the header from.
+     * 
+     * @throws IOException on I/O errors.
+     * @throws MimeIOException on MIME protocol violations.
      */
-    public Header(InputStream is) throws MimeException, IOException {
+    public Header(InputStream is) throws IOException {
         final MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
             public void endHeader() {
@@ -72,7 +76,11 @@
                 addField(Field.parse(fieldData));
             }
         });
-        parser.parse(is);
+        try {
+            parser.parse(is);
+        } catch (MimeException ex) {
+            throw new MimeIOException(ex);
+        }
     }
 
     /**
Index: src/main/java/org/apache/james/mime4j/MimeException.java
===================================================================
--- src/main/java/org/apache/james/mime4j/MimeException.java	(revision 698866)
+++ src/main/java/org/apache/james/mime4j/MimeException.java	(working copy)
@@ -16,12 +16,10 @@
  */
 package org.apache.james.mime4j;
 
-import java.io.IOException;
-
 /**
  * MIME processing exception.
  */
-public class MimeException extends IOException {
+public class MimeException extends Exception {
 
     private static final long serialVersionUID = 8352821278714188542L;
 
Index: src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java	(revision 698866)
+++ src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java	(working copy)
@@ -167,7 +167,7 @@
         }
     }
 
-    protected boolean parseField() throws IOException {
+    protected boolean parseField() throws MimeException, IOException {
         int maxHeaderLimit = config.getMaxHeaderCount();
         for (;;) {
             if (endOfHeader) {
Index: src/main/java/org/apache/james/mime4j/parser/MimeEntity.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/MimeEntity.java	(revision 698866)
+++ src/main/java/org/apache/james/mime4j/parser/MimeEntity.java	(working copy)
@@ -189,7 +189,7 @@
         return null;
     }
 
-    private void createMimeStream() throws IOException {
+    private void createMimeStream() throws MimeException, IOException {
         String boundary = body.getBoundary();
         int bufferSize = 2 * boundary.length();
         if (bufferSize < 4096) {
Index: src/main/java/org/apache/james/mime4j/MimeIOException.java
===================================================================
--- src/main/java/org/apache/james/mime4j/MimeIOException.java	(revision 0)
+++ src/main/java/org/apache/james/mime4j/MimeIOException.java	(revision 0)
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.james.mime4j;
+
+import java.io.IOException;
+
+/**
+ * A wrapper class based on {@link IOException} for MIME protocol 
+ * exceptions.
+ */
+public class MimeIOException extends IOException {
+
+    private static final long serialVersionUID = 5393613459533735409L;
+
+    /**
+     * Constructs an IO exception based on {@link MimeException}.
+     *
+     * @param ex cause
+     */
+    public MimeIOException(MimeException cause) {
+        super(cause.getMessage());
+        initCause(cause);
+    }
+
+}
