https://issues.apache.org/jira/browse/OPENWIRE-11

Initial work to remove JMS dependency.  
diff --git a/openwire-core/pom.xml b/openwire-core/pom.xml
index 62077dd..75549e7 100644
--- a/openwire-core/pom.xml
+++ b/openwire-core/pom.xml
@@ -48,10 +48,6 @@
       <groupId>org.fusesource.hawtbuf</groupId>
       <artifactId>hawtbuf</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jms_1.1_spec</artifactId>
-    </dependency>
 
     <!-- =================================== -->
     <!-- Testing Dependencies                -->
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/Message.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/Message.java
index 3c6c57b..132ca54 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/Message.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/Message.java
@@ -28,13 +28,11 @@
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import javax.jms.JMSException;
-
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
 import org.apache.activemq.openwire.annotations.OpenWireProperty;
 import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.codec.OpenWireFormat;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.apache.activemq.openwire.utils.OpenWireMarshallingSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.ByteArrayInputStream;
@@ -43,8 +41,6 @@
 
 /**
  * Represents an ActiveMQ message
- *
- * @openwire:marshaller
  */
 @OpenWireType(typeCode = 0, marshalAware = true)
 public abstract class Message extends BaseCommand implements MarshallAware {
@@ -153,12 +149,12 @@
     protected Map<String, Object> properties;
 
     public abstract Message copy();
-    public abstract void clearBody() throws JMSException;
+    public abstract void clearBody() throws IOException;
     public abstract void storeContent();
     public abstract void storeContentAndClear();
 
     // useful to reduce the memory footprint of a persisted message
-    public void clearMarshalledState() throws JMSException {
+    public void clearMarshalledState() throws IOException {
         properties = null;
     }
 
@@ -216,20 +212,20 @@
         return Collections.unmodifiableMap(properties);
     }
 
-    public void clearProperties() throws JMSException {
+    public void clearProperties() throws IOException {
         marshalledProperties = null;
         properties = null;
     }
 
-    public Object getProperty(String name) throws JMSException {
+    public Object getProperty(String name) throws IOException {
         if (properties == null) {
             if (marshalledProperties == null) {
                 return null;
             }
             try {
                 properties = unmarsallProperties(marshalledProperties);
-            } catch (IOException e) {
-                throw ExceptionSupport.create("Error during properties unmarshal, reason: " + e.getMessage(), e);
+            } catch (Exception e) {
+                throw IOExceptionSupport.create("Error during properties unmarshal, reason: " + e.getMessage(), e);
             }
         }
         Object result = properties.get(name);
@@ -240,25 +236,25 @@
         return result;
     }
 
-    public void setProperty(String name, Object value) throws JMSException {
+    public void setProperty(String name, Object value) throws IOException {
         lazyCreateProperties();
         properties.put(name, value);
     }
 
-    public void removeProperty(String name) throws JMSException {
+    public void removeProperty(String name) throws IOException {
         lazyCreateProperties();
         properties.remove(name);
     }
 
-    protected void lazyCreateProperties() throws JMSException {
+    protected void lazyCreateProperties() throws IOException {
         if (properties == null) {
             if (marshalledProperties == null) {
                 properties = new HashMap<String, Object>();
             } else {
                 try {
                     properties = unmarsallProperties(marshalledProperties);
-                } catch (IOException e) {
-                    throw ExceptionSupport.create(
+                } catch (Exception e) {
+                    throw IOExceptionSupport.create(
                         "Error during properties unmarshal, reason: " + e.getMessage(), e);
                 }
                 marshalledProperties = null;
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBlobMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBlobMessage.java
index 561793e..d8636ad 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBlobMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBlobMessage.java
@@ -17,20 +17,15 @@
 package org.apache.activemq.openwire.commands;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 
-import javax.jms.JMSException;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
 import org.apache.activemq.openwire.annotations.OpenWireProperty;
+import org.apache.activemq.openwire.annotations.OpenWireType;
 
 /**
  * An implementation of ActiveMQ's BlobMessage for out of band BLOB transfer
- *
- * openwire:marshaller code="29"
  */
 @OpenWireType(typeCode = 29, version = 3)
 public class OpenWireBlobMessage extends OpenWireMessage {
@@ -126,16 +121,12 @@
         this.deletedByBroker = deletedByBroker;
     }
 
-    public InputStream getInputStream() throws IOException, JMSException {
-        return null;
-    }
-
-    public URL getURL() throws JMSException {
+    public URL getURL() throws IOException {
         if (url == null && remoteBlobUrl != null) {
             try {
                 url = new URL(remoteBlobUrl);
             } catch (MalformedURLException e) {
-                throw new JMSException(e.getMessage());
+                throw new IOException(e.getMessage());
             }
         }
         return url;
@@ -145,16 +136,4 @@
         this.url = url;
         remoteBlobUrl = url != null ? url.toExternalForm() : null;
     }
-
-    @Override
-    public void onSend() throws JMSException {
-        super.onSend();
-
-        // lets ensure we upload the BLOB first out of band before we send the
-        // message
-        // TODO - Lets support this later.
-    }
-
-    public void deleteFile() throws IOException, JMSException {
-    }
 }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBytesMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBytesMessage.java
index 33f922c..1adbb0c 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBytesMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireBytesMessage.java
@@ -21,9 +21,6 @@
 import java.util.zip.Deflater;
 import java.util.zip.Inflater;
 
-import javax.jms.JMSException;
-import javax.jms.MessageNotReadableException;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.BufferEditor;
@@ -70,12 +67,10 @@
      * of where the pointer for reading the message is currently located.
      *
      * @return number of bytes in the message
-     * @throws JMSException if the JMS provider fails to read the message due to
-     *                 some internal error.
-     * @throws MessageNotReadableException if the message is in write-only mode.
-     * @since 1.1
+     *
+     * @throws IOException if there is an error in retrieving the body length value.
      */
-    public long getBodyLength() throws JMSException {
+    public long getBodyLength() throws IOException {
         if (compressed) {
             return getBodyBytes().length;
         } else if (content != null) {
@@ -96,9 +91,9 @@
      *
      * @return a copy of the message contents, uncompressed as needed.
      *
-     * @throws JMSException if an error occurs while accessing the message payload.
+     * @throws IOException if an error occurs while accessing the message payload.
      */
-    public byte[] getBodyBytes() throws JMSException {
+    public byte[] getBodyBytes() throws IOException {
         Buffer data = getPayload();
         if (data == null) {
             data = new Buffer(new byte[] {}, 0, 0);
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireDestination.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireDestination.java
index 04bb1f3..91c5d74 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireDestination.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireDestination.java
@@ -26,27 +26,16 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Queue;
-import javax.jms.TemporaryQueue;
-import javax.jms.TemporaryTopic;
-import javax.jms.Topic;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
 import org.apache.activemq.openwire.annotations.OpenWireProperty;
-import org.apache.activemq.openwire.utils.DefaultUnresolvedDestinationTransformer;
-import org.apache.activemq.openwire.utils.UnresolvedDestinationTransformer;
+import org.apache.activemq.openwire.annotations.OpenWireType;
 
 /**
  * Base Destination class used to provide most of the utilities necessary to deal
  * with incoming and outgoing destination processing.
- *
- * @openwire:marshaller
  */
 @OpenWireType(typeCode = 0)
-public abstract class OpenWireDestination implements Destination, DataStructure, Comparable<OpenWireDestination> {
+public abstract class OpenWireDestination implements DataStructure, Comparable<OpenWireDestination> {
 
     public static final String PATH_SEPERATOR = ".";
     public static final char COMPOSITE_SEPERATOR = ',';
@@ -82,8 +71,6 @@
     @OpenWireExtension(serialized = true)
     protected Map<String, String> options;
 
-    protected static UnresolvedDestinationTransformer unresolvableDestinationTransformer = new DefaultUnresolvedDestinationTransformer();
-
     public OpenWireDestination() {
     }
 
@@ -122,40 +109,6 @@
         }
     }
 
-    public static OpenWireDestination transform(Destination dest) throws JMSException {
-        if (dest == null) {
-            return null;
-        }
-        if (dest instanceof OpenWireDestination) {
-            return (OpenWireDestination)dest;
-        }
-
-        if (dest instanceof Queue && dest instanceof Topic) {
-            String queueName = ((Queue) dest).getQueueName();
-            String topicName = ((Topic) dest).getTopicName();
-            if (queueName != null && topicName == null) {
-                return new OpenWireQueue(queueName);
-            } else if (queueName == null && topicName != null) {
-                return new OpenWireTopic(topicName);
-            } else {
-                return unresolvableDestinationTransformer.transform(dest);
-            }
-        }
-        if (dest instanceof TemporaryQueue) {
-            return new OpenWireTempQueue(((TemporaryQueue)dest).getQueueName());
-        }
-        if (dest instanceof TemporaryTopic) {
-            return new OpenWireTempTopic(((TemporaryTopic)dest).getTopicName());
-        }
-        if (dest instanceof Queue) {
-            return new OpenWireQueue(((Queue)dest).getQueueName());
-        }
-        if (dest instanceof Topic) {
-            return new OpenWireTopic(((Topic)dest).getTopicName());
-        }
-        throw new JMSException("Could not transform the destination into a ActiveMQ destination: " + dest);
-    }
-
     public static int compare(OpenWireDestination destination, OpenWireDestination destination2) {
         if (destination == destination2) {
             return 0;
@@ -379,14 +332,6 @@
         return isPattern;
     }
 
-    public static UnresolvedDestinationTransformer getUnresolvableDestinationTransformer() {
-        return unresolvableDestinationTransformer;
-    }
-
-    public static void setUnresolvableDestinationTransformer(UnresolvedDestinationTransformer unresolvableDestinationTransformer) {
-        OpenWireDestination.unresolvableDestinationTransformer = unresolvableDestinationTransformer;
-    }
-
     private static Map<String, String> parseQuery(String uri) throws Exception {
         if (uri != null) {
             Map<String, String> rc = new HashMap<String, String>();
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMapMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMapMessage.java
index 656bfce..fbc5fa5 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMapMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMapMessage.java
@@ -29,14 +29,10 @@
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import javax.jms.JMSException;
-import javax.jms.MessageFormatException;
-import javax.jms.MessageNotWriteableException;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
+import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.codec.OpenWireFormat;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.apache.activemq.openwire.utils.OpenWireMarshallingSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.ByteArrayInputStream;
@@ -81,7 +77,7 @@
     }
 
     @Override
-    public void clearMarshalledState() throws JMSException {
+    public void clearMarshalledState() throws IOException {
         super.clearMarshalledState();
         map.clear();
     }
@@ -115,10 +111,9 @@
     /**
      * Builds the message body from data
      *
-     * @throws JMSException
      * @throws IOException
      */
-    private void loadContent() throws JMSException {
+    private void loadContent() throws IOException {
         try {
             if (getContent() != null && map.isEmpty()) {
                 Buffer content = getContent();
@@ -130,8 +125,8 @@
                 map = OpenWireMarshallingSupport.unmarshalPrimitiveMap(dataIn);
                 dataIn.close();
             }
-        } catch (IOException e) {
-            throw ExceptionSupport.create(e);
+        } catch (Exception e) {
+            throw IOExceptionSupport.create(e);
         }
     }
 
@@ -154,7 +149,7 @@
      * message.
      */
     @Override
-    public void clearBody() throws JMSException {
+    public void clearBody() throws IOException {
         super.clearBody();
         map.clear();
     }
@@ -180,7 +175,7 @@
      * @throws JMSException if the JMS provider fails to read the message due to
      *                 some internal error.
      */
-    public Object getObject(String name) throws JMSException {
+    public Object getObject(String name) throws IOException {
         initializeReading();
         Object result = getContentMap().get(name);
         if (result instanceof UTF8Buffer) {
@@ -207,7 +202,7 @@
      *                                  empty string.
      * @throws MessageFormatException if the object is invalid.
      */
-    public void setObject(String name, Object value) throws JMSException {
+    public void setObject(String name, Object value) throws IOException {
         initializeWriting();
         if (value != null) {
             // byte[] not allowed on properties
@@ -231,7 +226,7 @@
      * @throws IllegalArgumentException if the name is null or if the name is an
      *                                  empty string.
      */
-    public void removeObject(String name) throws JMSException {
+    public void removeObject(String name) throws IOException {
         initializeWriting();
         if (name == null || name.trim().isEmpty()) {
             throw new IllegalArgumentException("map element name cannot be null or empty.");
@@ -247,7 +242,7 @@
      * @return an enumeration of all the names in this <CODE>MapMessage</CODE>
      * @throws JMSException
      */
-    public Enumeration<String> getMapNames() throws JMSException {
+    public Enumeration<String> getMapNames() throws IOException {
         return Collections.enumeration(getContentMap().keySet());
     }
 
@@ -260,15 +255,15 @@
      * @throws JMSException if the JMS provider fails to determine if the item
      *                 exists due to some internal error.
      */
-    public boolean itemExists(String name) throws JMSException {
+    public boolean itemExists(String name) throws IOException {
         return getContentMap().containsKey(name);
     }
 
-    private void initializeReading() throws JMSException {
+    private void initializeReading() throws IOException {
         loadContent();
     }
 
-    private void initializeWriting() throws MessageNotWriteableException {
+    private void initializeWriting() throws IOException {
         setContent(null);
     }
 
@@ -283,12 +278,12 @@
         return super.toString() + " OpenWireMapMessage{ " + "theTable = " + map + " }";
     }
 
-    protected Map<String, Object> getContentMap() throws JMSException {
+    protected Map<String, Object> getContentMap() throws IOException {
         initializeReading();
         return map;
     }
 
-    protected void put(String name, Object value) throws JMSException {
+    protected void put(String name, Object value) throws IOException {
         if (name == null) {
             throw new IllegalArgumentException("The name of the property cannot be null.");
         }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMessage.java
index ce39730..e2b6a1f 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireMessage.java
@@ -23,12 +23,9 @@
 import java.util.Map;
 import java.util.Vector;
 
-import javax.jms.JMSException;
-import javax.jms.MessageFormatException;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.annotations.OpenWireType;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.UTF8Buffer;
 
@@ -100,7 +97,7 @@
     }
 
     @Override
-    public void clearBody() throws JMSException {
+    public void clearBody() throws IOException {
         setContent(null);
     }
 
@@ -112,11 +109,11 @@
         return messageId.toString();
     }
 
-    public byte[] getCorrelationIdAsBytes() throws JMSException {
+    public byte[] getCorrelationIdAsBytes() throws IOException {
         return encodeString(this.getCorrelationId());
     }
 
-    public void setCorrelationIdAsBytes(byte[] correlationId) throws JMSException {
+    public void setCorrelationIdAsBytes(byte[] correlationId) throws IOException {
         this.setCorrelationId(decodeString(correlationId));
     }
 
@@ -142,15 +139,15 @@
      *
      * @throws JMSException if an error occurs while accessing the message payload.
      */
-    public Buffer getPayload() throws JMSException {
+    public Buffer getPayload() throws IOException {
         Buffer data = getContent();
         if (data == null) {
             data = new Buffer(new byte[] {}, 0, 0);
         } else if (isCompressed()) {
             try {
                 return decompress();
-            } catch (IOException e) {
-                throw ExceptionSupport.create(e);
+            } catch (Exception e) {
+                throw IOExceptionSupport.create(e);
             }
         }
 
@@ -167,9 +164,9 @@
      * @param bytes
      *        the new byte array to use to fill the message body.
      *
-     * @throws JMSException if an error occurs while accessing the message payload.
+     * @throws IOException if an error occurs while accessing the message payload.
      */
-    public void setPayload(byte[] bytes) throws JMSException {
+    public void setPayload(byte[] bytes) throws IOException {
         setPayload(new Buffer(bytes));
     }
 
@@ -185,14 +182,14 @@
      *
      * @throws JMSException if an error occurs while accessing the message payload.
      */
-    public void setPayload(Buffer buffer) throws JMSException {
+    public void setPayload(Buffer buffer) throws IOException {
         try {
             setContent(buffer);
             if (isUseCompression()) {
                 doCompress();
             }
-        } catch (IOException ioe) {
-            throw ExceptionSupport.create(ioe);
+        } catch (Exception ex) {
+            throw IOExceptionSupport.create(ex);
         }
     }
 
@@ -203,9 +200,9 @@
      * @param value
      *        the string Message ID value to assign to this message.
      *
-     * @throws JMSException if an error occurs while parsing the String to a MessageID
+     * @throws IOException if an error occurs while parsing the String to a MessageID
      */
-    public void setMessageId(String value) throws JMSException {
+    public void setMessageId(String value) throws IOException {
         if (value != null) {
             try {
                 MessageId id = new MessageId(value);
@@ -231,36 +228,36 @@
      *
      * @throws JMSException if an error occurs while setting this MessageId
      */
-    public void setMessageId(ProducerId producerId, long producerSequenceId) throws JMSException {
+    public void setMessageId(ProducerId producerId, long producerSequenceId) throws IOException {
         MessageId id = null;
         try {
             id = new MessageId(producerId, producerSequenceId);
             this.setMessageId(id);
         } catch (Throwable e) {
-            throw ExceptionSupport.create("Invalid message id '" + id + "', reason: " + e.getMessage(), e);
+            throw IOExceptionSupport.create("Invalid message id '" + id + "', reason: " + e.getMessage(), e);
         }
     }
 
-    public boolean propertyExists(String name) throws JMSException {
+    public boolean propertyExists(String name) throws IOException {
         try {
             return (this.getProperties().containsKey(name) || getProperty(name)!= null);
-        } catch (IOException e) {
-            throw ExceptionSupport.create(e);
+        } catch (Exception e) {
+            throw IOExceptionSupport.create(e);
         }
     }
 
     @SuppressWarnings("rawtypes")
-    public Enumeration getPropertyNames() throws JMSException {
+    public Enumeration getPropertyNames() throws IOException {
         try {
             Vector<String> result = new Vector<String>(this.getProperties().keySet());
             return result.elements();
-        } catch (IOException e) {
-            throw ExceptionSupport.create(e);
+        } catch (Exception e) {
+            throw IOExceptionSupport.create(e);
         }
     }
 
     @Override
-    public void setProperty(String name, Object value) throws JMSException {
+    public void setProperty(String name, Object value) throws IOException {
         setProperty(name, value, true);
     }
 
@@ -276,7 +273,7 @@
      *
      * @throws JMSException if an error occurs while setting the properties.
      */
-    public void setProperties(Map<String, ?> properties) throws JMSException {
+    public void setProperties(Map<String, ?> properties) throws IOException {
         for (Map.Entry<String, ?> entry : properties.entrySet()) {
             setProperty(entry.getKey(), entry.getValue());
         }
@@ -295,9 +292,9 @@
      * @param checkValid
      *        indicates if a type validity check should be performed on the given object.
      *
-     * @throws JMSException if an error occurs while attempting to set the property value.
+     * @throws IOException if an error occurs while attempting to set the property value.
      */
-    public void setProperty(String name, Object value, boolean checkValid) throws JMSException {
+    public void setProperty(String name, Object value, boolean checkValid) throws IOException {
         if (name == null || name.equals("")) {
             throw new IllegalArgumentException("Property name cannot be empty or null");
         }
@@ -367,45 +364,48 @@
      * Method that allows an application to inform the Message instance that it is
      * about to be sent and that it should prepare its internal state for dispatch.
      *
-     * @throws JMSException if an error occurs or Message state is invalid.
+     * @throws IOException if an error occurs or Message state is invalid.
      */
-    public void onSend() throws JMSException {
+    public void onSend() throws IOException {
     }
 
-    protected void checkValidObject(Object value) throws MessageFormatException {
+    protected void checkValidObject(Object value) throws IOException {
+
+        // TODO - We can probably remove these nested enabled check, the provider should
+        //        do this since we are just a codec.
         boolean valid = value instanceof Boolean || value instanceof Byte || value instanceof Short || value instanceof Integer || value instanceof Long;
         valid = valid || value instanceof Float || value instanceof Double || value instanceof Character || value instanceof String || value == null;
 
         if (!valid) {
             if (isNestedMapAndListAllowed()) {
                 if (!(value instanceof Map || value instanceof List)) {
-                    throw new MessageFormatException("Only objectified primitive objects, String, Map and List types are allowed but was: " + value + " type: " + value.getClass());
+                    throw new IllegalArgumentException("Only objectified primitive objects, String, Map and List types are allowed but was: " + value + " type: " + value.getClass());
                 }
             } else {
-                throw new MessageFormatException("Only objectified primitive objects and String types are allowed but was: " + value + " type: " + value.getClass());
+                throw new IllegalArgumentException("Only objectified primitive objects and String types are allowed but was: " + value + " type: " + value.getClass());
             }
         }
     }
 
-    protected static String decodeString(byte[] data) throws JMSException {
+    protected static String decodeString(byte[] data) throws IOException {
         try {
             if (data == null) {
                 return null;
             }
             return new String(data, "UTF-8");
         } catch (UnsupportedEncodingException e) {
-            throw new JMSException("Invalid UTF-8 encoding: " + e.getMessage());
+            throw IOExceptionSupport.create("Invalid UTF-8 encoding: " + e.getMessage(), e);
         }
     }
 
-    protected static byte[] encodeString(String data) throws JMSException {
+    protected static byte[] encodeString(String data) throws IOException {
         try {
             if (data == null) {
                 return null;
             }
             return data.getBytes("UTF-8");
         } catch (UnsupportedEncodingException e) {
-            throw new JMSException("Invalid UTF-8 encoding: " + e.getMessage());
+            throw IOExceptionSupport.create("Invalid UTF-8 encoding: " + e.getMessage(), e);
         }
     }
 }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireObjectMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireObjectMessage.java
index 8480234..3214556 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireObjectMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireObjectMessage.java
@@ -27,12 +27,10 @@
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import javax.jms.JMSException;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
+import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.codec.OpenWireFormat;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.apache.activemq.openwire.utils.ObjectMessageInputStream;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.ByteArrayInputStream;
@@ -111,11 +109,10 @@
      * message body in the same state as an empty body in a newly created
      * message.
      *
-     * @throws JMSException if the JMS provider fails to clear the message body
-     *                 due to some internal error.
+     * @throws IOException if an error occurs removing the body.
      */
     @Override
-    public void clearBody() throws JMSException {
+    public void clearBody() throws IOException {
         super.clearBody();
         this.object = null;
     }
@@ -134,7 +131,7 @@
      * @throws javax.jms.MessageNotWriteableException if the message is in
      *                 read-only mode.
      */
-    public void setObject(Serializable newObject) throws JMSException {
+    public void setObject(Serializable newObject) throws IOException {
         this.object = newObject;
         setContent(null);
         storeContent();
@@ -147,7 +144,7 @@
      * @return the serializable object containing this message's data
      * @throws JMSException
      */
-    public Serializable getObject() throws JMSException {
+    public Serializable getObject() throws IOException {
         if (object == null && getContent() != null) {
             try {
                 Buffer content = getContent();
@@ -160,13 +157,13 @@
                 try {
                     object = (Serializable)objIn.readObject();
                 } catch (ClassNotFoundException ce) {
-                    throw ExceptionSupport.create("Failed to build body from content. Serializable class not available to broker. Reason: " + ce, ce);
+                    throw IOExceptionSupport.create("Failed to build body from content. Serializable class not available to broker. Reason: " + ce, ce);
                 } finally {
                     dataIn.close();
                     objIn.close();
                 }
-            } catch (IOException e) {
-                throw ExceptionSupport.create("Failed to build body from bytes. Reason: " + e, e);
+            } catch (Exception e) {
+                throw IOExceptionSupport.create("Failed to build body from bytes. Reason: " + e, e);
             }
         }
         return this.object;
@@ -179,7 +176,7 @@
     }
 
     @Override
-    public void clearMarshalledState() throws JMSException {
+    public void clearMarshalledState() throws IOException {
         super.clearMarshalledState();
         this.object = null;
     }
@@ -194,7 +191,7 @@
     public String toString() {
         try {
             getObject();
-        } catch (JMSException e) {
+        } catch (IOException e) {
         }
         return super.toString();
     }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireQueue.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireQueue.java
index ab03b58..543b723 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireQueue.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireQueue.java
@@ -16,17 +16,10 @@
  */
 package org.apache.activemq.openwire.commands;
 
-import javax.jms.JMSException;
-import javax.jms.Queue;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
 
-
-/**
- * @openwire:marshaller code="100"
- */
 @OpenWireType(typeCode = 100)
-public class OpenWireQueue extends OpenWireDestination implements Queue {
+public class OpenWireQueue extends OpenWireDestination {
 
     public static final byte DATA_STRUCTURE_TYPE = CommandTypes.OPENWIRE_QUEUE;
 
@@ -57,8 +50,7 @@
         return QUEUE_QUALIFIED_PREFIX;
     }
 
-    @Override
-    public String getQueueName() throws JMSException {
+    public String getQueueName() {
         return getPhysicalName();
     }
 }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireStreamMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireStreamMessage.java
index d848e0e..82db2e4 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireStreamMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireStreamMessage.java
@@ -24,18 +24,13 @@
 import java.util.Collections;
 import java.util.List;
 
-import javax.jms.JMSException;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.apache.activemq.openwire.utils.OpenWireMarshallingSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.DataByteArrayInputStream;
 import org.fusesource.hawtbuf.DataByteArrayOutputStream;
 
-/**
- * openwire:marshaller code="27"
- */
 @OpenWireType(typeCode = 27)
 public class OpenWireStreamMessage extends OpenWireMessage {
 
@@ -54,7 +49,7 @@
     }
 
     @Override
-    public void onSend() throws JMSException {
+    public void onSend() throws IOException {
         super.onSend();
         storeContent();
     }
@@ -79,7 +74,7 @@
      *
      * @throws JMSException if an error occurs while reading the message.
      */
-    public List<Object> readStreamToList() throws JMSException {
+    public List<Object> readStreamToList() throws IOException {
         if (!hasContent()) {
             return Collections.emptyList();
         }
@@ -93,8 +88,8 @@
                 result.add(readNextElement(dataIn));
             } catch (EOFException ex) {
                 break;
-            } catch (IOException e) {
-                throw ExceptionSupport.create(e);
+            } catch (Exception e) {
+                throw IOExceptionSupport.create(e);
             }
         }
 
@@ -159,23 +154,16 @@
      * @param elements
      *        the list of elements to store into the list.
      *
-     * @throws JMSException if an error occurs while writing the elements to the message.
+     * @throws IOException if an error occurs while writing the elements to the message.
      */
-    public void writeListToStream(List<Object> elements) throws JMSException {
+    public void writeListToStream(List<Object> elements) throws IOException {
         if (elements != null && !elements.isEmpty()) {
             DataByteArrayOutputStream output = new DataByteArrayOutputStream();
             for (Object value : elements) {
-                try {
-                    writeElement(value, output);
-                } catch (IOException e) {
-                    throw ExceptionSupport.create(e);
-                }
+                writeElement(value, output);
             }
-            try {
-                output.close();
-            } catch (IOException e) {
-                throw ExceptionSupport.create(e);
-            }
+
+            output.close();
 
             setPayload(output.toBuffer());
         }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempQueue.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempQueue.java
index b3cbed0..0ec09d2 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempQueue.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempQueue.java
@@ -16,19 +16,13 @@
  */
 package org.apache.activemq.openwire.commands;
 
-import javax.jms.JMSException;
-import javax.jms.TemporaryQueue;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
 
-
 /**
- * Represents an ActiveMQ Temporary Queue.
- *
- * @openwire:marshaller code="102"
+ * Represents an OpenWire Temporary Queue.
  */
 @OpenWireType(typeCode = 102)
-public class OpenWireTempQueue extends OpenWireTempDestination implements TemporaryQueue {
+public class OpenWireTempQueue extends OpenWireTempDestination {
 
     public static final byte DATA_STRUCTURE_TYPE = CommandTypes.OPENWIRE_TEMP_QUEUE;
 
@@ -63,12 +57,7 @@
         return TEMP_QUEUE_QUALIFED_PREFIX;
     }
 
-    @Override
-    public String getQueueName() throws JMSException {
+    public String getQueueName() {
         return getPhysicalName();
     }
-
-    @Override
-    public void delete() throws JMSException {
-    }
 }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempTopic.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempTopic.java
index 05a5fe3..ceef32b 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempTopic.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTempTopic.java
@@ -16,16 +16,10 @@
  */
 package org.apache.activemq.openwire.commands;
 
-import javax.jms.JMSException;
-import javax.jms.TemporaryTopic;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
 
-/**
- * @openwire:marshaller code="103"
- */
 @OpenWireType(typeCode = 103)
-public class OpenWireTempTopic extends OpenWireTempDestination implements TemporaryTopic {
+public class OpenWireTempTopic extends OpenWireTempDestination {
 
     public static final byte DATA_STRUCTURE_TYPE = CommandTypes.OPENWIRE_TEMP_TOPIC;
 
@@ -60,13 +54,7 @@
         return TEMP_TOPIC_QUALIFED_PREFIX;
     }
 
-    @Override
-    public String getTopicName() throws JMSException {
+    public String getTopicName() {
         return getPhysicalName();
     }
-
-    @Override
-    public void delete() throws JMSException {
-
-    }
 }
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTextMessage.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTextMessage.java
index de9d964..1003148 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTextMessage.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTextMessage.java
@@ -22,21 +22,15 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import javax.jms.JMSException;
-import javax.jms.MessageNotWriteableException;
-
-import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.annotations.OpenWireExtension;
+import org.apache.activemq.openwire.annotations.OpenWireType;
 import org.apache.activemq.openwire.codec.OpenWireFormat;
-import org.apache.activemq.openwire.utils.ExceptionSupport;
+import org.apache.activemq.openwire.utils.IOExceptionSupport;
 import org.apache.activemq.openwire.utils.OpenWireMarshallingSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.ByteArrayInputStream;
 import org.fusesource.hawtbuf.ByteArrayOutputStream;
 
-/**
- * openwire:marshaller code="28"
- */
 @OpenWireType(typeCode = 28)
 public class OpenWireTextMessage extends OpenWireMessage {
 
@@ -67,12 +61,12 @@
         return "jms/text-message";
     }
 
-    public void setText(String text) throws MessageNotWriteableException {
+    public void setText(String text) {
         this.text = text;
         setContent(null);
     }
 
-    public String getText() throws JMSException {
+    public String getText() throws IOException {
         if (text == null && getContent() != null) {
             text = decodeContent();
             setContent(null);
@@ -80,7 +74,7 @@
         return text;
     }
 
-    private String decodeContent() throws JMSException {
+    private String decodeContent() throws IOException {
         String text = null;
         if (hasContent()) {
             InputStream is = null;
@@ -89,8 +83,8 @@
                 DataInputStream dataIn = new DataInputStream(is);
                 text = OpenWireMarshallingSupport.readUTF8(dataIn);
                 dataIn.close();
-            } catch (IOException ioe) {
-                throw ExceptionSupport.create(ioe);
+            } catch (Exception ex) {
+                throw IOExceptionSupport.create(ex);
             } finally {
                 if (is != null) {
                     try {
@@ -134,7 +128,7 @@
     }
 
     @Override
-    public void clearMarshalledState() throws JMSException {
+    public void clearMarshalledState() throws IOException {
         super.clearMarshalledState();
         this.text = null;
     }
@@ -147,11 +141,11 @@
      * message body in the same state as an empty body in a newly created
      * message.
      *
-     * @throws JMSException if the JMS provider fails to clear the message body
+     * @throws IOException if the JMS provider fails to clear the message body
      *                 due to some internal error.
      */
     @Override
-    public void clearBody() throws JMSException {
+    public void clearBody() throws IOException {
         super.clearBody();
         this.text = null;
     }
@@ -174,7 +168,7 @@
         if( text == null ) {
             try {
                 text = decodeContent();
-            } catch (JMSException ex) {
+            } catch (IOException ex) {
             }
         }
         if (text != null) {
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTopic.java b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTopic.java
index 2bf503f..961e7ce 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTopic.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/commands/OpenWireTopic.java
@@ -16,16 +16,10 @@
  */
 package org.apache.activemq.openwire.commands;
 
-import javax.jms.JMSException;
-import javax.jms.Topic;
-
 import org.apache.activemq.openwire.annotations.OpenWireType;
 
-/**
- * @openwire:marshaller code="101"
- */
 @OpenWireType(typeCode = 101)
-public class OpenWireTopic extends OpenWireDestination implements Topic {
+public class OpenWireTopic extends OpenWireDestination {
 
     public static final byte DATA_STRUCTURE_TYPE = CommandTypes.OPENWIRE_TOPIC;
 
@@ -46,8 +40,7 @@
         return true;
     }
 
-    @Override
-    public String getTopicName() throws JMSException {
+    public String getTopicName() {
         return getPhysicalName();
     }
 
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/DefaultUnresolvedDestinationTransformer.java b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/DefaultUnresolvedDestinationTransformer.java
deleted file mode 100644
index e7c6bec..0000000
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/DefaultUnresolvedDestinationTransformer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * 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.activemq.openwire.utils;
-
-import java.lang.reflect.Method;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Queue;
-import javax.jms.Topic;
-
-import org.apache.activemq.openwire.commands.OpenWireDestination;
-import org.apache.activemq.openwire.commands.OpenWireQueue;
-import org.apache.activemq.openwire.commands.OpenWireTopic;
-
-/**
- * A default implementation of the resolver that attempts to find an isQueue or isTopic method
- * on the foreign destination to determine the correct type.
- */
-public class DefaultUnresolvedDestinationTransformer implements UnresolvedDestinationTransformer {
-
-    @Override
-    public OpenWireDestination transform(Destination dest) throws JMSException {
-        String queueName = ((Queue) dest).getQueueName();
-        String topicName = ((Topic) dest).getTopicName();
-
-        if (queueName == null && topicName == null) {
-            throw new JMSException("Unresolvable destination: Both queue and topic names are null: " + dest);
-        }
-
-        try {
-            Method isQueueMethod = dest.getClass().getMethod("isQueue");
-            Method isTopicMethod = dest.getClass().getMethod("isTopic");
-
-            if (isQueueMethod == null && isTopicMethod == null) {
-                throw new JMSException("Unresolvable destination: Neither isQueue nor isTopic methods present: " + dest);
-            }
-
-            Boolean isQueue = (Boolean) isQueueMethod.invoke(dest);
-            Boolean isTopic = (Boolean) isTopicMethod.invoke(dest);
-            if (isQueue) {
-                return new OpenWireQueue(queueName);
-            } else if (isTopic) {
-                return new OpenWireTopic(topicName);
-            } else {
-                throw new JMSException("Unresolvable destination: Neither Queue nor Topic: " + dest);
-            }
-        } catch (Exception e) {
-            throw new JMSException("Unresolvable destination: " + e.getMessage() + ": " + dest);
-        }
-    }
-
-    @Override
-    public OpenWireDestination transform(String dest) throws JMSException {
-        return new OpenWireQueue(dest);
-    }
-}
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/ExceptionSupport.java b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/ExceptionSupport.java
deleted file mode 100644
index 3f113b1..0000000
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/ExceptionSupport.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * 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.activemq.openwire.utils;
-
-import javax.jms.JMSException;
-import javax.jms.MessageEOFException;
-import javax.jms.MessageFormatException;
-
-/**
- * Exception support class.
- *
- * Factory class for creating JMSException instances based on String messages or by
- * wrapping other non-JMS exception.
- *
- * @since 1.0
- */
-public final class ExceptionSupport {
-
-    private ExceptionSupport() {}
-
-    public static JMSException create(String msg, Throwable cause) {
-        JMSException exception = new JMSException(msg);
-        exception.initCause(cause);
-        return exception;
-    }
-
-    public static JMSException create(String msg, Exception cause) {
-        JMSException exception = new JMSException(msg);
-        exception.setLinkedException(cause);
-        exception.initCause(cause);
-        return exception;
-    }
-
-    public static JMSException create(Throwable cause) {
-        if (cause instanceof JMSException) {
-            return (JMSException) cause;
-        }
-        if (cause.getCause() instanceof JMSException) {
-            return (JMSException) cause.getCause();
-        }
-
-        String msg = cause.getMessage();
-        if (msg == null || msg.length() == 0) {
-            msg = cause.toString();
-        }
-        JMSException exception = new JMSException(msg);
-        exception.initCause(cause);
-        return exception;
-    }
-
-    public static JMSException create(Exception cause) {
-        if (cause instanceof JMSException) {
-            return (JMSException) cause;
-        }
-        if (cause.getCause() instanceof JMSException) {
-            return (JMSException) cause.getCause();
-        }
-
-        String msg = cause.getMessage();
-        if (msg == null || msg.length() == 0) {
-            msg = cause.toString();
-        }
-        JMSException exception = new JMSException(msg);
-        exception.setLinkedException(cause);
-        exception.initCause(cause);
-        return exception;
-    }
-
-    public static MessageEOFException createMessageEOFException(Exception cause) {
-        String msg = cause.getMessage();
-        if (msg == null || msg.length() == 0) {
-            msg = cause.toString();
-        }
-        MessageEOFException exception = new MessageEOFException(msg);
-        exception.setLinkedException(cause);
-        exception.initCause(cause);
-        return exception;
-    }
-
-    public static MessageFormatException createMessageFormatException(Throwable cause) {
-        String msg = cause.getMessage();
-        if (msg == null || msg.length() == 0) {
-            msg = cause.toString();
-        }
-        MessageFormatException exception = new MessageFormatException(msg);
-        exception.initCause(cause);
-        return exception;
-    }
-}
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/IOExceptionSupport.java b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/IOExceptionSupport.java
new file mode 100644
index 0000000..7062960
--- /dev/null
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/IOExceptionSupport.java
@@ -0,0 +1,57 @@
+/**
+ * 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.activemq.openwire.utils;
+
+import java.io.IOException;
+
+/**
+ * Exception support class.
+ *
+ * Factory class for creating IOException instances based on String messages or by
+ * wrapping other causal exceptions.
+ *
+ * @since 1.0
+ */
+public final class IOExceptionSupport {
+
+    private IOExceptionSupport() {}
+
+    public static IOException create(String msg, Throwable cause) {
+        IOException exception = new IOException(msg);
+        exception.initCause(cause);
+        return exception;
+    }
+
+    public static IOException create(Throwable cause) {
+        if (cause instanceof IOException) {
+            return (IOException) cause;
+        }
+
+        if (cause.getCause() instanceof IOException) {
+            return (IOException) cause.getCause();
+        }
+
+        String msg = cause.getMessage();
+        if (msg == null || msg.length() == 0) {
+            msg = cause.toString();
+        }
+
+        IOException exception = new IOException(msg);
+        exception.initCause(cause);
+        return exception;
+    }
+}
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/UnresolvedDestinationTransformer.java b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/UnresolvedDestinationTransformer.java
deleted file mode 100644
index 252c758..0000000
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/UnresolvedDestinationTransformer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * 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.activemq.openwire.utils;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-
-import org.apache.activemq.openwire.commands.OpenWireDestination;
-
-/**
- * Allows for the configuration of a user defined Destination transformer that will
- * be called when it cannot be logically determined what type of Destination is
- * being converted to an OpenWireDestination.  This can happen for instance when a
- * JMS Provider's Destination implements both Topic and Queue from the same root
- * Destination object.
- */
-public interface UnresolvedDestinationTransformer {
-
-    /**
-     * Given the JMS Destination convert it to the correct OpenWire destination
-     *
-     * @param destination
-     *        the foreign destination to convert to the proper OpenWire type.
-     *
-     * @return an OpenWireDestination instance of the correct type.
-     *
-     * @throws JMSException if an error occurs while converting the Destination type.
-     */
-    public OpenWireDestination transform(Destination destination) throws JMSException;
-
-    /**
-     * Given the name of a JMS Destination convert it to the correct OpenWire destination.
-     *
-     * @param destination
-     *        the name of a destination to convert to the proper OpenWire type.
-     *
-     * @return an OpenWireDestination instance of the correct type.
-     *
-     * @throws JMSException if an error occurs while converting the Destination type.
-     */
-    public OpenWireDestination transform(String destination) throws JMSException;
-
-}
diff --git a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireDestinationTest.java b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireDestinationTest.java
index e69eaf8..ed13440 100644
--- a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireDestinationTest.java
+++ b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireDestinationTest.java
@@ -18,7 +18,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
@@ -29,17 +28,6 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import javax.jms.JMSException;
-import javax.jms.Queue;
-import javax.jms.TemporaryQueue;
-import javax.jms.TemporaryTopic;
-import javax.jms.Topic;
-
-import org.apache.activemq.openwire.commands.OpenWireDestination;
-import org.apache.activemq.openwire.commands.OpenWireQueue;
-import org.apache.activemq.openwire.commands.OpenWireTempQueue;
-import org.apache.activemq.openwire.commands.OpenWireTempTopic;
-import org.apache.activemq.openwire.commands.OpenWireTopic;
 import org.junit.Test;
 
 /**
@@ -58,7 +46,7 @@
         assertEquals("Sorted order", expected, actual);
     }
 
-    class CombyDest implements Queue, Topic, TemporaryQueue, TemporaryTopic {
+    class CombyDest {
 
         private final String qName;
         private final String topicName;
@@ -68,39 +56,16 @@
             this.topicName = topicName;
         }
 
-        @Override
-        public void delete() throws JMSException {}
-
-        @Override
-        public String getTopicName() throws JMSException {
+        public String getTopicName() {
             return topicName;
         }
 
-        @Override
-        public String getQueueName() throws JMSException {
+        public String getQueueName() {
             return qName;
         }
     }
 
     @Test
-    public void testTransformPollymorphic() throws Exception {
-        OpenWireQueue queue = new OpenWireQueue("TEST");
-        assertEquals(OpenWireDestination.transform(queue), queue);
-        assertTrue("is a q", OpenWireDestination.transform(new CombyDest(null, "Topic")) instanceof OpenWireTopic);
-        assertTrue("is a q", OpenWireDestination.transform(new CombyDest("Q", null)) instanceof OpenWireQueue);
-        try {
-            OpenWireDestination.transform(new CombyDest(null, null));
-            fail("expect ex as cannot disambiguate");
-        } catch (JMSException expected) {
-        }
-        try {
-            OpenWireDestination.transform(new CombyDest("Q", "T"));
-            fail("expect ex as cannot disambiguate");
-        } catch (JMSException expected) {
-        }
-    }
-
-    @Test
     public void testEmptyQueueName() {
         try {
             new OpenWireQueue("");
diff --git a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMapMessageTest.java b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMapMessageTest.java
index 0a7e66a..ba4d2c2 100644
--- a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMapMessageTest.java
+++ b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMapMessageTest.java
@@ -27,10 +27,6 @@
 import java.util.Enumeration;
 import java.util.List;
 
-import javax.jms.JMSException;
-import javax.jms.MessageFormatException;
-
-import org.apache.activemq.openwire.commands.OpenWireMapMessage;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestName;
@@ -45,7 +41,7 @@
     public TestName name = new TestName();
 
     @Test
-    public void testBytesConversion() throws JMSException, IOException {
+    public void testBytesConversion() throws Exception {
         OpenWireMapMessage msg = new OpenWireMapMessage();
         msg.setObject("boolean", true);
         msg.setObject("byte", (byte) 1);
@@ -68,7 +64,7 @@
 
         msg.setObject("bigString", bigString);
 
-        msg = (OpenWireMapMessage) msg.copy();
+        msg = msg.copy();
 
         assertEquals(msg.getObject("boolean"), true);
         assertEquals(msg.getObject("byte"), (byte) 1);
@@ -85,7 +81,7 @@
     }
 
     @Test
-    public void testGetObject() throws JMSException {
+    public void testGetObject() throws Exception {
         OpenWireMapMessage msg = new OpenWireMapMessage();
         Boolean booleanValue = Boolean.TRUE;
         Byte byteValue = Byte.valueOf("1");
@@ -109,13 +105,13 @@
             msg.setObject("long", longValue);
             msg.setObject("short", shortValue);
             msg.setObject("string", stringValue);
-        } catch (MessageFormatException mfe) {
-            LOG.warn("Caught: " + mfe);
-            mfe.printStackTrace();
+        } catch (IOException ioe) {
+            LOG.warn("Caught: " + ioe);
+            ioe.printStackTrace();
             fail("object formats should be correct");
         }
 
-        msg = (OpenWireMapMessage) msg.copy();
+        msg = msg.copy();
 
         assertTrue(msg.getObject("boolean") instanceof Boolean);
         assertEquals(msg.getObject("boolean"), booleanValue);
@@ -143,12 +139,12 @@
         try {
             msg.setObject("object", new Object());
             fail("should have thrown exception");
-        } catch (MessageFormatException e) {
+        } catch (IllegalArgumentException e) {
         }
     }
 
     @Test
-    public void testGetMapNames() throws JMSException {
+    public void testGetMapNames() throws Exception {
         OpenWireMapMessage msg = new OpenWireMapMessage();
         msg.setObject("boolean", true);
         msg.setObject("byte", (byte) 1);
@@ -162,7 +158,7 @@
         msg.setObject("short", (short) 1);
         msg.setObject("string", "string");
 
-        msg = (OpenWireMapMessage) msg.copy();
+        msg = msg.copy();
 
         Enumeration<String> mapNamesEnum = msg.getMapNames();
         List<String> mapNamesList = Collections.list(mapNamesEnum);
@@ -182,19 +178,19 @@
     }
 
     @Test
-    public void testItemExists() throws JMSException {
+    public void testItemExists() throws Exception {
         OpenWireMapMessage mapMessage = new OpenWireMapMessage();
 
         mapMessage.setObject("exists", "test");
 
-        mapMessage = (OpenWireMapMessage) mapMessage.copy();
+        mapMessage = mapMessage.copy();
 
         assertTrue(mapMessage.itemExists("exists"));
         assertFalse(mapMessage.itemExists("doesntExist"));
     }
 
     @Test
-    public void testClearBody() throws JMSException {
+    public void testClearBody() throws Exception {
         OpenWireMapMessage mapMessage = new OpenWireMapMessage();
         mapMessage.setObject("String", "String");
         mapMessage.clearBody();
@@ -204,7 +200,7 @@
         mapMessage.clearBody();
         mapMessage.setObject("String", "String");
 
-        mapMessage = (OpenWireMapMessage) mapMessage.copy();
+        mapMessage = mapMessage.copy();
 
         mapMessage.getObject("String");
     }
diff --git a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMessageTest.java b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMessageTest.java
index b6263c7..30f8084 100644
--- a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMessageTest.java
+++ b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireMessageTest.java
@@ -26,18 +26,7 @@
 import java.io.IOException;
 import java.util.Map;
 
-import javax.jms.DeliveryMode;
-import javax.jms.JMSException;
-import javax.jms.Message;
-
 import org.apache.activemq.openwire.codec.OpenWireFormat;
-import org.apache.activemq.openwire.commands.CommandTypes;
-import org.apache.activemq.openwire.commands.OpenWireBytesMessage;
-import org.apache.activemq.openwire.commands.OpenWireDestination;
-import org.apache.activemq.openwire.commands.OpenWireMessage;
-import org.apache.activemq.openwire.commands.OpenWireObjectMessage;
-import org.apache.activemq.openwire.commands.OpenWireTempTopic;
-import org.apache.activemq.openwire.commands.OpenWireTopic;
 import org.fusesource.hawtbuf.Buffer;
 import org.junit.Before;
 import org.junit.Test;
@@ -50,7 +39,7 @@
 
     protected boolean readOnlyMessage;
 
-    private String jmsMessageID;
+    private MessageId myMessageID;
     private String jmsCorrelationID;
     private OpenWireDestination jmsDestination;
     private OpenWireDestination jmsReplyTo;
@@ -64,11 +53,11 @@
 
     @Before
     public void setUp() throws Exception {
-        this.jmsMessageID = "ID:TEST-ID:0:0:0:1";
+        this.myMessageID = new MessageId("ID:TEST-ID:0:0:0:1");
         this.jmsCorrelationID = "testcorrelationid";
         this.jmsDestination = new OpenWireTopic("test.topic");
         this.jmsReplyTo = new OpenWireTempTopic("test.replyto.topic:001");
-        this.jmsDeliveryMode = Message.DEFAULT_DELIVERY_MODE;
+        this.jmsDeliveryMode = 1;
         this.jmsRedelivered = true;
         this.jmsType = "test type";
         this.jmsExpiration = 100000;
@@ -87,12 +76,12 @@
         assertEquals(msg.getDataStructureType(), CommandTypes.OPENWIRE_MESSAGE);
     }
 
-//    @Test
-//    public void testHashCode() throws Exception {
-//        OpenWireMessage msg = new OpenWireMessage();
-//        msg.setMessageId(this.jmsMessageID);
-//        assertTrue(msg.getMessageId().hashCode() == jmsMessageID.hashCode());
-//    }
+    @Test
+    public void testHashCode() throws Exception {
+        OpenWireMessage msg = new OpenWireMessage();
+        msg.setMessageId(this.myMessageID);
+        assertEquals(msg.getMessageId().hashCode(), myMessageID.hashCode());
+    }
 
     @Test
     public void testSetToForeignJMSID() throws Exception {
@@ -104,67 +93,66 @@
     public void testEqualsObject() throws Exception {
         OpenWireMessage msg1 = new OpenWireMessage();
         OpenWireMessage msg2 = new OpenWireMessage();
-        msg1.setMessageId(this.jmsMessageID);
+        msg1.setMessageId(this.myMessageID);
         assertTrue(!msg1.equals(msg2));
-        msg2.setMessageId(this.jmsMessageID);
+        msg2.setMessageId(this.myMessageID);
         assertTrue(msg1.equals(msg2));
     }
 
     @Test
     public void testShallowCopy() throws Exception {
         OpenWireMessage msg1 = new OpenWireMessage();
-        msg1.setMessageId(jmsMessageID);
+        msg1.setMessageId(myMessageID);
         OpenWireMessage msg2 = msg1.copy();
         assertTrue(msg1 != msg2 && msg1.equals(msg2));
     }
 
-//    @Test
-//    public void testCopy() throws Exception {
-//        this.jmsMessageID = "testid";
-//        this.jmsCorrelationID = "testcorrelationid";
-//        this.jmsDestination = new OpenWireTopic("test.topic");
-//        this.jmsReplyTo = new OpenWireTempTopic("test.replyto.topic:001");
-//        this.jmsDeliveryMode = Message.DEFAULT_DELIVERY_MODE;
-//        this.jmsRedelivered = true;
-//        this.jmsType = "test type";
-//        this.jmsExpiration = 100000;
-//        this.jmsPriority = 5;
-//        this.jmsTimestamp = System.currentTimeMillis();
-//        this.readOnlyMessage = false;
-//
-//        OpenWireMessage msg1 = new OpenWireMessage();
-//        msg1.setMessageId(this.jmsMessageID);
-//        msg1.setCorrelationId(this.jmsCorrelationID);
-//        msg1.setDestination(this.jmsDestination);
-//        msg1.setReplyTo(this.jmsReplyTo);
-//        msg1.setPersistent(this.jmsDeliveryMode == DeliveryMode.PERSISTENT);
-//        msg1.setRedelivered(this.jmsRedelivered);
-//        msg1.setType(this.jmsType);
-//        msg1.setExpiration(this.jmsExpiration);
-//        msg1.setPriority((byte) this.jmsPriority);
-//        msg1.setTimestamp(this.jmsTimestamp);
-//        msg1.setReadOnlyProperties(true);
-//        OpenWireMessage msg2 = new OpenWireMessage();
-//        msg1.copy(msg2);
-//        assertEquals(msg1.getMessageId(), msg2.getMessageId());
-//        assertTrue(msg1.getCorrelationId().equals(msg2.getCorrelationId()));
-//        assertTrue(msg1.getDestination().equals(msg2.getDestination()));
-//        assertTrue(msg1.getReplyTo().equals(msg2.getReplyTo()));
-//        assertTrue(msg1.isPersistent() == msg2.isPersistent());
-//        assertTrue(msg1.isRedelivered() == msg2.isRedelivered());
-//        assertTrue(msg1.getType().equals(msg2.getType()));
-//        assertTrue(msg1.getExpiration() == msg2.getExpiration());
-//        assertTrue(msg1.getPriority() == msg2.getPriority());
-//        assertTrue(msg1.getTimestamp() == msg2.getTimestamp());
-//
-//        LOG.info("Message is:  " + msg1);
-//    }
+    @Test
+    public void testCopy() throws Exception {
+        this.myMessageID = new MessageId("ID:TEST-ID:0:0:0:2");
+        this.jmsCorrelationID = "testcorrelationid";
+        this.jmsDestination = new OpenWireTopic("test.topic");
+        this.jmsReplyTo = new OpenWireTempTopic("test.replyto.topic:001");
+        this.jmsDeliveryMode = 1;
+        this.jmsRedelivered = true;
+        this.jmsType = "test type";
+        this.jmsExpiration = 100000;
+        this.jmsPriority = 5;
+        this.jmsTimestamp = System.currentTimeMillis();
+        this.readOnlyMessage = false;
+
+        OpenWireMessage msg1 = new OpenWireMessage();
+        msg1.setMessageId(this.myMessageID);
+        msg1.setCorrelationId(this.jmsCorrelationID);
+        msg1.setDestination(this.jmsDestination);
+        msg1.setReplyTo(this.jmsReplyTo);
+        msg1.setPersistent(this.jmsDeliveryMode == 1);
+        msg1.setRedelivered(this.jmsRedelivered);
+        msg1.setType(this.jmsType);
+        msg1.setExpiration(this.jmsExpiration);
+        msg1.setPriority((byte) this.jmsPriority);
+        msg1.setTimestamp(this.jmsTimestamp);
+        OpenWireMessage msg2 = new OpenWireMessage();
+        msg1.copy(msg2);
+        assertEquals(msg1.getMessageId(), msg2.getMessageId());
+        assertTrue(msg1.getCorrelationId().equals(msg2.getCorrelationId()));
+        assertTrue(msg1.getDestination().equals(msg2.getDestination()));
+        assertTrue(msg1.getReplyTo().equals(msg2.getReplyTo()));
+        assertTrue(msg1.isPersistent() == msg2.isPersistent());
+        assertTrue(msg1.isRedelivered() == msg2.isRedelivered());
+        assertTrue(msg1.getType().equals(msg2.getType()));
+        assertTrue(msg1.getExpiration() == msg2.getExpiration());
+        assertTrue(msg1.getPriority() == msg2.getPriority());
+        assertTrue(msg1.getTimestamp() == msg2.getTimestamp());
+
+        LOG.info("Message is:  " + msg1);
+    }
 
     @Test
     public void testGetAndSetMessageId() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
-        msg.setMessageId(this.jmsMessageID);
-        assertEquals(msg.getMessageId().toString(), this.jmsMessageID);
+        msg.setMessageId(this.myMessageID);
+        assertEquals(msg.getMessageId().toString(), this.myMessageID.toString());
     }
 
     @Test
@@ -201,7 +189,7 @@
     }
 
     @Test
-    public void testGetAndSetJMSReplyTo() throws JMSException {
+    public void testGetAndSetJMSReplyTo() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         msg.setReplyTo(this.jmsReplyTo);
         assertTrue(msg.getReplyTo().equals(this.jmsReplyTo));
@@ -217,7 +205,7 @@
     @Test
     public void testGetAndSetPersistentFlag() {
         OpenWireMessage msg = new OpenWireMessage();
-        boolean persistent = this.jmsDeliveryMode == DeliveryMode.PERSISTENT;
+        boolean persistent = this.jmsDeliveryMode == 1;
         msg.setPersistent(persistent);
         assertTrue(msg.isPersistent() == persistent);
     }
@@ -257,11 +245,11 @@
     }
 
     @Test
-    public void testClearProperties() throws JMSException {
+    public void testClearProperties() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         msg.setProperty("test", "test");
         msg.setContent(new Buffer(new byte[1], 0, 0));
-        msg.setMessageId(this.jmsMessageID);
+        msg.setMessageId(this.myMessageID);
         msg.clearProperties();
         assertNull(msg.getProperty("test"));
         assertNotNull(msg.getMessageId());
@@ -269,7 +257,7 @@
     }
 
     @Test
-    public void testPropertyExists() throws JMSException {
+    public void testPropertyExists() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         msg.setProperty("test", "test");
         assertTrue(msg.propertyExists("test"));
@@ -279,7 +267,7 @@
     }
 
     @Test
-    public void testGetBooleanProperty() throws JMSException {
+    public void testGetBooleanProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "booleanProperty";
         msg.setProperty(name, true);
@@ -287,7 +275,7 @@
     }
 
     @Test
-    public void testGetByteProperty() throws JMSException {
+    public void testGetByteProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "byteProperty";
         msg.setProperty(name, (byte) 1);
@@ -295,7 +283,7 @@
     }
 
     @Test
-    public void testGetShortProperty() throws JMSException {
+    public void testGetShortProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "shortProperty";
         msg.setProperty(name, (short) 1);
@@ -303,7 +291,7 @@
     }
 
     @Test
-    public void testGetIntProperty() throws JMSException {
+    public void testGetIntProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "intProperty";
         msg.setProperty(name, 1);
@@ -311,7 +299,7 @@
     }
 
     @Test
-    public void testGetLongProperty() throws JMSException {
+    public void testGetLongProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "longProperty";
         msg.setProperty(name, 1L);
@@ -319,7 +307,7 @@
     }
 
     @Test
-    public void testGetFloatProperty() throws JMSException {
+    public void testGetFloatProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "floatProperty";
         msg.setProperty(name, 1.3f);
@@ -327,7 +315,7 @@
     }
 
     @Test
-    public void testGetDoubleProperty() throws JMSException {
+    public void testGetDoubleProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "doubleProperty";
         msg.setProperty(name, 1.3d);
@@ -335,7 +323,7 @@
     }
 
     @Test
-    public void testGetStringProperty() throws JMSException {
+    public void testGetStringProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "stringProperty";
         msg.setProperty(name, name);
@@ -343,7 +331,7 @@
     }
 
     @Test
-    public void testgetProperty() throws JMSException {
+    public void testgetProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "floatProperty";
         msg.setProperty(name, 1.3f);
@@ -382,7 +370,7 @@
         roundTripProperties(message);
     }
 
-    private void roundTripProperties(OpenWireObjectMessage message) throws IOException, JMSException {
+    private void roundTripProperties(OpenWireObjectMessage message) throws IOException, Exception {
         OpenWireObjectMessage copy = new OpenWireObjectMessage();
         for (Map.Entry<String, Object> prop : message.getProperties().entrySet()) {
             LOG.debug("{} -> {}", prop.getKey(), prop.getValue().getClass());
@@ -401,7 +389,7 @@
     }
 
     @Test
-    public void testSetNullProperty() throws JMSException {
+    public void testSetNullProperty() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         String name = "cheese";
         msg.setProperty(name, "Cheddar");
@@ -412,7 +400,7 @@
     }
 
     @Test
-    public void testSetNullPropertyName() throws JMSException {
+    public void testSetNullPropertyName() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
 
         try {
@@ -424,7 +412,7 @@
     }
 
     @Test
-    public void testSetEmptyPropertyName() throws JMSException {
+    public void testSetEmptyPropertyName() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
 
         try {
@@ -436,7 +424,7 @@
     }
 
     @Test
-    public void testGetAndSetDeliveryCount() throws JMSException {
+    public void testGetAndSetDeliveryCount() throws Exception {
         OpenWireMessage msg = new OpenWireMessage();
         msg.setRedeliveryCounter(1);
         int count = msg.getRedeliveryCounter();
@@ -444,7 +432,7 @@
     }
 
     @Test
-    public void testClearBody() throws JMSException {
+    public void testClearBody() throws Exception {
         OpenWireBytesMessage message = new OpenWireBytesMessage();
         message.clearBody();
         assertNull(message.getContent());
diff --git a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireObjectMessageTest.java b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireObjectMessageTest.java
index 5363df8..895aeec 100644
--- a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireObjectMessageTest.java
+++ b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireObjectMessageTest.java
@@ -19,33 +19,25 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.io.IOException;
 
-import javax.jms.JMSException;
-import javax.jms.MessageNotWriteableException;
-
-import org.apache.activemq.openwire.commands.OpenWireObjectMessage;
 import org.junit.Test;
 
-/**
- *
- */
 public class OpenWireObjectMessageTest {
 
     @Test
-    public void testBytes() throws JMSException, IOException {
+    public void testBytes() throws Exception, IOException {
         OpenWireObjectMessage msg = new OpenWireObjectMessage();
         String str = "testText";
         msg.setObject(str);
 
-        msg = (OpenWireObjectMessage) msg.copy();
+        msg = msg.copy();
         assertEquals(msg.getObject(), str);
     }
 
     @Test
-    public void testSetObject() throws JMSException {
+    public void testSetObject() throws Exception {
         OpenWireObjectMessage msg = new OpenWireObjectMessage();
         String str = "testText";
         msg.setObject(str);
@@ -53,16 +45,12 @@
     }
 
     @Test
-    public void testClearBody() throws JMSException {
+    public void testClearBody() throws Exception {
         OpenWireObjectMessage objectMessage = new OpenWireObjectMessage();
-        try {
-            objectMessage.setObject("String");
-            objectMessage.clearBody();
-            assertNull(objectMessage.getObject());
-            objectMessage.setObject("String");
-            objectMessage.getObject();
-        } catch (MessageNotWriteableException mnwe) {
-            fail("should be writeable");
-        }
+        objectMessage.setObject("String");
+        objectMessage.clearBody();
+        assertNull(objectMessage.getObject());
+        objectMessage.setObject("String");
+        objectMessage.getObject();
     }
 }
diff --git a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireTextMessageTest.java b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireTextMessageTest.java
index d4a3811..45a4487 100644
--- a/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireTextMessageTest.java
+++ b/openwire-core/src/test/java/org/apache/activemq/openwire/commands/OpenWireTextMessageTest.java
@@ -19,15 +19,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-import javax.jms.JMSException;
-import javax.jms.MessageNotReadableException;
-import javax.jms.MessageNotWriteableException;
-
 import org.apache.activemq.openwire.utils.MarshallingSupport;
 import org.fusesource.hawtbuf.Buffer;
 import org.fusesource.hawtbuf.ByteArrayOutputStream;
@@ -45,7 +40,7 @@
     }
 
     @Test
-    public void testShallowCopy() throws JMSException {
+    public void testShallowCopy() throws Exception {
         OpenWireTextMessage msg = new OpenWireTextMessage();
         String string = "str";
         msg.setText(string);
@@ -60,13 +55,13 @@
         try {
             msg.setText(str);
             assertEquals(msg.getText(), str);
-        } catch (JMSException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     @Test
-    public void testGetBytes() throws JMSException, IOException {
+    public void testGetBytes() throws Exception, IOException {
         OpenWireTextMessage msg = new OpenWireTextMessage();
         String str = "testText";
         msg.setText(str);
@@ -80,19 +75,13 @@
     }
 
     @Test
-    public void testClearBody() throws JMSException, IOException {
+    public void testClearBody() throws Exception, IOException {
         OpenWireTextMessage textMessage = new OpenWireTextMessage();
         textMessage.setText("string");
         textMessage.clearBody();
         assertNull(textMessage.getText());
-        try {
-            textMessage.setText("String");
-            textMessage.getText();
-        } catch (MessageNotWriteableException mnwe) {
-            fail("should be writeable");
-        } catch (MessageNotReadableException mnre) {
-            fail("should be readable");
-        }
+        textMessage.setText("String");
+        textMessage.getText();
     }
 
     @Test
diff --git a/pom.xml b/pom.xml
index 5135a68..85b0bec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -144,11 +144,6 @@
         <version>${reflections-version}</version>
       </dependency>
       <dependency>
-        <groupId>org.apache.geronimo.specs</groupId>
-        <artifactId>geronimo-jms_1.1_spec</artifactId>
-        <version>1.1.1</version>
-      </dependency>
-      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>${junit-version}</version>