diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/BufferPool.java b/client/src/main/java/org/apache/qpid/bytebuffer/BufferPool.java
deleted file mode 100644
index cb0b5ba..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/BufferPool.java
+++ /dev/null
@@ -1,54 +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.qpid.bytebuffer;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-class BufferPool
-{
-    private final int _maxSize;
-    private final ConcurrentLinkedQueue<ByteBuffer> _pooledBuffers = new ConcurrentLinkedQueue<>();
-
-    BufferPool(final int maxSize)
-    {
-        _maxSize = maxSize;
-    }
-
-    ByteBuffer getBuffer()
-    {
-        return _pooledBuffers.poll();
-    }
-
-    void returnBuffer(ByteBuffer buf)
-    {
-        buf.clear();
-        if (_pooledBuffers.size() < _maxSize)
-        {
-            _pooledBuffers.add(buf);
-        }
-    }
-
-    public int getMaxSize()
-    {
-        return _maxSize;
-    }
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/ByteBufferRef.java b/client/src/main/java/org/apache/qpid/bytebuffer/ByteBufferRef.java
deleted file mode 100644
index 30628e4..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/ByteBufferRef.java
+++ /dev/null
@@ -1,34 +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.qpid.bytebuffer;
-
-import java.nio.ByteBuffer;
-
-public interface ByteBufferRef
-{
-    void incrementRef();
-
-    void decrementRef();
-
-    ByteBuffer getBuffer();
-
-    void removeFromPool();
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/NonPooledByteBufferRef.java b/client/src/main/java/org/apache/qpid/bytebuffer/NonPooledByteBufferRef.java
deleted file mode 100644
index 6f0b8af..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/NonPooledByteBufferRef.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.qpid.bytebuffer;
-
-import java.nio.ByteBuffer;
-
-class NonPooledByteBufferRef implements ByteBufferRef
-{
-    private final ByteBuffer _buffer;
-
-    NonPooledByteBufferRef(final ByteBuffer buffer)
-    {
-        _buffer = buffer;
-    }
-
-    @Override
-    public void incrementRef()
-    {
-
-    }
-
-    @Override
-    public void decrementRef()
-    {
-
-    }
-
-    @Override
-    public ByteBuffer getBuffer()
-    {
-        return _buffer;
-    }
-
-    @Override
-    public void removeFromPool()
-    {
-
-    }
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/PooledByteBufferRef.java b/client/src/main/java/org/apache/qpid/bytebuffer/PooledByteBufferRef.java
deleted file mode 100644
index 807dfe9..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/PooledByteBufferRef.java
+++ /dev/null
@@ -1,70 +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.qpid.bytebuffer;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-
-class PooledByteBufferRef implements ByteBufferRef
-{
-    private static final AtomicIntegerFieldUpdater<PooledByteBufferRef> REF_COUNT = AtomicIntegerFieldUpdater.newUpdater(PooledByteBufferRef.class, "_refCount");
-
-    private final ByteBuffer _buffer;
-    private volatile int _refCount;
-
-    PooledByteBufferRef(final ByteBuffer buffer)
-    {
-        _buffer = buffer;
-    }
-
-    @Override
-    public void incrementRef()
-    {
-
-        if(REF_COUNT.get(this) >= 0)
-        {
-            REF_COUNT.incrementAndGet(this);
-        }
-    }
-
-    @Override
-    public void decrementRef()
-    {
-        if(REF_COUNT.get(this) > 0 && REF_COUNT.decrementAndGet(this) == 0)
-        {
-            QpidByteBuffer.returnToPool(_buffer);
-        }
-    }
-
-    @Override
-    public ByteBuffer getBuffer()
-    {
-        return _buffer.duplicate();
-    }
-
-    @Override
-    public void removeFromPool()
-    {
-        REF_COUNT.set(this, Integer.MIN_VALUE/2);
-    }
-
-
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBuffer.java b/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBuffer.java
deleted file mode 100644
index eec2a05..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBuffer.java
+++ /dev/null
@@ -1,884 +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.qpid.bytebuffer;
-
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.channels.GatheringByteChannel;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLEngineResult;
-import javax.net.ssl.SSLException;
-
-import org.apache.qpid.streams.CompositeInputStream;
-
-public class QpidByteBuffer
-{
-    private static final AtomicIntegerFieldUpdater<QpidByteBuffer>
-            DISPOSED_UPDATER = AtomicIntegerFieldUpdater.newUpdater(
-            QpidByteBuffer.class,
-            "_disposed");
-    private static final ThreadLocal<QpidByteBuffer> _cachedBuffer = new ThreadLocal<>();
-    private static final ByteBuffer[] EMPTY_BYTE_BUFFER_ARRAY = new ByteBuffer[0];
-    private volatile static boolean _isPoolInitialized;
-    private volatile static BufferPool _bufferPool;
-    private volatile static int _pooledBufferSize;
-    private volatile static ByteBuffer _zeroed;
-    private final int _offset;
-
-    final ByteBufferRef _ref;
-    volatile ByteBuffer _buffer;
-    @SuppressWarnings("unused")
-    private volatile int _disposed;
-
-
-    QpidByteBuffer(ByteBufferRef ref)
-    {
-        this(ref, ref.getBuffer(), 0);
-    }
-
-    private QpidByteBuffer(ByteBufferRef ref, ByteBuffer buffer, int offset)
-    {
-        _ref = ref;
-        _buffer = buffer;
-        _offset = offset;
-        _ref.incrementRef();
-    }
-
-    public final boolean isDirect()
-    {
-        return _buffer.isDirect();
-    }
-
-    public final short getUnsignedByte()
-    {
-        return (short) (((short) get()) & 0xFF);
-    }
-
-    public final int getUnsignedShort()
-    {
-        return ((int) getShort()) & 0xffff;
-    }
-
-    public final int getUnsignedShort(int pos)
-    {
-        return ((int) getShort(pos)) & 0xffff;
-    }
-
-
-    public final long getUnsignedInt()
-    {
-        return ((long) getInt()) & 0xffffffffL;
-    }
-
-    public final QpidByteBuffer putUnsignedByte(final short s)
-    {
-        put((byte) s);
-        return this;
-    }
-
-    public final QpidByteBuffer putUnsignedShort(final int i)
-    {
-        putShort((short) i);
-        return this;
-    }
-
-    public final QpidByteBuffer putUnsignedInt(final long value)
-    {
-        putInt((int) value);
-        return this;
-    }
-
-    public final void dispose()
-    {
-        if (DISPOSED_UPDATER.compareAndSet(this, 0, 1))
-        {
-            _ref.decrementRef();
-            _buffer = null;
-        }
-    }
-
-    public final InputStream asInputStream()
-    {
-        return new BufferInputStream(this);
-    }
-
-    public final ByteBuffer asByteBuffer()
-    {
-        try
-        {
-            return getUnderlyingBuffer();
-        }
-        finally
-        {
-            dispose();
-        }
-    }
-
-    public final CharBuffer decode(Charset charset)
-    {
-        return charset.decode(getUnderlyingBuffer());
-    }
-
-    public final int read(ReadableByteChannel channel) throws IOException
-    {
-        return channel.read(getUnderlyingBuffer());
-    }
-
-    public final SSLEngineResult decryptSSL(SSLEngine engine, QpidByteBuffer dest) throws SSLException
-    {
-        return engine.unwrap(getUnderlyingBuffer(), dest.getUnderlyingBuffer());
-    }
-
-    @Override
-    public String toString()
-    {
-        return "QpidByteBuffer{" +
-               "_buffer=" + _buffer +
-               ", _disposed=" + _disposed +
-               '}';
-    }
-
-    public final boolean hasRemaining()
-    {
-        return _buffer.hasRemaining();
-    }
-
-    public QpidByteBuffer putInt(final int index, final int value)
-    {
-        _buffer.putInt(index, value);
-        return this;
-    }
-
-    public QpidByteBuffer putShort(final int index, final short value)
-    {
-        _buffer.putShort(index, value);
-        return this;
-    }
-
-    public QpidByteBuffer putChar(final int index, final char value)
-    {
-        _buffer.putChar(index, value);
-        return this;
-    }
-
-    public final QpidByteBuffer put(final byte b)
-    {
-        _buffer.put(b);
-        return this;
-    }
-
-    public QpidByteBuffer put(final int index, final byte b)
-    {
-        _buffer.put(index, b);
-        return this;
-    }
-
-    public short getShort(final int index)
-    {
-        return _buffer.getShort(index);
-    }
-
-    public final QpidByteBuffer mark()
-    {
-        _buffer.mark();
-        return this;
-    }
-
-    public final long getLong()
-    {
-        return _buffer.getLong();
-    }
-
-    public QpidByteBuffer putFloat(final int index, final float value)
-    {
-        _buffer.putFloat(index, value);
-        return this;
-    }
-
-    public double getDouble(final int index)
-    {
-        return _buffer.getDouble(index);
-    }
-
-    public final boolean hasArray()
-    {
-        return _buffer.hasArray();
-    }
-
-    public final double getDouble()
-    {
-        return _buffer.getDouble();
-    }
-
-    public final QpidByteBuffer putFloat(final float value)
-    {
-        _buffer.putFloat(value);
-        return this;
-    }
-
-    public final QpidByteBuffer putInt(final int value)
-    {
-        _buffer.putInt(value);
-        return this;
-    }
-
-    public byte[] array()
-    {
-        return _buffer.array();
-    }
-
-    public final QpidByteBuffer putShort(final short value)
-    {
-        _buffer.putShort(value);
-        return this;
-    }
-
-    public int getInt(final int index)
-    {
-        return _buffer.getInt(index);
-    }
-
-    public final int remaining()
-    {
-        return _buffer.remaining();
-    }
-
-    public final QpidByteBuffer put(final byte[] src)
-    {
-        _buffer.put(src);
-        return this;
-    }
-
-    public final QpidByteBuffer put(final ByteBuffer src)
-    {
-        _buffer.put(src);
-        return this;
-    }
-
-    public final QpidByteBuffer put(final QpidByteBuffer src)
-    {
-        int sourceRemaining = src.remaining();
-        if (sourceRemaining > remaining())
-        {
-            throw new BufferOverflowException();
-        }
-
-        _buffer.put(src.getUnderlyingBuffer());
-        return this;
-    }
-
-    public final QpidByteBuffer get(final byte[] dst, final int offset, final int length)
-    {
-        _buffer.get(dst, offset, length);
-        return this;
-    }
-
-    public final QpidByteBuffer get(final ByteBuffer dst)
-    {
-        int destinationRemaining = dst.remaining();
-        int remaining = remaining();
-        if (destinationRemaining < remaining)
-        {
-            throw new BufferUnderflowException();
-        }
-        dst.put(_buffer);
-        return this;
-    }
-
-    public final void copyTo(final ByteBuffer dst)
-    {
-        dst.put(_buffer.duplicate());
-    }
-
-    public final void putCopyOf(final QpidByteBuffer source)
-    {
-        int remaining = remaining();
-        int sourceRemaining = source.remaining();
-        if (sourceRemaining > remaining)
-        {
-            throw new BufferOverflowException();
-        }
-
-        put(source.getUnderlyingBuffer().duplicate());
-    }
-
-    public QpidByteBuffer rewind()
-    {
-        _buffer.rewind();
-        return this;
-    }
-
-    public QpidByteBuffer clear()
-    {
-        _buffer.clear();
-        return this;
-    }
-
-    public QpidByteBuffer putLong(final int index, final long value)
-    {
-        _buffer.putLong(index, value);
-        return this;
-    }
-
-    public QpidByteBuffer compact()
-    {
-        _buffer.compact();
-        return this;
-    }
-
-    public final QpidByteBuffer putDouble(final double value)
-    {
-        _buffer.putDouble(value);
-        return this;
-    }
-
-    public int limit()
-    {
-        return _buffer.limit();
-    }
-
-    public QpidByteBuffer reset()
-    {
-        _buffer.reset();
-        return this;
-    }
-
-    public QpidByteBuffer flip()
-    {
-        _buffer.flip();
-        return this;
-    }
-
-    public final short getShort()
-    {
-        return _buffer.getShort();
-    }
-
-    public final float getFloat()
-    {
-        return _buffer.getFloat();
-    }
-
-    public QpidByteBuffer limit(final int newLimit)
-    {
-        _buffer.limit(newLimit);
-        return this;
-    }
-
-    /**
-     * Method does not respect mark.
-     *
-     * @return QpidByteBuffer
-     */
-    public QpidByteBuffer duplicate()
-    {
-        ByteBuffer buffer = _ref.getBuffer();
-        if (!(_ref instanceof PooledByteBufferRef))
-        {
-            buffer = buffer.duplicate();
-        }
-
-        buffer.position(_offset );
-        buffer.limit(_offset + _buffer.capacity());
-
-        buffer = buffer.slice();
-
-        buffer.limit(_buffer.limit());
-        buffer.position(_buffer.position());
-        return new QpidByteBuffer(_ref, buffer, _offset);
-    }
-
-    public final QpidByteBuffer put(final byte[] src, final int offset, final int length)
-    {
-        _buffer.put(src, offset, length);
-        return this;
-    }
-
-    public long getLong(final int index)
-    {
-        return _buffer.getLong(index);
-    }
-
-    public int capacity()
-    {
-        return _buffer.capacity();
-    }
-
-    public char getChar(final int index)
-    {
-        return _buffer.getChar(index);
-    }
-
-    public final byte get()
-    {
-        return _buffer.get();
-    }
-
-    public byte get(final int index)
-    {
-        return _buffer.get(index);
-    }
-
-    public final QpidByteBuffer get(final byte[] dst)
-    {
-        _buffer.get(dst);
-        return this;
-    }
-
-    public final void copyTo(final byte[] dst)
-    {
-        if (remaining() < dst.length)
-        {
-            throw new BufferUnderflowException();
-        }
-        _buffer.duplicate().get(dst);
-    }
-
-    public final QpidByteBuffer putChar(final char value)
-    {
-        _buffer.putChar(value);
-        return this;
-    }
-
-    public QpidByteBuffer position(final int newPosition)
-    {
-        _buffer.position(newPosition);
-        return this;
-    }
-
-    public int arrayOffset()
-    {
-        return _buffer.arrayOffset();
-    }
-
-    public final char getChar()
-    {
-        return _buffer.getChar();
-    }
-
-    public final int getInt()
-    {
-        return _buffer.getInt();
-    }
-
-    public final QpidByteBuffer putLong(final long value)
-    {
-        _buffer.putLong(value);
-        return this;
-    }
-
-    public float getFloat(final int index)
-    {
-        return _buffer.getFloat(index);
-    }
-
-    public QpidByteBuffer slice()
-    {
-        return view(0, _buffer.remaining());
-    }
-
-    public QpidByteBuffer view(int offset, int length)
-    {
-        ByteBuffer buffer = _ref.getBuffer();
-        if (!(_ref instanceof PooledByteBufferRef))
-        {
-            buffer = buffer.duplicate();
-        }
-
-        int newRemaining = Math.min(_buffer.remaining() - offset, length);
-
-        int newPosition = _offset + _buffer.position() + offset;
-        buffer.limit(newPosition + newRemaining);
-        buffer.position(newPosition);
-
-        buffer = buffer.slice();
-
-        return new QpidByteBuffer(_ref, buffer, newPosition);
-    }
-
-    public int position()
-    {
-        return _buffer.position();
-    }
-
-    public QpidByteBuffer putDouble(final int index, final double value)
-    {
-        _buffer.putDouble(index, value);
-        return this;
-    }
-
-    ByteBuffer getUnderlyingBuffer()
-    {
-        return _buffer;
-    }
-
-    public static QpidByteBuffer allocate(boolean direct, int size)
-    {
-        return direct ? allocateDirect(size) : allocate(size);
-    }
-
-    public static QpidByteBuffer allocate(int size)
-    {
-        return new QpidByteBuffer(new NonPooledByteBufferRef(ByteBuffer.allocate(size)));
-    }
-
-    public static QpidByteBuffer allocateDirect(int size)
-    {
-        if (size < 0)
-        {
-            throw new IllegalArgumentException("Cannot allocate QpidByteBuffer with size "
-                                               + size
-                                               + " which is negative.");
-        }
-
-        final ByteBufferRef ref;
-        if (_isPoolInitialized && _pooledBufferSize >= size)
-        {
-            if (_pooledBufferSize == size)
-            {
-                ByteBuffer buf = _bufferPool.getBuffer();
-                if (buf == null)
-                {
-                    buf = ByteBuffer.allocateDirect(size);
-                }
-                ref = new PooledByteBufferRef(buf);
-            }
-            else
-            {
-                QpidByteBuffer buf = _cachedBuffer.get();
-                if (buf == null || buf.remaining() < size)
-                {
-                    if (buf != null)
-                    {
-                        buf.dispose();
-                    }
-                    buf = allocateDirect(_pooledBufferSize);
-                }
-                QpidByteBuffer rVal = buf.view(0, size);
-                buf.position(buf.position() + size);
-
-                _cachedBuffer.set(buf);
-                return rVal;
-            }
-        }
-        else
-        {
-            ref = new NonPooledByteBufferRef(ByteBuffer.allocateDirect(size));
-        }
-        return new QpidByteBuffer(ref);
-    }
-
-    public static Collection<QpidByteBuffer> allocateDirectCollection(int size)
-    {
-        if (_pooledBufferSize == 0)
-        {
-            return Collections.singleton(allocateDirect(size));
-        }
-        else
-        {
-            List<QpidByteBuffer> buffers = new ArrayList<>((size / _pooledBufferSize) + 2);
-            int remaining = size;
-
-            QpidByteBuffer buf = _cachedBuffer.get();
-            if (buf == null)
-            {
-                buf = allocateDirect(_pooledBufferSize);
-            }
-            while (remaining > buf.remaining())
-            {
-                int bufRemaining = buf.remaining();
-                if (buf == _cachedBuffer.get())
-                {
-                    buffers.add(buf.view(0, bufRemaining));
-                    buf.dispose();
-                }
-                else
-                {
-                    buffers.add(buf);
-                }
-                remaining -= bufRemaining;
-                buf = allocateDirect(_pooledBufferSize);
-            }
-            buffers.add(buf.view(0, remaining));
-            buf.position(buf.position() + remaining);
-
-            if (buf.hasRemaining())
-            {
-                _cachedBuffer.set(buf);
-            }
-            else
-            {
-                _cachedBuffer.set(allocateDirect(_pooledBufferSize));
-                buf.dispose();
-            }
-            return buffers;
-        }
-    }
-
-    public static SSLEngineResult encryptSSL(SSLEngine engine,
-                                             final Collection<QpidByteBuffer> buffers,
-                                             QpidByteBuffer dest) throws SSLException
-    {
-        final ByteBuffer[] src;
-        // QPID-7447: prevent unnecessary allocations
-        if (buffers.isEmpty())
-        {
-            src = EMPTY_BYTE_BUFFER_ARRAY;
-        }
-        else
-        {
-            src = new ByteBuffer[buffers.size()];
-            Iterator<QpidByteBuffer> iterator = buffers.iterator();
-            for (int i = 0; i < src.length; i++)
-            {
-                src[i] = iterator.next().getUnderlyingBuffer();
-            }
-        }
-        return engine.wrap(src, dest.getUnderlyingBuffer());
-    }
-
-    public static Collection<QpidByteBuffer> inflate(Collection<QpidByteBuffer> compressedBuffers) throws IOException
-    {
-        if (compressedBuffers == null)
-        {
-            throw new IllegalArgumentException("compressedBuffers cannot be null");
-        }
-
-        boolean isDirect = false;
-        Collection<InputStream> streams = new ArrayList<>(compressedBuffers.size());
-        for (QpidByteBuffer buffer : compressedBuffers)
-        {
-            isDirect = isDirect || buffer.isDirect();
-            streams.add(buffer.asInputStream());
-        }
-        final int bufferSize = (isDirect && _pooledBufferSize > 0) ? _pooledBufferSize : 65536;
-
-        Collection<QpidByteBuffer> uncompressedBuffers = new ArrayList<>();
-        try (GZIPInputStream gzipInputStream = new GZIPInputStream(new CompositeInputStream(streams)))
-        {
-            byte[] buf = new byte[bufferSize];
-            int read;
-            while ((read = gzipInputStream.read(buf)) != -1)
-            {
-                QpidByteBuffer output = isDirect ? allocateDirect(read) : allocate(read);
-                output.put(buf, 0, read);
-                output.flip();
-                uncompressedBuffers.add(output);
-            }
-            return uncompressedBuffers;
-        }
-        catch (IOException e)
-        {
-            for (QpidByteBuffer uncompressedBuffer : uncompressedBuffers)
-            {
-                uncompressedBuffer.dispose();
-            }
-            throw e;
-        }
-    }
-
-    public static Collection<QpidByteBuffer> deflate(Collection<QpidByteBuffer> uncompressedBuffers) throws IOException
-    {
-        if (uncompressedBuffers == null)
-        {
-            throw new IllegalArgumentException("uncompressedBuffers cannot be null");
-        }
-
-        boolean isDirect = false;
-        Collection<InputStream> streams = new ArrayList<>(uncompressedBuffers.size());
-        for (QpidByteBuffer buffer : uncompressedBuffers)
-        {
-            isDirect = isDirect || buffer.isDirect();
-            streams.add(buffer.asInputStream());
-        }
-        final int bufferSize = (isDirect && _pooledBufferSize > 0) ? _pooledBufferSize : 65536;
-
-        try(QpidByteBufferOutputStream compressedOutput = new QpidByteBufferOutputStream(isDirect, bufferSize);
-            InputStream compressedInput = new CompositeInputStream(streams);
-            GZIPOutputStream gzipStream = new GZIPOutputStream(new BufferedOutputStream(compressedOutput, bufferSize)))
-        {
-            byte[] buf = new byte[16384];
-            int read;
-            while ((read = compressedInput.read(buf)) > -1)
-            {
-                gzipStream.write(buf, 0, read);
-            }
-            gzipStream.finish();
-            gzipStream.flush();
-            return compressedOutput.fetchAccumulatedBuffers();
-        }
-    }
-
-    public static long write(GatheringByteChannel channel, Collection<QpidByteBuffer> qpidByteBuffers)
-            throws IOException
-    {
-        ByteBuffer[] byteBuffers = new ByteBuffer[qpidByteBuffers.size()];
-        Iterator<QpidByteBuffer> iterator = qpidByteBuffers.iterator();
-        for (int i = 0; i < byteBuffers.length; i++)
-        {
-            byteBuffers[i] = iterator.next().getUnderlyingBuffer();
-        }
-        return channel.write(byteBuffers);
-    }
-
-    public static QpidByteBuffer wrap(final ByteBuffer wrap)
-    {
-        return new QpidByteBuffer(new NonPooledByteBufferRef(wrap));
-    }
-
-    public static QpidByteBuffer wrap(final byte[] data)
-    {
-        return wrap(ByteBuffer.wrap(data));
-    }
-
-    public static QpidByteBuffer wrap(final byte[] data, int offset, int length)
-    {
-        return wrap(ByteBuffer.wrap(data, offset, length));
-    }
-
-    static void returnToPool(final ByteBuffer buffer)
-    {
-        buffer.clear();
-        final ByteBuffer duplicate = _zeroed.duplicate();
-        duplicate.limit(buffer.capacity());
-        buffer.put(duplicate);
-
-        _bufferPool.returnBuffer(buffer);
-    }
-
-    public synchronized static void initialisePool(int bufferSize, int maxPoolSize)
-    {
-        if (_isPoolInitialized && (bufferSize != _pooledBufferSize || maxPoolSize != _bufferPool.getMaxSize()))
-        {
-            final String errorMessage = String.format(
-                    "QpidByteBuffer pool has already been initialised with bufferSize=%d and maxPoolSize=%d." +
-                    "Re-initialisation with different bufferSize=%d and maxPoolSize=%d is not allowed.",
-                    _pooledBufferSize,
-                    _bufferPool.getMaxSize(),
-                    bufferSize,
-                    maxPoolSize);
-            throw new IllegalStateException(errorMessage);
-        }
-        if (bufferSize <= 0)
-        {
-            throw new IllegalArgumentException("Negative or zero bufferSize illegal : " + bufferSize);
-        }
-
-        _bufferPool = new BufferPool(maxPoolSize);
-        _pooledBufferSize = bufferSize;
-        _zeroed = ByteBuffer.allocateDirect(_pooledBufferSize);
-        _isPoolInitialized = true;
-    }
-
-    public static int getPooledBufferSize()
-    {
-        return _pooledBufferSize;
-    }
-
-    private static final class BufferInputStream extends InputStream
-    {
-        private final QpidByteBuffer _qpidByteBuffer;
-
-        private BufferInputStream(final QpidByteBuffer buffer)
-        {
-            _qpidByteBuffer = buffer;
-        }
-
-        @Override
-        public int read() throws IOException
-        {
-            if (_qpidByteBuffer.hasRemaining())
-            {
-                return _qpidByteBuffer.get() & 0xFF;
-            }
-            return -1;
-        }
-
-
-        @Override
-        public int read(byte[] b, int off, int len) throws IOException
-        {
-            if (!_qpidByteBuffer.hasRemaining())
-            {
-                return -1;
-            }
-            if (_qpidByteBuffer.remaining() < len)
-            {
-                len = _qpidByteBuffer.remaining();
-            }
-            _qpidByteBuffer.get(b, off, len);
-
-            return len;
-        }
-
-        @Override
-        public void mark(int readlimit)
-        {
-            _qpidByteBuffer.mark();
-        }
-
-        @Override
-        public void reset() throws IOException
-        {
-            _qpidByteBuffer.reset();
-        }
-
-        @Override
-        public boolean markSupported()
-        {
-            return true;
-        }
-
-        @Override
-        public long skip(long n) throws IOException
-        {
-            _qpidByteBuffer.position(_qpidByteBuffer.position() + (int) n);
-            return n;
-        }
-
-        @Override
-        public int available() throws IOException
-        {
-            return _qpidByteBuffer.remaining();
-        }
-
-        @Override
-        public void close()
-        {
-        }
-    }
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferInputStream.java b/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferInputStream.java
deleted file mode 100644
index 54ed85a..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferInputStream.java
+++ /dev/null
@@ -1,109 +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.qpid.bytebuffer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.qpid.streams.CompositeInputStream;
-
-/**
- * InputStream implementation that takes a list QpidByteBuffers.
- * The QpidByteBufferInputStream takes ownership of the buffers and disposes them on close().
- *
- * Not thread safe.
- */
-public class QpidByteBufferInputStream extends InputStream
-{
-    private final CompositeInputStream _compositeInputStream;
-    private final Collection<QpidByteBuffer> _buffers;
-
-    public QpidByteBufferInputStream(Collection<QpidByteBuffer> buffers)
-    {
-        _buffers = buffers;
-
-        final Collection<InputStream> streams = new ArrayList<>(buffers.size());
-        for (QpidByteBuffer buffer : buffers)
-        {
-            streams.add(buffer.asInputStream());
-        }
-        _compositeInputStream = new CompositeInputStream(streams);
-    }
-
-    @Override
-    public int read() throws IOException
-    {
-        return _compositeInputStream.read();
-    }
-
-    @Override
-    public int read(byte[] b, int off, int len) throws IOException
-    {
-        return _compositeInputStream.read(b, off, len);
-    }
-
-    @Override
-    public void mark(int readlimit)
-    {
-        _compositeInputStream.mark(readlimit);
-    }
-
-    @Override
-    public void reset() throws IOException
-    {
-        _compositeInputStream.reset();
-    }
-
-    @Override
-    public boolean markSupported()
-    {
-        return _compositeInputStream.markSupported();
-    }
-
-    @Override
-    public long skip(long n) throws IOException
-    {
-        return _compositeInputStream.skip(n);
-    }
-
-    @Override
-    public int available() throws IOException
-    {
-        return _compositeInputStream.available();
-    }
-
-    @Override
-    public void close() throws IOException
-    {
-        try
-        {
-            _compositeInputStream.close();
-        }
-        finally
-        {
-            for (QpidByteBuffer buffer : _buffers)
-            {
-                buffer.dispose();
-            }
-        }
-    }
-}
diff --git a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStream.java b/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStream.java
deleted file mode 100644
index e772809..0000000
--- a/client/src/main/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStream.java
+++ /dev/null
@@ -1,113 +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.qpid.bytebuffer;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-
-/**
- * OutputStream implementation that yields a list QpidByteBuffers that contain a copy
- * of the incoming bytes.  Use fetchAccumulatedBuffers to get the buffers.  Caller
- * has responsibility to dispose the buffers after use.
- *
- * It will be normally be desirable to front this stream with java.io.BufferedOutputStream
- * to minimise the number of write and thus the number of buffers created.
- *
- * Not thread safe.
- */
-public class QpidByteBufferOutputStream extends OutputStream
-{
-    private final LinkedList<QpidByteBuffer> _buffers = new LinkedList<>();
-    private final boolean _isDirect;
-    private final int _maximumBufferSize;
-    private boolean _closed;
-
-    public QpidByteBufferOutputStream(final boolean isDirect, final int maximumBufferSize)
-    {
-        if (maximumBufferSize <= 0)
-        {
-            throw new IllegalArgumentException("Negative or zero maximumBufferSize illegal : " + maximumBufferSize);
-        }
-        _isDirect = isDirect;
-        _maximumBufferSize = maximumBufferSize;
-    }
-
-    @Override
-    public void write(int b) throws IOException
-    {
-        int size = 1;
-        byte[] data = new byte[] {(byte)b};
-        allocateDataBuffers(data, 0, size);
-    }
-
-    @Override
-    public void write(byte[] data) throws IOException
-    {
-        write(data, 0, data.length);
-    }
-
-    @Override
-    public void write(byte[] data, int offset, int len) throws IOException
-    {
-        allocateDataBuffers(data, offset, len);
-    }
-
-    @Override
-    public void close() throws IOException
-    {
-        _closed = true;
-        for (QpidByteBuffer buffer : _buffers)
-        {
-            buffer.dispose();
-        }
-        _buffers.clear();
-    }
-
-    public Collection<QpidByteBuffer> fetchAccumulatedBuffers()
-    {
-        Collection<QpidByteBuffer> bufs = new ArrayList<>(_buffers);
-        _buffers.clear();
-        return bufs;
-    }
-
-    private void allocateDataBuffers(byte[] data, int offset, int len) throws IOException
-    {
-        if (_closed)
-        {
-            throw new IOException("Stream is closed");
-        }
-
-        int size = Math.min(_maximumBufferSize, len);
-
-        QpidByteBuffer current = _isDirect ? QpidByteBuffer.allocateDirect(len) : QpidByteBuffer.allocate(len);
-        current.put(data, offset, size);
-        current.flip();
-        _buffers.add(current);
-        if (len > size)
-        {
-            allocateDataBuffers(data, offset + size, len - size);
-        }
-    }
-}
diff --git a/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java b/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
index a7dd2dc..41166e0 100644
--- a/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
+++ b/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
@@ -38,7 +38,6 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.client.failover.FailoverException;
 import org.apache.qpid.client.message.AMQMessageDelegate_0_8;
 import org.apache.qpid.client.message.AbstractJMSMessage;
@@ -239,7 +238,7 @@
 
                 final int headerLength = contentHeaderProperties.getPropertyListSize() + 2;
                 byte[] unencryptedBytes = new byte[headerLength + size];
-                QpidByteBuffer output = QpidByteBuffer.wrap(unencryptedBytes);
+                ByteBuffer output = ByteBuffer.wrap(unencryptedBytes);
                 output.putShort((short) (contentHeaderProperties.getPropertyFlags() & 0xffff));
                 contentHeaderProperties.writePropertyListPayload(output);
 
diff --git a/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java b/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java
index c4cf72a..8bb9178 100644
--- a/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java
+++ b/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessageFactory.java
@@ -24,7 +24,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -34,7 +33,6 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.client.AMQQueue;
 import org.apache.qpid.client.AMQSession_0_8;
 import org.apache.qpid.client.AMQTopic;
@@ -78,7 +76,7 @@
                     _logger.debug("Non-fragmented message body (bodySize=" + contentHeader.getBodySize() + ")");
                 }
 
-                data = ((ContentBody) bodies.get(0)).getPayload().asByteBuffer().duplicate();
+                data = ((ContentBody) bodies.get(0)).getPayload().duplicate();
             }
             else if (bodies != null)
             {
@@ -93,7 +91,7 @@
                 while (it.hasNext())
                 {
                     ContentBody cb = (ContentBody) it.next();
-                    final ByteBuffer payload = cb.getPayload().asByteBuffer().duplicate();
+                    final ByteBuffer payload = cb.getPayload().duplicate();
                     if (payload.isDirect() || payload.isReadOnly())
                     {
                         data.put(payload);
@@ -133,24 +131,16 @@
 
     protected AbstractJMSMessage create010MessageWithBody(long messageNbr, MessageProperties msgProps,
                                                           DeliveryProperties deliveryProps,
-                                                          Collection<QpidByteBuffer> body) throws QpidException
+                                                          ByteBuffer body) throws QpidException
     {
         ByteBuffer data;
         final boolean debug = _logger.isDebugEnabled();
 
 
-        if (body != null && body.size() != 0)
+        if (body != null && body.remaining() != 0)
         {
-            int size = 0;
-            for(QpidByteBuffer b : body)
-            {
-                size += b.remaining();
-            }
-            data = ByteBuffer.allocate(size);
-            for(QpidByteBuffer b : body)
-            {
-                b.get(data);
-            }
+            data = ByteBuffer.allocate(body.remaining());
+            data.put(body);
             data.flip();
         }
         else // body == null
@@ -192,7 +182,7 @@
     }
 
     public AbstractJMSMessage createMessage(long messageNbr, boolean redelivered, MessageProperties msgProps,
-                                            DeliveryProperties deliveryProps, Collection<QpidByteBuffer> body)
+                                            DeliveryProperties deliveryProps, ByteBuffer body)
             throws JMSException, QpidException
     {
         final AbstractJMSMessage msg =
@@ -205,7 +195,7 @@
     private class BodyInputStream extends InputStream
     {
         private final Iterator<ContentBody> _bodiesIter;
-        private QpidByteBuffer _currentBuffer;
+        private ByteBuffer _currentBuffer;
         public BodyInputStream(final List<ContentBody> bodies)
         {
             _bodiesIter = bodies.iterator();
diff --git a/client/src/main/java/org/apache/qpid/client/message/Encrypted091MessageFactory.java b/client/src/main/java/org/apache/qpid/client/message/Encrypted091MessageFactory.java
index 187fbaf..3bae2d6 100644
--- a/client/src/main/java/org/apache/qpid/client/message/Encrypted091MessageFactory.java
+++ b/client/src/main/java/org/apache/qpid/client/message/Encrypted091MessageFactory.java
@@ -39,7 +39,6 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.client.AMQSession;
 import org.apache.qpid.framing.BasicContentHeaderProperties;
 
@@ -143,7 +142,7 @@
 
                 BasicContentHeaderProperties properties = new BasicContentHeaderProperties();
                 int payloadOffset;
-                QpidByteBuffer dataInput = QpidByteBuffer.wrap(unencryptedBytes);
+                ByteBuffer dataInput = ByteBuffer.wrap(unencryptedBytes);
 
                 payloadOffset = properties.read(dataInput);
 
diff --git a/client/src/main/java/org/apache/qpid/codec/AMQDecoder.java b/client/src/main/java/org/apache/qpid/codec/AMQDecoder.java
index e0f04f7..febf46b 100644
--- a/client/src/main/java/org/apache/qpid/codec/AMQDecoder.java
+++ b/client/src/main/java/org/apache/qpid/codec/AMQDecoder.java
@@ -20,12 +20,21 @@
  */
 package org.apache.qpid.codec;
 
+import java.nio.ByteBuffer;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.framing.*;
+import org.apache.qpid.framing.AMQFrameDecodingException;
+import org.apache.qpid.framing.AMQProtocolVersionException;
+import org.apache.qpid.framing.ContentBody;
+import org.apache.qpid.framing.ContentHeaderBody;
+import org.apache.qpid.framing.HeartbeatBody;
+import org.apache.qpid.framing.MethodProcessor;
+import org.apache.qpid.framing.ProtocolInitiation;
+import org.apache.qpid.framing.ProtocolVersion;
 import org.apache.qpid.protocol.ErrorCodes;
+import org.apache.qpid.util.ByteBufferUtils;
 
 /**
  * AMQDecoder delegates the decoding of AMQP either to a data block decoder, or in the case of new connections, to a
@@ -91,7 +100,7 @@
         return _methodProcessor;
     }
 
-    protected final int decode(final QpidByteBuffer buf) throws AMQFrameDecodingException
+    protected final int decode(final ByteBuffer buf) throws AMQFrameDecodingException
     {
         // If this is the first read then we may be getting a protocol initiation back if we tried to negotiate
         // an unsupported version
@@ -124,7 +133,7 @@
         return buf.hasRemaining() ? required : 0;
     }
 
-    protected int processAMQPFrames(final QpidByteBuffer buf) throws AMQFrameDecodingException
+    protected int processAMQPFrames(final ByteBuffer buf) throws AMQFrameDecodingException
     {
         final int required = decodable(buf);
         if (required == 0)
@@ -134,7 +143,7 @@
         return required;
     }
 
-    protected int decodable(final QpidByteBuffer in) throws AMQFrameDecodingException
+    protected int decodable(final ByteBuffer in) throws AMQFrameDecodingException
     {
         final int remainingAfterAttributes = in.remaining() - FRAME_HEADER_SIZE;
         // type, channel, body length and end byte
@@ -160,13 +169,13 @@
 
     }
 
-    protected void processInput(final QpidByteBuffer in)
+    protected void processInput(final ByteBuffer in)
             throws AMQFrameDecodingException, AMQProtocolVersionException
     {
         final byte type = in.get();
 
-        final int channel = in.getUnsignedShort();
-        final long bodySize = in.getUnsignedInt();
+        final int channel = ByteBufferUtils.getUnsignedShort(in);
+        final long bodySize = ByteBufferUtils.getUnsignedInt(in);
 
         // bodySize can be zero
         if ((channel < 0) || (bodySize < 0))
@@ -188,7 +197,7 @@
 
     }
 
-    protected void processFrame(final int channel, final byte type, final long bodySize, final QpidByteBuffer in)
+    protected void processFrame(final int channel, final byte type, final long bodySize, final ByteBuffer in)
             throws AMQFrameDecodingException
     {
         switch (type)
@@ -211,9 +220,7 @@
     }
 
 
-    abstract void processMethod(int channelId,
-                               QpidByteBuffer in)
-            throws AMQFrameDecodingException;
+    abstract void processMethod(int channelId, ByteBuffer in) throws AMQFrameDecodingException;
 
     AMQFrameDecodingException newUnknownMethodException(final int classId,
                                                         final int methodId,
diff --git a/client/src/main/java/org/apache/qpid/codec/ClientDecoder.java b/client/src/main/java/org/apache/qpid/codec/ClientDecoder.java
index fe9cbb4..9d31dab 100644
--- a/client/src/main/java/org/apache/qpid/codec/ClientDecoder.java
+++ b/client/src/main/java/org/apache/qpid/codec/ClientDecoder.java
@@ -22,12 +22,11 @@
 
 import java.nio.ByteBuffer;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.framing.*;
 
 public class ClientDecoder extends AMQDecoder<ClientMethodProcessor<? extends ClientChannelMethodProcessor>>
 {
-    private QpidByteBuffer _incompleteBuffer;
+    private ByteBuffer _incompleteBuffer;
 
     /**
      * Creates a new AMQP decoder.
@@ -43,14 +42,12 @@
     {
         if (_incompleteBuffer == null)
         {
-            QpidByteBuffer qpidByteBuffer = QpidByteBuffer.wrap(incomingBuffer);
-            final int required = decode(qpidByteBuffer);
+            final int required = decode(incomingBuffer);
             if (required != 0)
             {
-                _incompleteBuffer = QpidByteBuffer.allocate(qpidByteBuffer.remaining() + required);
-                _incompleteBuffer.put(qpidByteBuffer);
+                _incompleteBuffer = ByteBuffer.allocate(incomingBuffer.remaining() + required);
+                _incompleteBuffer.put(incomingBuffer);
             }
-            qpidByteBuffer.dispose();
         }
         else
         {
@@ -61,33 +58,29 @@
             else
             {
                 _incompleteBuffer.flip();
-                final QpidByteBuffer aggregatedBuffer =
-                        QpidByteBuffer.allocate(_incompleteBuffer.remaining() + incomingBuffer.remaining());
+                final ByteBuffer aggregatedBuffer =
+                        ByteBuffer.allocate(_incompleteBuffer.remaining() + incomingBuffer.remaining());
                 aggregatedBuffer.put(_incompleteBuffer);
                 aggregatedBuffer.put(incomingBuffer);
                 aggregatedBuffer.flip();
                 final int required = decode(aggregatedBuffer);
 
-                _incompleteBuffer.dispose();
                 if (required != 0)
                 {
-                    _incompleteBuffer = QpidByteBuffer.allocate(aggregatedBuffer.remaining() + required);
+                    _incompleteBuffer = ByteBuffer.allocate(aggregatedBuffer.remaining() + required);
                     _incompleteBuffer.put(aggregatedBuffer);
                 }
                 else
                 {
                     _incompleteBuffer = null;
                 }
-                aggregatedBuffer.dispose();
             }
         }
         // post-condition: assert(!incomingBuffer.hasRemaining());
     }
 
     @Override
-    void processMethod(int channelId,
-                       QpidByteBuffer in)
-            throws AMQFrameDecodingException
+    void processMethod(int channelId, ByteBuffer in) throws AMQFrameDecodingException
     {
         ClientMethodProcessor<? extends ClientChannelMethodProcessor> methodProcessor = getMethodProcessor();
         ClientChannelMethodProcessor channelMethodProcessor = methodProcessor.getChannelMethodProcessor(channelId);
diff --git a/client/src/main/java/org/apache/qpid/codec/ServerDecoder.java b/client/src/main/java/org/apache/qpid/codec/ServerDecoder.java
deleted file mode 100644
index 98b3caf..0000000
--- a/client/src/main/java/org/apache/qpid/codec/ServerDecoder.java
+++ /dev/null
@@ -1,251 +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.qpid.codec;
-
-import java.io.IOException;
-
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.framing.*;
-
-public class ServerDecoder extends AMQDecoder<ServerMethodProcessor<? extends ServerChannelMethodProcessor>>
-{
-
-    /**
-     * Creates a new AMQP decoder.
-     *
-     * @param methodProcessor          method processor
-     */
-    public ServerDecoder(final ServerMethodProcessor<? extends ServerChannelMethodProcessor> methodProcessor)
-    {
-        super(true, methodProcessor);
-    }
-
-    public void decodeBuffer(QpidByteBuffer buf) throws AMQFrameDecodingException, AMQProtocolVersionException, IOException
-    {
-        decode(buf);
-    }
-
-
-    void processMethod(int channelId,
-                       QpidByteBuffer in)
-            throws AMQFrameDecodingException
-    {
-        ServerMethodProcessor<? extends ServerChannelMethodProcessor> methodProcessor = getMethodProcessor();
-        final int classAndMethod = in.getInt();
-        int classId = classAndMethod >> 16;
-        int methodId = classAndMethod & 0xFFFF;
-        methodProcessor.setCurrentMethod(classId, methodId);
-        try
-        {
-            switch (classAndMethod)
-            {
-                //CONNECTION_CLASS:
-                case 0x000a000b:
-                    ConnectionStartOkBody.process(in, methodProcessor);
-                    break;
-                case 0x000a0015:
-                    ConnectionSecureOkBody.process(in, methodProcessor);
-                    break;
-                case 0x000a001f:
-                    ConnectionTuneOkBody.process(in, methodProcessor);
-                    break;
-                case 0x000a0028:
-                    ConnectionOpenBody.process(in, methodProcessor);
-                    break;
-                case 0x000a0032:
-                    if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8))
-                    {
-                        throw newUnknownMethodException(classId, methodId,
-                                                        methodProcessor.getProtocolVersion());
-                    }
-                    else
-                    {
-                        ConnectionCloseBody.process(in, methodProcessor);
-                    }
-                    break;
-                case 0x000a0033:
-                    if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8))
-                    {
-                        throw newUnknownMethodException(classId, methodId,
-                                                        methodProcessor.getProtocolVersion());
-                    }
-                    else
-                    {
-                        methodProcessor.receiveConnectionCloseOk();
-                    }
-                    break;
-                case 0x000a003c:
-                    if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8))
-                    {
-                        ConnectionCloseBody.process(in, methodProcessor);
-                    }
-                    else
-                    {
-                        throw newUnknownMethodException(classId, methodId,
-                                                        methodProcessor.getProtocolVersion());
-                    }
-                    break;
-                case 0x000a003d:
-                    if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8))
-                    {
-                        methodProcessor.receiveConnectionCloseOk();
-                    }
-                    else
-                    {
-                        throw newUnknownMethodException(classId, methodId,
-                                                        methodProcessor.getProtocolVersion());
-                    }
-                    break;
-
-                // CHANNEL_CLASS:
-
-                case 0x0014000a:
-                    ChannelOpenBody.process(channelId, in, methodProcessor);
-                    break;
-                case 0x00140014:
-                    ChannelFlowBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00140015:
-                    ChannelFlowOkBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00140028:
-                    ChannelCloseBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00140029:
-                    methodProcessor.getChannelMethodProcessor(channelId).receiveChannelCloseOk();
-                    break;
-
-                // ACCESS_CLASS:
-
-                case 0x001e000a:
-                    AccessRequestBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-
-                // EXCHANGE_CLASS:
-
-                case 0x0028000a:
-                    ExchangeDeclareBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00280014:
-                    ExchangeDeleteBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00280016:
-                    ExchangeBoundBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-
-
-                // QUEUE_CLASS:
-
-                case 0x0032000a:
-                    QueueDeclareBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00320014:
-                    QueueBindBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x0032001e:
-                    QueuePurgeBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00320028:
-                    QueueDeleteBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x00320032:
-                    QueueUnbindBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-
-
-                // BASIC_CLASS:
-
-                case 0x003c000a:
-                    BasicQosBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0014:
-                    BasicConsumeBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c001e:
-                    BasicCancelBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0028:
-                    BasicPublishBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0046:
-                    BasicGetBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0050:
-                    BasicAckBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c005a:
-                    BasicRejectBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0064:
-                    BasicRecoverBody.process(in, methodProcessor.getProtocolVersion(),
-                                             methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0066:
-                    BasicRecoverSyncBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c006e:
-                    BasicRecoverSyncBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-                case 0x003c0078:
-                    BasicNackBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-
-                // CONFIRM CLASS:
-
-                case 0x0055000a:
-                    ConfirmSelectBody.process(in, methodProcessor.getChannelMethodProcessor(channelId));
-                    break;
-
-                // TX_CLASS:
-
-                case 0x005a000a:
-                    if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk())
-                    {
-                        methodProcessor.getChannelMethodProcessor(channelId).receiveTxSelect();
-                    }
-                    break;
-                case 0x005a0014:
-                    if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk())
-                    {
-                        methodProcessor.getChannelMethodProcessor(channelId).receiveTxCommit();
-                    }
-                    break;
-                case 0x005a001e:
-                    if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk())
-                    {
-                        methodProcessor.getChannelMethodProcessor(channelId).receiveTxRollback();
-                    }
-                    break;
-
-
-                default:
-                    throw newUnknownMethodException(classId, methodId,
-                                                    methodProcessor.getProtocolVersion());
-
-            }
-        }
-        finally
-        {
-            methodProcessor.setCurrentMethod(0, 0);
-        }
-    }
-
-}
diff --git a/client/src/main/java/org/apache/qpid/framing/AMQFrame.java b/client/src/main/java/org/apache/qpid/framing/AMQFrame.java
index e838dd4..1a13795 100644
--- a/client/src/main/java/org/apache/qpid/framing/AMQFrame.java
+++ b/client/src/main/java/org/apache/qpid/framing/AMQFrame.java
@@ -20,8 +20,10 @@
  */
 package org.apache.qpid.framing;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class AMQFrame extends AMQDataBlock implements EncodableAMQDataBlock
 {
@@ -48,7 +50,7 @@
     }
 
 
-    private static final QpidByteBuffer FRAME_END_BYTE_BUFFER = QpidByteBuffer.allocateDirect(1);
+    private static final ByteBuffer FRAME_END_BYTE_BUFFER = ByteBuffer.allocate(1);
     static
     {
         FRAME_END_BYTE_BUFFER.put(FRAME_END_BYTE);
@@ -58,14 +60,13 @@
     @Override
     public long writePayload(final ByteBufferSender sender)
     {
-        QpidByteBuffer frameHeader = QpidByteBuffer.allocate(sender.isDirectBufferPreferred(), HEADER_SIZE);
+        ByteBuffer frameHeader = ByteBuffer.allocate(HEADER_SIZE);
 
         frameHeader.put(_bodyFrame.getFrameType());
-        frameHeader.putUnsignedShort(_channel);
-        frameHeader.putUnsignedInt((long) _bodyFrame.getSize());
+        ByteBufferUtils.putUnsignedShort(frameHeader, _channel);
+        ByteBufferUtils.putUnsignedInt(frameHeader, _bodyFrame.getSize());
         frameHeader.flip();
         sender.send(frameHeader);
-        frameHeader.dispose();
         long size = 8 + _bodyFrame.writePayload(sender);
 
         sender.send(FRAME_END_BYTE_BUFFER.duplicate());
diff --git a/client/src/main/java/org/apache/qpid/framing/AMQMethodBodyImpl.java b/client/src/main/java/org/apache/qpid/framing/AMQMethodBodyImpl.java
index a765288..8ecda94 100644
--- a/client/src/main/java/org/apache/qpid/framing/AMQMethodBodyImpl.java
+++ b/client/src/main/java/org/apache/qpid/framing/AMQMethodBodyImpl.java
@@ -20,13 +20,15 @@
  */
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.protocol.AMQVersionAwareProtocolSession;
 import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public abstract class AMQMethodBodyImpl implements AMQMethodBody
 {
@@ -74,17 +76,16 @@
     {
 
         final int size = getSize();
-        QpidByteBuffer buf = QpidByteBuffer.allocate(sender.isDirectBufferPreferred(), size);
-        buf.putUnsignedShort(getClazz());
-        buf.putUnsignedShort(getMethod());
+        ByteBuffer buf = ByteBuffer.allocate(size);
+        ByteBufferUtils.putUnsignedShort(buf, getClazz());
+        ByteBufferUtils.putUnsignedShort(buf, getMethod());
         writeMethodPayload(buf);
         buf.flip();
         sender.send(buf);
-        buf.dispose();
         return size;
     }
 
-    abstract protected void writeMethodPayload(QpidByteBuffer buffer);
+    abstract protected void writeMethodPayload(ByteBuffer buffer);
 
 
     protected int getSizeOf(AMQShortString string)
@@ -92,18 +93,18 @@
         return EncodingUtils.encodedShortStringLength(string);
     }
 
-    protected void writeByte(QpidByteBuffer buffer, byte b)
+    protected void writeByte(ByteBuffer buffer, byte b)
     {
         buffer.put(b);
     }
 
-    protected void writeAMQShortString(QpidByteBuffer buffer, AMQShortString string)
+    protected void writeAMQShortString(ByteBuffer buffer, AMQShortString string)
     {
         EncodingUtils.writeShortStringBytes(buffer, string);
     }
 
 
-    protected void writeInt(QpidByteBuffer buffer, int i)
+    protected void writeInt(ByteBuffer buffer, int i)
     {
         buffer.putInt(i);
     }
@@ -114,12 +115,12 @@
         return EncodingUtils.encodedFieldTableLength(table);  //To change body of created methods use File | Settings | File Templates.
     }
 
-    protected void writeFieldTable(QpidByteBuffer buffer, FieldTable table)
+    protected void writeFieldTable(ByteBuffer buffer, FieldTable table)
     {
         EncodingUtils.writeFieldTableBytes(buffer, table);
     }
 
-    protected void writeLong(QpidByteBuffer buffer, long l)
+    protected void writeLong(ByteBuffer buffer, long l)
     {
         buffer.putLong(l);
     }
@@ -130,34 +131,34 @@
         return (response == null) ? 4 : response.length + 4;
     }
 
-    protected void writeBytes(QpidByteBuffer buffer, byte[] data)
+    protected void writeBytes(ByteBuffer buffer, byte[] data)
     {
         EncodingUtils.writeBytes(buffer,data);
     }
 
-    protected void writeShort(QpidByteBuffer buffer, short s)
+    protected void writeShort(ByteBuffer buffer, short s)
     {
         buffer.putShort(s);
     }
 
-    protected void writeBitfield(QpidByteBuffer buffer, byte bitfield0)
+    protected void writeBitfield(ByteBuffer buffer, byte bitfield0)
     {
         buffer.put(bitfield0);
     }
 
-    protected void writeUnsignedShort(QpidByteBuffer buffer, int s)
+    protected void writeUnsignedShort(ByteBuffer buffer, int s)
     {
-        buffer.putUnsignedShort(s);
+        ByteBufferUtils.putUnsignedShort(buffer, s);
     }
 
-    protected void writeUnsignedInteger(QpidByteBuffer buffer, long i)
+    protected void writeUnsignedInteger(ByteBuffer buffer, long i)
     {
-        buffer.putUnsignedInt(i);
+        ByteBufferUtils.putUnsignedInt(buffer, i);
     }
 
-    protected void writeUnsignedByte(QpidByteBuffer buffer, short unsignedByte)
+    protected void writeUnsignedByte(ByteBuffer buffer, short unsignedByte)
     {
-        buffer.putUnsignedByte(unsignedByte);
+        ByteBufferUtils.putUnsignedByte(buffer, unsignedByte);
     }
 
 }
diff --git a/client/src/main/java/org/apache/qpid/framing/AMQShortString.java b/client/src/main/java/org/apache/qpid/framing/AMQShortString.java
index a2ce6fd..9d2ba59 100644
--- a/client/src/main/java/org/apache/qpid/framing/AMQShortString.java
+++ b/client/src/main/java/org/apache/qpid/framing/AMQShortString.java
@@ -28,8 +28,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-
 /**
  * A short string is a representation of an AMQ Short String
  * Short strings differ from the Java String class by being limited to on ASCII characters (0-127)
@@ -123,34 +121,6 @@
         }
     }
 
-    public static AMQShortString readAMQShortString(QpidByteBuffer buffer)
-    {
-        int length = ((int) buffer.get()) & 0xff;
-        if(length == 0)
-        {
-            return null;
-        }
-        else
-        {
-            if (length > MAX_LENGTH)
-            {
-                throw new IllegalArgumentException("Cannot create AMQShortString with number of octets over 255!");
-            }
-            if(length > buffer.remaining())
-            {
-                throw new IllegalArgumentException("Cannot create AMQShortString with length "
-                                                   + length + " from a ByteBuffer with only "
-                                                   + buffer.remaining()
-                                                   + " bytes.");
-
-            }
-            byte[] data = new byte[length];
-            buffer.get(data);
-            return new AMQShortString(data, 0, length);
-        }
-    }
-
-
     public AMQShortString(byte[] data, final int offset, final int length)
     {
         if (length > MAX_LENGTH)
@@ -197,7 +167,7 @@
         }
     }
 
-    public void writeToBuffer(QpidByteBuffer buffer)
+    public void writeToBuffer(ByteBuffer buffer)
     {
         final int size = length();
         buffer.put((byte)size);
diff --git a/client/src/main/java/org/apache/qpid/framing/AMQType.java b/client/src/main/java/org/apache/qpid/framing/AMQType.java
index b42efed..24594ce 100644
--- a/client/src/main/java/org/apache/qpid/framing/AMQType.java
+++ b/client/src/main/java/org/apache/qpid/framing/AMQType.java
@@ -21,9 +21,10 @@
 package org.apache.qpid.framing;
 
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.util.Collection;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 /**
  * AMQType is a type that represents the different possible AMQP field table types. It provides operations for each
@@ -51,12 +52,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             EncodingUtils.writeLongStringBytes(buffer, (String) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return EncodingUtils.readLongString(buffer);
         }
@@ -98,14 +99,14 @@
         }
 
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putLong( (Long) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
-            return buffer.getUnsignedInt();
+            return ByteBufferUtils.getUnsignedInt(buffer);
         }
     },
 
@@ -130,7 +131,7 @@
         }
 
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             BigDecimal bd = (BigDecimal) value;
 
@@ -143,7 +144,7 @@
             buffer.putInt(unscaled);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             byte places = buffer.get();
 
@@ -175,12 +176,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putLong ((Long) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getLong();
         }
@@ -233,7 +234,7 @@
             return (FieldTable) value;
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             // Ensure that the value is a FieldTable.
             if (!(value instanceof FieldTable))
@@ -253,7 +254,7 @@
          *
          * @return An instance of the type.
          */
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             try
             {
@@ -295,7 +296,7 @@
                     return FieldArray.asFieldArray((Collection)value);
                 }
 
-                public void writeValueImpl(Object value, QpidByteBuffer buffer)
+                public void writeValueImpl(Object value, ByteBuffer buffer)
                 {
 
                     if (!(value instanceof FieldArray))
@@ -316,7 +317,7 @@
                  *
                  * @return An instance of the type.
                  */
-                public Object readValueFromBuffer(QpidByteBuffer buffer)
+                public Object readValueFromBuffer(ByteBuffer buffer)
                 {
                     // Read size of field table then all name/value pairs.
                     return FieldArray.readFromBuffer(buffer);
@@ -343,10 +344,10 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         { }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return null;
         }
@@ -372,12 +373,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             EncodingUtils.writeLongstr(buffer, (byte[]) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return EncodingUtils.readLongstr(buffer);
         }
@@ -402,12 +403,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             EncodingUtils.writeLongStringBytes(buffer, (String) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return EncodingUtils.readLongString(buffer);
         }
@@ -433,12 +434,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             EncodingUtils.writeLongStringBytes(buffer, (String) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return EncodingUtils.readLongString(buffer);
         }
@@ -468,12 +469,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             EncodingUtils.writeBoolean(buffer, (Boolean) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.get() == 1;
         }
@@ -503,13 +504,13 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             char charVal = (Character) value;
             buffer.put((byte) charVal);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return (char) buffer.get();
         }
@@ -539,12 +540,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.put((Byte) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.get();
         }
@@ -578,12 +579,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putShort((Short) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getShort();
         }
@@ -620,11 +621,11 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putInt((Integer) value);
         }
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getInt();
         }
@@ -666,12 +667,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putLong ((Long) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getLong();
         }
@@ -701,12 +702,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putFloat ((Float) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getFloat();
         }
@@ -740,12 +741,12 @@
             }
         }
 
-        public void writeValueImpl(Object value, QpidByteBuffer buffer)
+        public void writeValueImpl(Object value, ByteBuffer buffer)
         {
             buffer.putDouble((Double) value);
         }
 
-        public Object readValueFromBuffer(QpidByteBuffer buffer)
+        public Object readValueFromBuffer(ByteBuffer buffer)
         {
             return buffer.getDouble();
         }
@@ -805,13 +806,13 @@
         return AMQTypedValue.createAMQTypedValue(this, toNativeValue(value));
     }
 
-    public void writeToBuffer(Object value, QpidByteBuffer buffer)
+    public void writeToBuffer(Object value, ByteBuffer buffer)
     {
         buffer.put(identifier());
         writeValueImpl(value, buffer);
     }
 
-    abstract void writeValueImpl(Object value, QpidByteBuffer buffer);
+    abstract void writeValueImpl(Object value, ByteBuffer buffer);
 
     /**
      * Reads an instance of the type from a specified byte buffer.
@@ -820,5 +821,5 @@
      *
      * @return An instance of the type.
      */
-    abstract Object readValueFromBuffer(QpidByteBuffer buffer);
+    abstract Object readValueFromBuffer(ByteBuffer buffer);
 }
diff --git a/client/src/main/java/org/apache/qpid/framing/AMQTypedValue.java b/client/src/main/java/org/apache/qpid/framing/AMQTypedValue.java
index dd4605e..d71e89b 100644
--- a/client/src/main/java/org/apache/qpid/framing/AMQTypedValue.java
+++ b/client/src/main/java/org/apache/qpid/framing/AMQTypedValue.java
@@ -21,12 +21,11 @@
 package org.apache.qpid.framing;
 
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Map;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-
 /**
  * AMQTypedValue combines together a native Java Object value, and an {@link AMQType}, as a fully typed AMQP parameter
  * value. It provides the ability to read and write fully typed parameters to and from byte buffers. It also provides
@@ -40,7 +39,7 @@
 
     public abstract Object getValue();
 
-    public abstract void writeToBuffer(QpidByteBuffer buffer);
+    public abstract void writeToBuffer(ByteBuffer buffer);
 
     public abstract int getEncodingSize();
 
@@ -64,7 +63,7 @@
             _value = type.toNativeValue(value);
         }
 
-        private GenericTypedValue(AMQType type, QpidByteBuffer buffer)
+        private GenericTypedValue(AMQType type, ByteBuffer buffer)
         {
             _type = type;
             _value = type.readValueFromBuffer(buffer);
@@ -81,7 +80,7 @@
             return _value;
         }
 
-        public void writeToBuffer(QpidByteBuffer buffer)
+        public void writeToBuffer(ByteBuffer buffer)
         {
             _type.writeToBuffer(_value, buffer);
         }
@@ -128,7 +127,7 @@
             _value = value;
         }
 
-        public LongTypedValue(QpidByteBuffer buffer)
+        public LongTypedValue(ByteBuffer buffer)
         {
             _value = buffer.getLong();
         }
@@ -144,7 +143,7 @@
             return _value;
         }
 
-        public void writeToBuffer(QpidByteBuffer buffer)
+        public void writeToBuffer(ByteBuffer buffer)
         {
             buffer.put(AMQType.LONG.identifier());
             buffer.putLong(_value);
@@ -183,7 +182,7 @@
             return _value;
         }
 
-        public void writeToBuffer(QpidByteBuffer buffer)
+        public void writeToBuffer(ByteBuffer buffer)
         {
             buffer.put(AMQType.INT.identifier());
             buffer.putInt(_value);
@@ -196,7 +195,7 @@
     }
 
 
-    public static AMQTypedValue readFromBuffer(QpidByteBuffer buffer)
+    public static AMQTypedValue readFromBuffer(ByteBuffer buffer)
     {
         AMQType type = AMQTypeMap.getType(buffer.get());
 
diff --git a/client/src/main/java/org/apache/qpid/framing/AccessRequestBody.java b/client/src/main/java/org/apache/qpid/framing/AccessRequestBody.java
index 9d2c535..0291c1b 100644
--- a/client/src/main/java/org/apache/qpid/framing/AccessRequestBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/AccessRequestBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class AccessRequestBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -120,7 +121,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _realm );
         writeBitfield( buffer, _bitfield0 );
@@ -155,7 +156,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
         AMQShortString realm = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/AccessRequestOkBody.java b/client/src/main/java/org/apache/qpid/framing/AccessRequestOkBody.java
index bffaa21..d03094d 100644
--- a/client/src/main/java/org/apache/qpid/framing/AccessRequestOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/AccessRequestOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class AccessRequestOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -67,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
     }
@@ -86,10 +88,10 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveAccessRequestOk(ticket);
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicAckBody.java b/client/src/main/java/org/apache/qpid/framing/BasicAckBody.java
index 9a832a2..410c7d4 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicAckBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicAckBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicAckBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -79,7 +80,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeLong( buffer, _deliveryTag );
         writeBitfield( buffer, _bitfield0 );
@@ -102,7 +103,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicCancelBody.java b/client/src/main/java/org/apache/qpid/framing/BasicCancelBody.java
index 7890127..5af85e2 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicCancelBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicCancelBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicCancelBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -80,7 +81,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _consumerTag );
         writeBitfield( buffer, _bitfield0 );
@@ -103,7 +104,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicCancelOkBody.java b/client/src/main/java/org/apache/qpid/framing/BasicCancelOkBody.java
index a2f0dfc..0434d5c 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicCancelOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicCancelOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicCancelOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -68,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _consumerTag );
     }
@@ -87,7 +88,7 @@
         return buf.toString();
     }
 
-    public static void process(QpidByteBuffer in,
+    public static void process(ByteBuffer in,
                                final ClientChannelMethodProcessor dispatcher)
     {
         AMQShortString consumerTag = AMQShortString.readAMQShortString(in);
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicConsumeBody.java b/client/src/main/java/org/apache/qpid/framing/BasicConsumeBody.java
index c9492d4..bca5473 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicConsumeBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicConsumeBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicConsumeBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -134,7 +136,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -178,12 +180,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
             throws AMQFrameDecodingException
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         AMQShortString consumerTag = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicConsumeOkBody.java b/client/src/main/java/org/apache/qpid/framing/BasicConsumeOkBody.java
index 0b5d120..a24f0e2 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicConsumeOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicConsumeOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicConsumeOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -68,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _consumerTag );
     }
@@ -87,7 +88,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
         AMQShortString consumerTag = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java b/client/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
index 4ba8d59..ec4512e 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
@@ -20,11 +20,13 @@
  */
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicContentHeaderProperties
 {
@@ -80,7 +82,7 @@
     private static final int APPLICATION_ID_MASK = 1 << 3;
     private static final int CLUSTER_ID_MASK = 1 << 2;
 
-    private QpidByteBuffer _encodedForm;
+    private ByteBuffer _encodedForm;
 
 
     public BasicContentHeaderProperties(BasicContentHeaderProperties other)
@@ -224,11 +226,11 @@
         return _propertyFlags;
     }
 
-    public synchronized long writePropertyListPayload(QpidByteBuffer buffer)
+    public synchronized long writePropertyListPayload(ByteBuffer buffer)
     {
         if(useEncodedForm())
         {
-            buffer.putCopyOf(_encodedForm);
+            ByteBufferUtils.copyTo(_encodedForm, buffer);
             return _encodedForm.remaining();
 
         }
@@ -317,10 +319,10 @@
         }
     }
 
-    public int read(QpidByteBuffer input)
+    public int read(ByteBuffer input)
     {
 
-        _propertyFlags = input.getUnsignedShort();
+        _propertyFlags = ByteBufferUtils.getUnsignedShort(input);
         int length = 2;
         if ((_propertyFlags & (CONTENT_TYPE_MASK)) != 0)
         {
@@ -459,25 +461,22 @@
     {
         if(useEncodedForm())
         {
-            final QpidByteBuffer duplicate = _encodedForm.duplicate();
-            sender.send(duplicate);
-            duplicate.dispose();
+            sender.send(_encodedForm.duplicate());
             return _encodedForm.remaining();
         }
         else
         {
             int propertyListSize = getPropertyListSize();
-            QpidByteBuffer buf = QpidByteBuffer.allocate(sender.isDirectBufferPreferred(), propertyListSize);
+            ByteBuffer buf = ByteBuffer.allocate(propertyListSize);
             writePropertyListPayload(buf);
             buf.flip();
             sender.send(buf);
-            buf.dispose();
             return propertyListSize;
         }
 
     }
 
-    public synchronized void populatePropertiesFromBuffer(QpidByteBuffer buffer, int propertyFlags, int size) throws AMQFrameDecodingException
+    public synchronized void populatePropertiesFromBuffer(ByteBuffer buffer, int propertyFlags, int size) throws AMQFrameDecodingException
     {
         _propertyFlags = propertyFlags;
 
@@ -485,20 +484,14 @@
         {
             _logger.debug("Property flags: " + _propertyFlags);
         }
-        if(_encodedForm != null)
-        {
-            _encodedForm.dispose();
-        }
-        _encodedForm = buffer.view(0,size);
+        _encodedForm = ByteBufferUtils.view(buffer, 0, size);
 
-        final QpidByteBuffer byteBuffer = _encodedForm.slice();
-        decode(byteBuffer);
-        byteBuffer.dispose();
+        decode(_encodedForm.slice());
         buffer.position(buffer.position()+size);
 
     }
 
-    private void decode(QpidByteBuffer buffer) throws AMQFrameDecodingException
+    private void decode(ByteBuffer buffer) throws AMQFrameDecodingException
     {
         if ((_propertyFlags & (CONTENT_TYPE_MASK)) != 0)
         {
@@ -512,11 +505,10 @@
 
         if ((_propertyFlags & HEADERS_MASK) != 0)
         {
-            long length = buffer.getUnsignedInt();
+            long length = ByteBufferUtils.getUnsignedInt(buffer);
 
-            QpidByteBuffer buf = buffer.view(0, (int)length);
+            ByteBuffer buf = ByteBufferUtils.view(buffer, 0, (int) length);
             _headers = new FieldTable(buf);
-            buf.dispose();
             buffer.position(buffer.position()+(int)length);
         }
 
@@ -958,7 +950,6 @@
     {
         if(_encodedForm != null)
         {
-            _encodedForm.dispose();
             _encodedForm = null;
         }
     }
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicDeliverBody.java b/client/src/main/java/org/apache/qpid/framing/BasicDeliverBody.java
index f7e87dd..44c4b46 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicDeliverBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicDeliverBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicDeliverBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -104,7 +105,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _consumerTag );
         writeLong( buffer, _deliveryTag );
@@ -139,7 +140,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicGetBody.java b/client/src/main/java/org/apache/qpid/framing/BasicGetBody.java
index 61a2e13..f61dcf4 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicGetBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicGetBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicGetBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -87,7 +89,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -114,11 +116,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         boolean noAck = (buffer.get() & 0x01) != 0;
         if(!dispatcher.ignoreAllButCloseOk())
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicGetEmptyBody.java b/client/src/main/java/org/apache/qpid/framing/BasicGetEmptyBody.java
index dbc52a4..ea3a56d 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicGetEmptyBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicGetEmptyBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicGetEmptyBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -68,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _clusterId );
     }
@@ -87,7 +88,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
         AMQShortString clusterId = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicGetOkBody.java b/client/src/main/java/org/apache/qpid/framing/BasicGetOkBody.java
index 4032d50..82101d0 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicGetOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicGetOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicGetOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -103,7 +105,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeLong( buffer, _deliveryTag );
         writeBitfield( buffer, _bitfield0 );
@@ -138,14 +140,14 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
         long deliveryTag = buffer.getLong();
         boolean redelivered = (buffer.get() & 0x01) != 0;
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString routingKey = AMQShortString.readAMQShortString(buffer);
-        long messageCount = buffer.getUnsignedInt();
+        long messageCount = ByteBufferUtils.getUnsignedInt(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveBasicGetOk(deliveryTag, redelivered, exchange, routingKey, messageCount);
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicNackBody.java b/client/src/main/java/org/apache/qpid/framing/BasicNackBody.java
index fbb26d1..daa302a 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicNackBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicNackBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicNackBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -91,7 +92,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeLong( buffer, _deliveryTag );
         writeBitfield( buffer, _bitfield0 );
@@ -117,7 +118,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicPublishBody.java b/client/src/main/java/org/apache/qpid/framing/BasicPublishBody.java
index fbf08d8..164e5ef 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicPublishBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicPublishBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicPublishBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -105,7 +107,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _exchange );
@@ -139,11 +141,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString routingKey = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicQosBody.java b/client/src/main/java/org/apache/qpid/framing/BasicQosBody.java
index c3caa8a..a33db2c 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicQosBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicQosBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicQosBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -86,7 +88,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedInteger( buffer, _prefetchSize );
         writeUnsignedShort( buffer, _prefetchCount );
@@ -113,12 +115,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        long prefetchSize = buffer.getUnsignedInt();
-        int prefetchCount = buffer.getUnsignedShort();
+        long prefetchSize = ByteBufferUtils.getUnsignedInt(buffer);
+        int prefetchCount = ByteBufferUtils.getUnsignedShort(buffer);
         boolean global = (buffer.get() & 0x01) == 0x01;
         if(!dispatcher.ignoreAllButCloseOk())
         {
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicQosOkBody.java b/client/src/main/java/org/apache/qpid/framing/BasicQosOkBody.java
index 7e3f867..3e73136 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicQosOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicQosOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicQosOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicRecoverBody.java b/client/src/main/java/org/apache/qpid/framing/BasicRecoverBody.java
index 04190ef..f75e9e8 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicRecoverBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicRecoverBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicRecoverBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -72,7 +73,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBitfield( buffer, _bitfield0 );
     }
@@ -91,7 +92,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in,
+    public static void process(final ByteBuffer in,
                                final ProtocolVersion protocolVersion,
                                final ServerChannelMethodProcessor dispatcher)
     {
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncBody.java b/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncBody.java
index b5d78ae..4af0504 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicRecoverSyncBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -74,7 +75,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBitfield( buffer, _bitfield0 );
     }
@@ -93,7 +94,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in,
+    public static void process(final ByteBuffer in,
                                final ServerChannelMethodProcessor dispatcher)
     {
         boolean requeue = (in.get() & 0x01) == 0x01;
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncOkBody.java b/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncOkBody.java
index 0dba591..a246f12 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicRecoverSyncOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicRecoverSyncOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -68,7 +69,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicRejectBody.java b/client/src/main/java/org/apache/qpid/framing/BasicRejectBody.java
index 854916e..8fd30e6 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicRejectBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicRejectBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class BasicRejectBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -79,7 +80,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeLong( buffer, _deliveryTag );
         writeBitfield( buffer, _bitfield0 );
@@ -102,7 +103,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/BasicReturnBody.java b/client/src/main/java/org/apache/qpid/framing/BasicReturnBody.java
index a5f7511..2dd3a6b 100644
--- a/client/src/main/java/org/apache/qpid/framing/BasicReturnBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/BasicReturnBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class BasicReturnBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -91,7 +93,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _replyCode );
         writeAMQShortString( buffer, _replyText );
@@ -122,11 +124,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
 
-        int replyCode = buffer.getUnsignedShort();
+        int replyCode = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString replyText = AMQShortString.readAMQShortString(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString routingKey = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelAlertBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelAlertBody.java
index e4065c8..e06aa65 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelAlertBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelAlertBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ChannelAlertBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -83,7 +85,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _replyCode );
         writeAMQShortString( buffer, _replyText );
@@ -110,12 +112,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
             throws AMQFrameDecodingException
     {
 
-        int replyCode = buffer.getUnsignedShort();
+        int replyCode = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString replyText = AMQShortString.readAMQShortString(buffer);
         FieldTable details = EncodingUtils.readFieldTable(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelCloseBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelCloseBody.java
index 03ebd01..961d58d 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelCloseBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelCloseBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ChannelCloseBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -89,7 +91,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _replyCode );
         writeAMQShortString( buffer, _replyText );
@@ -120,14 +122,14 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor dispatcher)
     {
 
-        int replyCode = buffer.getUnsignedShort();
+        int replyCode = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString replyText = AMQShortString.readAMQShortString(buffer);
-        int classId = buffer.getUnsignedShort();
-        int methodId = buffer.getUnsignedShort();
+        int classId = ByteBufferUtils.getUnsignedShort(buffer);
+        int methodId = ByteBufferUtils.getUnsignedShort(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveChannelClose(replyCode, replyText, classId, methodId);
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelCloseOkBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelCloseOkBody.java
index 3b1366e..42eedfb 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelCloseOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelCloseOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ChannelCloseOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -59,7 +60,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelFlowBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelFlowBody.java
index 5cf1e38..30bac89 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelFlowBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelFlowBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ChannelFlowBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -64,7 +65,7 @@
         return 1;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBitfield( buffer, _active ? (byte)1 : (byte)0);
     }
@@ -83,7 +84,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor dispatcher)
     {
         boolean active = (buffer.get() & 0x01) == 0x01;
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelFlowOkBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelFlowOkBody.java
index c91bc26..d783125 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelFlowOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelFlowOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ChannelFlowOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -65,7 +66,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBitfield( buffer, _active ? (byte)1 : (byte)0 );
     }
@@ -84,7 +85,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor dispatcher)
     {
         boolean active = (buffer.get() & 0x01) == 0x01;
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelMethodProcessor.java b/client/src/main/java/org/apache/qpid/framing/ChannelMethodProcessor.java
index 5a111b0..607ca96 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelMethodProcessor.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelMethodProcessor.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.framing;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
 
 public interface ChannelMethodProcessor
 {
@@ -32,7 +32,7 @@
 
     void receiveChannelCloseOk();
 
-    void receiveMessageContent(QpidByteBuffer data);
+    void receiveMessageContent(ByteBuffer data);
 
     void receiveMessageHeader(BasicContentHeaderProperties properties, long bodySize);
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelOpenBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelOpenBody.java
index fbf66ed..0b8eaa0 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelOpenBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelOpenBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ChannelOpenBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -57,7 +58,7 @@
         return 1;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, null );
     }
@@ -73,7 +74,7 @@
     }
 
     public static void process(final int channelId,
-                                final QpidByteBuffer buffer,
+                                final ByteBuffer buffer,
                                 final ServerMethodProcessor dispatcher)
     {
         AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/ChannelOpenOkBody.java b/client/src/main/java/org/apache/qpid/framing/ChannelOpenOkBody.java
index 82d2388..92588f1 100644
--- a/client/src/main/java/org/apache/qpid/framing/ChannelOpenOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ChannelOpenOkBody.java
@@ -28,9 +28,9 @@
 package org.apache.qpid.framing;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ChannelOpenOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -41,7 +41,7 @@
     public static final ChannelOpenOkBody INSTANCE_0_8 = new ChannelOpenOkBody(true);
     public static final ChannelOpenOkBody INSTANCE_0_9 = new ChannelOpenOkBody(false);
 
-    public static ChannelOpenOkBody getInstance(ProtocolVersion protocolVersion, QpidByteBuffer input)
+    public static ChannelOpenOkBody getInstance(ProtocolVersion protocolVersion, ByteBuffer input)
             throws IOException
     {
         final boolean isAMQP08 = ProtocolVersion.v0_8.equals(protocolVersion);
@@ -77,7 +77,7 @@
         return _isAMQP08 ? 0 : 4;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         if(!_isAMQP08)
         {
@@ -95,7 +95,7 @@
         return "[ChannelOpenOkBody]";
     }
 
-    public static void process(final QpidByteBuffer in,
+    public static void process(final ByteBuffer in,
                                final ProtocolVersion protocolVersion,
                                final ClientChannelMethodProcessor dispatcher)
     {
diff --git a/client/src/main/java/org/apache/qpid/framing/ConfirmSelectBody.java b/client/src/main/java/org/apache/qpid/framing/ConfirmSelectBody.java
index 59bdc08..3ec99e5 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConfirmSelectBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConfirmSelectBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConfirmSelectBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -64,7 +65,7 @@
         return 1;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBitfield( buffer, _nowait ? (byte)1 : (byte)0 );
     }
@@ -83,7 +84,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
         boolean nowait = (buffer.get() & 0x01) == 0x01;
diff --git a/client/src/main/java/org/apache/qpid/framing/ConfirmSelectOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConfirmSelectOkBody.java
index a6f8317..11e46f2 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConfirmSelectOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConfirmSelectOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConfirmSelectOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -58,7 +59,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionCloseBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionCloseBody.java
index 2550b06..117de14 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionCloseBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionCloseBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ConnectionCloseBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -90,7 +92,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _replyCode );
         writeAMQShortString( buffer, _replyText );
@@ -121,12 +123,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final MethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final MethodProcessor dispatcher)
     {
-        int replyCode = buffer.getUnsignedShort();
+        int replyCode = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString replyText = AMQShortString.readAMQShortString(buffer);
-        int classId = buffer.getUnsignedShort();
-        int methodId = buffer.getUnsignedShort();
+        int classId = ByteBufferUtils.getUnsignedShort(buffer);
+        int methodId = ByteBufferUtils.getUnsignedShort(buffer);
         dispatcher.receiveConnectionClose(replyCode, replyText, classId, methodId);
     }
 }
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionCloseOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionCloseOkBody.java
index b0e0193..d4c59f7 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionCloseOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionCloseOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionCloseOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -62,7 +63,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionOpenBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionOpenBody.java
index 123201c..3062233 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionOpenBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionOpenBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionOpenBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -83,7 +84,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _virtualHost );
         writeAMQShortString( buffer, _capabilities );
@@ -110,7 +111,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final ServerMethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final ServerMethodProcessor dispatcher)
     {
 
         AMQShortString virtualHost = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionOpenOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionOpenOkBody.java
index 6e909d5..e0afce2 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionOpenOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionOpenOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionOpenOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -69,7 +70,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _knownHosts );
     }
@@ -88,7 +89,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final ClientMethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final ClientMethodProcessor dispatcher)
     {
         AMQShortString knownHosts = AMQShortString.readAMQShortString(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionRedirectBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionRedirectBody.java
index d110f85..65657dc 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionRedirectBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionRedirectBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionRedirectBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -75,7 +76,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _host );
         writeAMQShortString( buffer, _knownHosts );
@@ -98,7 +99,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final ClientMethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final ClientMethodProcessor dispatcher)
     {
         AMQShortString host = AMQShortString.readAMQShortString(buffer);
         AMQShortString knownHosts = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionSecureBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionSecureBody.java
index 2f47487..4c73279 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionSecureBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionSecureBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionSecureBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -69,7 +70,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBytes( buffer, _challenge );
     }
@@ -88,7 +89,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in, final ClientMethodProcessor dispatcher)
+    public static void process(final ByteBuffer in, final ClientMethodProcessor dispatcher)
             throws AMQFrameDecodingException
 
     {
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionSecureOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionSecureOkBody.java
index 6566b1d..48108fb 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionSecureOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionSecureOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionSecureOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -68,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeBytes( buffer, _response );
     }
@@ -87,7 +88,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in, final ServerMethodProcessor dispatcher)
+    public static void process(final ByteBuffer in, final ServerMethodProcessor dispatcher)
     {
         byte[] response = EncodingUtils.readBytes(in);
         if(!dispatcher.ignoreAllButCloseOk())
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionStartBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionStartBody.java
index 682d968..3b82916 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionStartBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionStartBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ConnectionStartBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -98,7 +100,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedByte( buffer, _versionMajor );
         writeUnsignedByte( buffer, _versionMinor );
@@ -133,11 +135,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in, final ClientMethodProcessor dispatcher)
+    public static void process(final ByteBuffer in, final ClientMethodProcessor dispatcher)
             throws AMQFrameDecodingException
     {
-        short versionMajor = in.getUnsignedByte();
-        short versionMinor = in.getUnsignedByte();
+        short versionMajor = ByteBufferUtils.getUnsignedByte(in);
+        short versionMinor = ByteBufferUtils.getUnsignedByte(in);
         FieldTable serverProperties = EncodingUtils.readFieldTable(in);
         byte[] mechanisms = EncodingUtils.readBytes(in);
         byte[] locales = EncodingUtils.readBytes(in);
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionStartOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionStartOkBody.java
index cd1908c..d8aa2e3 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionStartOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionStartOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ConnectionStartOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -92,7 +93,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeFieldTable( buffer, _clientProperties );
         writeAMQShortString( buffer, _mechanism );
@@ -123,7 +124,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer in, final ServerMethodProcessor dispatcher)
+    public static void process(final ByteBuffer in, final ServerMethodProcessor dispatcher)
             throws AMQFrameDecodingException
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionTuneBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionTuneBody.java
index f73385d..bd31b2f 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionTuneBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionTuneBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ConnectionTuneBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -81,7 +83,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _channelMax );
         writeUnsignedInteger( buffer, _frameMax );
@@ -108,12 +110,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final ClientMethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final ClientMethodProcessor dispatcher)
     {
 
-        int channelMax = buffer.getUnsignedShort();
-        long frameMax = buffer.getUnsignedInt();
-        int heartbeat = buffer.getUnsignedShort();
+        int channelMax = ByteBufferUtils.getUnsignedShort(buffer);
+        long frameMax = ByteBufferUtils.getUnsignedInt(buffer);
+        int heartbeat = ByteBufferUtils.getUnsignedShort(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveConnectionTune(channelMax, frameMax, heartbeat);
diff --git a/client/src/main/java/org/apache/qpid/framing/ConnectionTuneOkBody.java b/client/src/main/java/org/apache/qpid/framing/ConnectionTuneOkBody.java
index 35c2340..aef177d 100644
--- a/client/src/main/java/org/apache/qpid/framing/ConnectionTuneOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ConnectionTuneOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ConnectionTuneOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -81,7 +83,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _channelMax );
         writeUnsignedInteger( buffer, _frameMax );
@@ -108,12 +110,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer, final ServerMethodProcessor dispatcher)
+    public static void process(final ByteBuffer buffer, final ServerMethodProcessor dispatcher)
     {
 
-        int channelMax = buffer.getUnsignedShort();
-        long frameMax = buffer.getUnsignedInt();
-        int heartbeat = buffer.getUnsignedShort();
+        int channelMax = ByteBufferUtils.getUnsignedShort(buffer);
+        long frameMax = ByteBufferUtils.getUnsignedInt(buffer);
+        int heartbeat = ByteBufferUtils.getUnsignedShort(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveConnectionTuneOk(channelMax, frameMax, heartbeat);
diff --git a/client/src/main/java/org/apache/qpid/framing/ContentBody.java b/client/src/main/java/org/apache/qpid/framing/ContentBody.java
index dd975ab..dbe0a55 100644
--- a/client/src/main/java/org/apache/qpid/framing/ContentBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ContentBody.java
@@ -23,28 +23,22 @@
 import java.nio.ByteBuffer;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.protocol.AMQVersionAwareProtocolSession;
 import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ContentBody implements AMQBody
 {
     public static final byte TYPE = 3;
 
-    private QpidByteBuffer _payload;
+    private ByteBuffer _payload;
 
 
     public ContentBody(ByteBuffer payload)
     {
-        _payload = QpidByteBuffer.wrap(payload.duplicate());
-    }
-
-    public ContentBody(QpidByteBuffer payload)
-    {
         _payload = payload.duplicate();
     }
 
-
     public byte getFrameType()
     {
         return TYPE;
@@ -66,9 +60,7 @@
     {
         if(_payload != null)
         {
-            final QpidByteBuffer duplicate = _payload.duplicate();
-            sender.send(duplicate);
-            duplicate.dispose();
+            sender.send(_payload.duplicate());
             return _payload.remaining();
         }
         else
@@ -77,7 +69,7 @@
         }
     }
 
-    public QpidByteBuffer getPayload()
+    public ByteBuffer getPayload()
     {
         return _payload;
     }
@@ -86,23 +78,20 @@
     {
         if (_payload != null)
         {
-            _payload.dispose();
             _payload = null;
         }
     }
 
-    public static void process(final QpidByteBuffer in,
+    public static void process(final ByteBuffer in,
                                final ChannelMethodProcessor methodProcessor, final long bodySize)
     {
-
-        QpidByteBuffer payload = in.view(0, (int) bodySize);
+        ByteBuffer payload = ByteBufferUtils.view(in, 0, (int) bodySize);
 
         if(!methodProcessor.ignoreAllButCloseOk())
         {
             methodProcessor.receiveMessageContent(payload);
         }
 
-        payload.dispose();
         in.position(in.position()+(int)bodySize);
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java b/client/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
index 0d07817..a263215 100644
--- a/client/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
@@ -20,10 +20,12 @@
  */
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.protocol.AMQVersionAwareProtocolSession;
 import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ContentHeaderBody implements AMQBody
 {
@@ -36,12 +38,12 @@
     /** must never be null */
     private final BasicContentHeaderProperties _properties;
 
-    public ContentHeaderBody(QpidByteBuffer buffer, long size) throws AMQFrameDecodingException
+    public ContentHeaderBody(ByteBuffer buffer, long size) throws AMQFrameDecodingException
     {
-        buffer.getUnsignedShort();
-        buffer.getUnsignedShort();
+        ByteBufferUtils.getUnsignedShort(buffer);
+        ByteBufferUtils.getUnsignedShort(buffer);
         _bodySize = buffer.getLong();
-        int propertyFlags = buffer.getUnsignedShort();
+        int propertyFlags = ByteBufferUtils.getUnsignedShort(buffer);
         ContentHeaderPropertiesFactory factory = ContentHeaderPropertiesFactory.getInstance();
         _properties = factory.createContentHeaderProperties(CLASS_ID, propertyFlags, buffer, (int)size - 14);
 
@@ -72,7 +74,7 @@
      * @throws AMQFrameDecodingException if there is a decoding issue
      * @throws AMQProtocolVersionException if there is a version issue
      */
-    public static ContentHeaderBody createFromBuffer(QpidByteBuffer buffer, long size)
+    public static ContentHeaderBody createFromBuffer(ByteBuffer buffer, long size)
         throws AMQFrameDecodingException, AMQProtocolVersionException
     {
         ContentHeaderBody body = new ContentHeaderBody(buffer, size);
@@ -88,23 +90,22 @@
     @Override
     public long writePayload(final ByteBufferSender sender)
     {
-        QpidByteBuffer data = QpidByteBuffer.allocate(sender.isDirectBufferPreferred(), HEADER_SIZE);
-        data.putUnsignedShort(CLASS_ID);
-        data.putUnsignedShort(0);
+        ByteBuffer data = ByteBuffer.allocate(HEADER_SIZE);
+        ByteBufferUtils.putUnsignedShort(data, CLASS_ID);
+        ByteBufferUtils.putUnsignedShort(data, 0);
         data.putLong(_bodySize);
-        data.putUnsignedShort(_properties.getPropertyFlags());
+        ByteBufferUtils.putUnsignedShort(data, _properties.getPropertyFlags());
         data.flip();
         sender.send(data);
-        data.dispose();
         return HEADER_SIZE + _properties.writePropertyListPayload(sender);
     }
 
-    public long writePayload(final QpidByteBuffer buf)
+    public long writePayload(final ByteBuffer buf)
     {
-        buf.putUnsignedShort(CLASS_ID);
-        buf.putUnsignedShort(0);
+        ByteBufferUtils.putUnsignedShort(buf, CLASS_ID);
+        ByteBufferUtils.putUnsignedShort(buf, 0);
         buf.putLong(_bodySize);
-        buf.putUnsignedShort(_properties.getPropertyFlags());
+        ByteBufferUtils.putUnsignedShort(buf, _properties.getPropertyFlags());
         return HEADER_SIZE + _properties.writePropertyListPayload(buf);
     }
 
@@ -160,15 +161,15 @@
         _bodySize = bodySize;
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ChannelMethodProcessor methodProcessor, final long size)
             throws AMQFrameDecodingException
     {
 
-        int classId = buffer.getUnsignedShort();
-        buffer.getUnsignedShort();
+        int classId = ByteBufferUtils.getUnsignedShort(buffer);
+        ByteBufferUtils.getUnsignedShort(buffer);
         long bodySize = buffer.getLong();
-        int propertyFlags = buffer.getUnsignedShort();
+        int propertyFlags = ByteBufferUtils.getUnsignedShort(buffer);
 
         BasicContentHeaderProperties properties;
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java b/client/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java
index 29d8849..dd35127 100644
--- a/client/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java
+++ b/client/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.framing;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
 
 public class ContentHeaderPropertiesFactory
 {
@@ -36,7 +36,7 @@
     }
 
     public BasicContentHeaderProperties createContentHeaderProperties(int classId, int propertyFlags,
-                                                                      QpidByteBuffer buffer, int size)
+                                                                      ByteBuffer buffer, int size)
              throws AMQFrameDecodingException
     {
         BasicContentHeaderProperties properties;
diff --git a/client/src/main/java/org/apache/qpid/framing/EncodingUtils.java b/client/src/main/java/org/apache/qpid/framing/EncodingUtils.java
index 8f156da..0272f9e 100644
--- a/client/src/main/java/org/apache/qpid/framing/EncodingUtils.java
+++ b/client/src/main/java/org/apache/qpid/framing/EncodingUtils.java
@@ -20,12 +20,13 @@
  */
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class EncodingUtils
 {
@@ -119,7 +120,7 @@
         }
     }
 
-    public static void writeLongAsShortString(QpidByteBuffer buffer, long l)
+    public static void writeLongAsShortString(ByteBuffer buffer, long l)
     {
         String s = Long.toString(l);
         byte[] encodedString = new byte[1+s.length()];
@@ -134,7 +135,7 @@
     }
 
 
-    public static void writeShortStringBytes(QpidByteBuffer buffer, AMQShortString s)
+    public static void writeShortStringBytes(ByteBuffer buffer, AMQShortString s)
     {
         if (s != null)
         {
@@ -147,18 +148,18 @@
         }
     }
 
-    public static void writeLongStringBytes(QpidByteBuffer buffer, String s)
+    public static void writeLongStringBytes(ByteBuffer buffer, String s)
     {
         if (s != null)
         {
             int len = getUTF8Length(s);
-            buffer.putUnsignedInt((long) len);
+            ByteBufferUtils.putUnsignedInt(buffer, (long) len);
             buffer.put(asUTF8Bytes(s));
 
         }
         else
         {
-            buffer.putUnsignedInt((long) 0);
+            ByteBufferUtils.putUnsignedInt(buffer, (long) 0);
         }
     }
 
@@ -167,7 +168,7 @@
         return 4;
     }
 
-    public static void writeFieldTableBytes(QpidByteBuffer buffer, FieldTable table)
+    public static void writeFieldTableBytes(ByteBuffer buffer, FieldTable table)
     {
         if (table != null)
         {
@@ -175,26 +176,26 @@
         }
         else
         {
-            buffer.putUnsignedInt((long) 0);
+            ByteBufferUtils.putUnsignedInt(buffer, (long) 0);
         }
     }
 
-    public static void writeLongstr(QpidByteBuffer buffer, byte[] data)
+    public static void writeLongstr(ByteBuffer buffer, byte[] data)
     {
         if (data != null)
         {
-            buffer.putUnsignedInt((long) data.length);
+            ByteBufferUtils.putUnsignedInt(buffer, (long) data.length);
             buffer.put(data);
         }
         else
         {
-            buffer.putUnsignedInt((long) 0);
+            ByteBufferUtils.putUnsignedInt(buffer, (long) 0);
         }
     }
 
-    public static FieldTable readFieldTable(QpidByteBuffer input) throws AMQFrameDecodingException
+    public static FieldTable readFieldTable(ByteBuffer input) throws AMQFrameDecodingException
     {
-        long length = input.getUnsignedInt();
+        long length = ByteBufferUtils.getUnsignedInt(input);
         if (length == 0)
         {
             return null;
@@ -206,7 +207,7 @@
     }
 
 
-    public static String readLongString(QpidByteBuffer buffer)
+    public static String readLongString(ByteBuffer buffer)
     {
         long length = ((long)(buffer.getInt())) & 0xFFFFFFFFL;
         if (length == 0)
@@ -222,7 +223,7 @@
         }
     }
 
-    public static byte[] readLongstr(QpidByteBuffer buffer)
+    public static byte[] readLongstr(ByteBuffer buffer)
     {
         long length = ((long)(buffer.getInt())) & 0xFFFFFFFFL;
         if (length == 0)
@@ -242,7 +243,7 @@
 
     // AMQP_BOOLEAN_PROPERTY_PREFIX
 
-    public static void writeBoolean(QpidByteBuffer buffer, boolean aBoolean)
+    public static void writeBoolean(ByteBuffer buffer, boolean aBoolean)
     {
         buffer.put(aBoolean ? (byte)1 : (byte)0);
     }
@@ -282,9 +283,9 @@
         return 8;
     }
 
-    public static byte[] readBytes(QpidByteBuffer buffer)
+    public static byte[] readBytes(ByteBuffer buffer)
     {
-        long length = buffer.getUnsignedInt();
+        long length = ByteBufferUtils.getUnsignedInt(buffer);
         if (length == 0)
         {
             return null;
@@ -298,17 +299,17 @@
         }
     }
 
-    public static void writeBytes(QpidByteBuffer buffer, byte[] data)
+    public static void writeBytes(ByteBuffer buffer, byte[] data)
     {
         if (data != null)
         {
             // TODO: check length fits in an unsigned byte
-            buffer.putUnsignedInt((long)data.length);
+            ByteBufferUtils.putUnsignedInt(buffer, data.length);
             buffer.put(data);
         }
         else
         {
-            buffer.putUnsignedInt(0L);
+            ByteBufferUtils.putUnsignedInt(buffer, 0L);
         }
     }
 
@@ -318,9 +319,9 @@
         return encodedByteLength();
     }
 
-    public static long readLongAsShortString(QpidByteBuffer buffer) throws AMQFrameDecodingException
+    public static long readLongAsShortString(ByteBuffer buffer) throws AMQFrameDecodingException
     {
-        short length = buffer.getUnsignedByte();
+        short length = ByteBufferUtils.getUnsignedByte(buffer);
         short pos = 0;
         if (length == 0)
         {
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeBoundBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeBoundBody.java
index 8d5dcfd..880f2ed 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeBoundBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeBoundBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ExchangeBoundBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -84,7 +85,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _exchange );
         writeAMQShortString( buffer, _routingKey );
@@ -111,7 +112,7 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeBoundOkBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeBoundOkBody.java
index 6b3379f..296e7d8 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeBoundOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeBoundOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ExchangeBoundOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -82,7 +84,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _replyCode );
         writeAMQShortString( buffer, _replyText );
@@ -105,11 +107,10 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
-
-        int replyCode = buffer.getUnsignedShort();
+        int replyCode = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString replyText = AMQShortString.readAMQShortString(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareBody.java
index 5bded0a..48f583a 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ExchangeDeclareBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -144,7 +146,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _exchange );
@@ -191,11 +193,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher) throws AMQFrameDecodingException
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString type = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareOkBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareOkBody.java
index 288c559..9f377d0 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeDeclareOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ExchangeDeclareOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteBody.java
index 4f69bcf..05dd6c5 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class ExchangeDeleteBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -97,7 +99,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _exchange );
@@ -127,11 +129,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
         boolean ifUnused = (bitfield & 0x01) == 0x01;
diff --git a/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteOkBody.java b/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteOkBody.java
index 7fca59e..d6bad7a 100644
--- a/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/ExchangeDeleteOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class ExchangeDeleteOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/FieldArray.java b/client/src/main/java/org/apache/qpid/framing/FieldArray.java
index 7b7c2ec..33a32f9 100644
--- a/client/src/main/java/org/apache/qpid/framing/FieldArray.java
+++ b/client/src/main/java/org/apache/qpid/framing/FieldArray.java
@@ -21,6 +21,7 @@
 package org.apache.qpid.framing;
 
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.util.AbstractCollection;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -31,7 +32,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class FieldArray<T> extends AbstractCollection<T>
 {
@@ -104,7 +105,7 @@
         }
     }
 
-    public void writeToBuffer(final QpidByteBuffer buffer)
+    public void writeToBuffer(final ByteBuffer buffer)
     {
         buffer.putInt(getEncodingSize());
         for( T obj : this)
@@ -113,17 +114,16 @@
         }
     }
 
-    public static FieldArray<?> readFromBuffer(final QpidByteBuffer buffer)
+    public static FieldArray<?> readFromBuffer(final ByteBuffer buffer)
     {
         ArrayList<Object> result = new ArrayList<>();
         int size = buffer.getInt();
-        QpidByteBuffer slicedBuffer = buffer.view(0,size);
+        ByteBuffer slicedBuffer = ByteBufferUtils.view(buffer, 0, size);
         buffer.position(buffer.position()+size);
         while(slicedBuffer.hasRemaining())
         {
             result.add(AMQTypedValue.readFromBuffer(slicedBuffer).getValue());
         }
-        slicedBuffer.dispose();
         return new FieldArray<>(result);
     }
 }
diff --git a/client/src/main/java/org/apache/qpid/framing/FieldTable.java b/client/src/main/java/org/apache/qpid/framing/FieldTable.java
index ad3c6c6..d6d90e3 100644
--- a/client/src/main/java/org/apache/qpid/framing/FieldTable.java
+++ b/client/src/main/java/org/apache/qpid/framing/FieldTable.java
@@ -21,6 +21,7 @@
 package org.apache.qpid.framing;
 
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -36,7 +37,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.AMQPInvalidClassException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class FieldTable
 {
@@ -44,7 +45,7 @@
     private static final String STRICT_AMQP_NAME = "STRICT_AMQP";
     private static final boolean STRICT_AMQP = Boolean.valueOf(System.getProperty(STRICT_AMQP_NAME, "false"));
 
-    private QpidByteBuffer _encodedForm;
+    private ByteBuffer _encodedForm;
     private Map<AMQShortString, AMQTypedValue> _properties = null;
     private long _encodedSize;
     private static final int INITIAL_HASHMAP_CAPACITY = 16;
@@ -73,15 +74,15 @@
         }
     }
 
-    public FieldTable(QpidByteBuffer input, int len)
+    public FieldTable(ByteBuffer input, int len)
     {
         this();
-        _encodedForm = input.view(0,len);
+        _encodedForm = ByteBufferUtils.view(input, 0, len);
         input.position(input.position()+len);
         _encodedSize = len;
     }
 
-    public FieldTable(QpidByteBuffer buffer)
+    public FieldTable(ByteBuffer buffer)
     {
         this();
         _encodedForm = buffer.duplicate();
@@ -813,7 +814,7 @@
 
     // *************************  Byte Buffer Processing
 
-    public void writeToBuffer(QpidByteBuffer buffer)
+    public void writeToBuffer(ByteBuffer buffer)
     {
         final boolean trace = _logger.isDebugEnabled();
 
@@ -826,7 +827,7 @@
             }
         }
 
-        buffer.putUnsignedInt(getEncodedSize());
+        ByteBufferUtils.putUnsignedInt(buffer, getEncodedSize());
 
         putDataInBuffer(buffer);
     }
@@ -837,14 +838,14 @@
         if(_encodedForm == null)
         {
             byte[] data = new byte[(int) getEncodedSize()];
-            QpidByteBuffer buf = QpidByteBuffer.wrap(data);
+            ByteBuffer buf = ByteBuffer.wrap(data);
             putDataInBuffer(buf);
             return data;
         }
         else
         {
             byte[] encodedCopy = new byte[_encodedForm.remaining()];
-            _encodedForm.copyTo(encodedCopy);
+            ByteBufferUtils.copyTo(_encodedForm, encodedCopy);
             return encodedCopy;
         }
 
@@ -933,7 +934,6 @@
 
             if (_encodedForm != null)
             {
-                _encodedForm.dispose();
                 _encodedForm = null;
             }
         }
@@ -953,7 +953,6 @@
 
             if (_encodedForm != null)
             {
-                _encodedForm.dispose();
                 _encodedForm = null;
             }
         }
@@ -1084,7 +1083,6 @@
         initMapIfNecessary();
         if (_encodedForm != null)
         {
-            _encodedForm.dispose();
             _encodedForm = null;
         }
         _properties.clear();
@@ -1100,14 +1098,11 @@
         return _properties.keySet();
     }
 
-    private void putDataInBuffer(QpidByteBuffer buffer)
+    private void putDataInBuffer(ByteBuffer buffer)
     {
         if (_encodedForm != null)
         {
-            byte[] encodedCopy = new byte[_encodedForm.remaining()];
-            _encodedForm.copyTo(encodedCopy);
-
-            buffer.put(encodedCopy);
+            ByteBufferUtils.copyTo(_encodedForm, buffer);
         }
         else if (_properties != null)
         {
@@ -1137,7 +1132,7 @@
     private void setFromBuffer() throws AMQFrameDecodingException
     {
 
-        final QpidByteBuffer slice = _encodedForm.slice();
+        final ByteBuffer slice = _encodedForm.slice();
 
         if (_encodedSize > 0)
         {
@@ -1156,7 +1151,6 @@
             while (slice.hasRemaining());
 
         }
-        slice.dispose();
     }
 
     public int hashCode()
diff --git a/client/src/main/java/org/apache/qpid/framing/FrameCreatingMethodProcessor.java b/client/src/main/java/org/apache/qpid/framing/FrameCreatingMethodProcessor.java
index 9875cc9..c40529c 100644
--- a/client/src/main/java/org/apache/qpid/framing/FrameCreatingMethodProcessor.java
+++ b/client/src/main/java/org/apache/qpid/framing/FrameCreatingMethodProcessor.java
@@ -20,11 +20,10 @@
  */
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-
 public class FrameCreatingMethodProcessor implements MethodProcessor<FrameCreatingMethodProcessor.ClientAndServerChannelMethodProcessor>,
                                                      ClientMethodProcessor<FrameCreatingMethodProcessor.ClientAndServerChannelMethodProcessor>,
                                                      ServerMethodProcessor<FrameCreatingMethodProcessor.ClientAndServerChannelMethodProcessor>
@@ -605,7 +604,7 @@
         }
 
         @Override
-        public void receiveMessageContent(QpidByteBuffer data)
+        public void receiveMessageContent(ByteBuffer data)
         {
             _processedMethods.add(new AMQFrame(_channelId, new ContentBody(data)));
         }
diff --git a/client/src/main/java/org/apache/qpid/framing/HeartbeatBody.java b/client/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
index cb985f5..a7461ee 100644
--- a/client/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
@@ -22,9 +22,9 @@
 
 import java.io.DataInputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.protocol.AMQVersionAwareProtocolSession;
 import org.apache.qpid.transport.ByteBufferSender;
 
@@ -84,7 +84,7 @@
     }
 
     public static void process(final int channel,
-                            final QpidByteBuffer in,
+                            final ByteBuffer in,
                             final MethodProcessor processor,
                             final long bodySize)
     {
diff --git a/client/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java b/client/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java
index 757ae51..818ef41 100644
--- a/client/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java
+++ b/client/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java
@@ -21,11 +21,11 @@
 package org.apache.qpid.framing;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.ByteBufferSender;
 
 public class ProtocolInitiation extends AMQDataBlock implements EncodableAMQDataBlock
@@ -61,7 +61,7 @@
              pv.equals(ProtocolVersion.v0_91) ? 1 : pv.getMinorVersion());
     }
 
-    public ProtocolInitiation(QpidByteBuffer in)
+    public ProtocolInitiation(ByteBuffer in)
     {
         _protocolHeader = new byte[4];
         in.get(_protocolHeader);
@@ -90,7 +90,7 @@
         data[5] = _protocolInstance;
         data[6] = _protocolMajor;
         data[7] = _protocolMinor;
-        sender.send(QpidByteBuffer.wrap(data));
+        sender.send(ByteBuffer.wrap(data));
         return 8l;
     }
 
@@ -149,7 +149,7 @@
          * @param in input buffer
          * @return number of extra octets of data required data to decode the PI frame fully
          */
-        public int decodable(QpidByteBuffer in)
+        public int decodable(ByteBuffer in)
         {
             return (in.remaining() >= 8) ? 0 : 8 - in.remaining();
         }
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueBindBody.java b/client/src/main/java/org/apache/qpid/framing/QueueBindBody.java
index e7feebd..e776d96 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueBindBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueBindBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueBindBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -112,7 +114,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -151,11 +153,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher) throws AMQFrameDecodingException
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString bindingKey = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueBindOkBody.java b/client/src/main/java/org/apache/qpid/framing/QueueBindOkBody.java
index 13dd32f..f3e5045 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueBindOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueBindOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class QueueBindOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueDeclareBody.java b/client/src/main/java/org/apache/qpid/framing/QueueDeclareBody.java
index dbedd5f..76d2377 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueDeclareBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueDeclareBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueDeclareBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -136,7 +138,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -179,11 +181,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher) throws AMQFrameDecodingException
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
 
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueDeclareOkBody.java b/client/src/main/java/org/apache/qpid/framing/QueueDeclareOkBody.java
index bbdd41e..b79921b 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueDeclareOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueDeclareOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueDeclareOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -82,7 +84,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeAMQShortString( buffer, _queue );
         writeUnsignedInteger( buffer, _messageCount );
@@ -109,12 +111,12 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
-        long messageCount = buffer.getUnsignedInt();
-        long consumerCount = buffer.getUnsignedInt();
+        long messageCount = ByteBufferUtils.getUnsignedInt(buffer);
+        long consumerCount = ByteBufferUtils.getUnsignedInt(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveQueueDeclareOk(queue, messageCount, consumerCount);
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueDeleteBody.java b/client/src/main/java/org/apache/qpid/framing/QueueDeleteBody.java
index 007f309..ed085eb 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueDeleteBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueDeleteBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueDeleteBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -107,7 +109,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -140,11 +142,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         byte bitfield = buffer.get();
 
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueDeleteOkBody.java b/client/src/main/java/org/apache/qpid/framing/QueueDeleteOkBody.java
index 3fe0f40..8b9b303 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueDeleteOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueDeleteOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueDeleteOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -67,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedInteger( buffer, _messageCount );
     }
@@ -86,10 +88,10 @@
         return buf.toString();
     }
 
-    public static void process(QpidByteBuffer buffer,
+    public static void process(ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
-        long messageCount = buffer.getUnsignedInt();
+        long messageCount = ByteBufferUtils.getUnsignedInt(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveQueueDeleteOk(messageCount);
diff --git a/client/src/main/java/org/apache/qpid/framing/QueuePurgeBody.java b/client/src/main/java/org/apache/qpid/framing/QueuePurgeBody.java
index dac9822..d0b91a4 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueuePurgeBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueuePurgeBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueuePurgeBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -87,7 +89,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -114,11 +116,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher)
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         boolean nowait = (buffer.get() & 0x01) == 0x01;
         if(!dispatcher.ignoreAllButCloseOk())
diff --git a/client/src/main/java/org/apache/qpid/framing/QueuePurgeOkBody.java b/client/src/main/java/org/apache/qpid/framing/QueuePurgeOkBody.java
index b26a6d8..451f030 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueuePurgeOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueuePurgeOkBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueuePurgeOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -67,7 +69,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedInteger( buffer, _messageCount );
     }
@@ -86,10 +88,10 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ClientChannelMethodProcessor dispatcher)
     {
-        long messageCount = buffer.getUnsignedInt();
+        long messageCount = ByteBufferUtils.getUnsignedInt(buffer);
         if(!dispatcher.ignoreAllButCloseOk())
         {
             dispatcher.receiveQueuePurgeOk(messageCount);
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueUnbindBody.java b/client/src/main/java/org/apache/qpid/framing/QueueUnbindBody.java
index 1c2fbb7..12bafd1 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueUnbindBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueUnbindBody.java
@@ -27,8 +27,10 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class QueueUnbindBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -99,7 +101,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
         writeUnsignedShort( buffer, _ticket );
         writeAMQShortString( buffer, _queue );
@@ -134,11 +136,11 @@
         return buf.toString();
     }
 
-    public static void process(final QpidByteBuffer buffer,
+    public static void process(final ByteBuffer buffer,
                                final ServerChannelMethodProcessor dispatcher) throws AMQFrameDecodingException
     {
 
-        int ticket = buffer.getUnsignedShort();
+        int ticket = ByteBufferUtils.getUnsignedShort(buffer);
         AMQShortString queue = AMQShortString.readAMQShortString(buffer);
         AMQShortString exchange = AMQShortString.readAMQShortString(buffer);
         AMQShortString routingKey = AMQShortString.readAMQShortString(buffer);
diff --git a/client/src/main/java/org/apache/qpid/framing/QueueUnbindOkBody.java b/client/src/main/java/org/apache/qpid/framing/QueueUnbindOkBody.java
index 5e0e68e..4a9dd33 100644
--- a/client/src/main/java/org/apache/qpid/framing/QueueUnbindOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/QueueUnbindOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class QueueUnbindOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return size;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxCommitBody.java b/client/src/main/java/org/apache/qpid/framing/TxCommitBody.java
index 6594a3e..8f8a864 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxCommitBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxCommitBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxCommitBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -61,7 +62,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxCommitOkBody.java b/client/src/main/java/org/apache/qpid/framing/TxCommitOkBody.java
index ebdfa99..c5f9731 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxCommitOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxCommitOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxCommitOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -59,7 +60,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxRollbackBody.java b/client/src/main/java/org/apache/qpid/framing/TxRollbackBody.java
index 2576a38..881191c 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxRollbackBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxRollbackBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxRollbackBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -59,7 +60,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxRollbackOkBody.java b/client/src/main/java/org/apache/qpid/framing/TxRollbackOkBody.java
index 38189fd..816269d 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxRollbackOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxRollbackOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxRollbackOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -60,7 +61,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxSelectBody.java b/client/src/main/java/org/apache/qpid/framing/TxSelectBody.java
index 184a692..d5752f9 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxSelectBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxSelectBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxSelectBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -62,7 +63,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/framing/TxSelectOkBody.java b/client/src/main/java/org/apache/qpid/framing/TxSelectOkBody.java
index d8e8c8c..82d14c2 100644
--- a/client/src/main/java/org/apache/qpid/framing/TxSelectOkBody.java
+++ b/client/src/main/java/org/apache/qpid/framing/TxSelectOkBody.java
@@ -27,8 +27,9 @@
 
 package org.apache.qpid.framing;
 
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.QpidException;
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 
 public class TxSelectOkBody extends AMQMethodBodyImpl implements EncodableAMQDataBlock, AMQMethodBody
 {
@@ -58,7 +59,7 @@
         return 0;
     }
 
-    public void writeMethodPayload(QpidByteBuffer buffer)
+    public void writeMethodPayload(ByteBuffer buffer)
     {
     }
 
diff --git a/client/src/main/java/org/apache/qpid/transport/ByteBufferSender.java b/client/src/main/java/org/apache/qpid/transport/ByteBufferSender.java
index aac4ebd..7dcaf61 100644
--- a/client/src/main/java/org/apache/qpid/transport/ByteBufferSender.java
+++ b/client/src/main/java/org/apache/qpid/transport/ByteBufferSender.java
@@ -20,13 +20,11 @@
  */
 package org.apache.qpid.transport;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
 
 public interface ByteBufferSender
 {
-    boolean isDirectBufferPreferred();
-
-    void send(QpidByteBuffer msg);
+    void send(ByteBuffer msg);
 
     void flush();
 
diff --git a/client/src/main/java/org/apache/qpid/transport/MessageTransfer.java b/client/src/main/java/org/apache/qpid/transport/MessageTransfer.java
index cd0d255..53d9940 100644
--- a/client/src/main/java/org/apache/qpid/transport/MessageTransfer.java
+++ b/client/src/main/java/org/apache/qpid/transport/MessageTransfer.java
@@ -21,19 +21,14 @@
  */
 
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
+import java.nio.ByteBuffer;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.codec.Decoder;
 import org.apache.qpid.transport.codec.Encoder;
-
-import org.apache.qpid.util.Strings;
 import org.apache.qpid.transport.network.Frame;
+import org.apache.qpid.util.Strings;
 
 
 public final class MessageTransfer extends Method {
@@ -71,22 +66,13 @@
     private MessageAcceptMode acceptMode;
     private MessageAcquireMode acquireMode;
     private Header header;
-    private Collection<QpidByteBuffer> _body;
+    private ByteBuffer _body;
 
 
     public MessageTransfer() {}
 
     public MessageTransfer(String destination, MessageAcceptMode acceptMode, MessageAcquireMode acquireMode, Header header, java.nio.ByteBuffer body, Option ... options)
     {
-        this(destination,
-             acceptMode,
-             acquireMode,
-             header,
-             Collections.singletonList(QpidByteBuffer.wrap(body)),
-             options);
-    }
-
-    public MessageTransfer(String destination, MessageAcceptMode acceptMode, MessageAcquireMode acquireMode, Header header, Collection<QpidByteBuffer> body, Option ... _options) {
         if(destination != null) {
             setDestination(destination);
         }
@@ -99,13 +85,13 @@
         setHeader(header);
         setBody(body);
 
-        for (int i=0; i < _options.length; i++) {
-            switch (_options[i]) {
+        for (int i=0; i < options.length; i++) {
+            switch (options[i]) {
             case SYNC: this.setSync(true); break;
             case BATCH: this.setBatch(true); break;
             case UNRELIABLE: this.setUnreliable(true); break;
             case NONE: break;
-            default: throw new IllegalArgumentException("invalid option: " + _options[i]);
+            default: throw new IllegalArgumentException("invalid option: " + options[i]);
             }
         }
 
@@ -209,19 +195,13 @@
     }
 
     @Override
-    public final Collection<QpidByteBuffer> getBody() {
-        if (this._body == null)
-        {
-            return null;
-        }
-        else
-        {
-            return Collections.unmodifiableCollection(_body);
-        }
+    public final ByteBuffer getBody()
+    {
+        return _body;
     }
 
     @Override
-    public final void setBody(Collection<QpidByteBuffer> body)
+    public final void setBody(ByteBuffer body)
     {
         if (body == null)
         {
@@ -230,14 +210,8 @@
         }
         else
         {
-            _body = new ArrayList<>(body.size());
-            int size = 0;
-            for (QpidByteBuffer buf : body)
-            {
-                size += buf.remaining();
-                _body.add(buf.duplicate());
-            }
-            _bodySize = size;
+            _body = body.duplicate();
+            _bodySize = _body.remaining();
         }
     }
 
@@ -247,25 +221,16 @@
         return _bodySize;
     }
 
-    public final MessageTransfer body(List<QpidByteBuffer> body)
+    public final byte[] getBodyBytes()
     {
-        setBody(body);
-        return this;
-    }
-
-    public final byte[] getBodyBytes() {
-        Collection<QpidByteBuffer> body = getBody();
         byte[] bytes = new byte[getBodySize()];
-        for(QpidByteBuffer buf : body)
-        {
-            buf.duplicate().get(bytes);
-        }
+        _body.duplicate().get(bytes);
         return bytes;
     }
 
     public final void setBody(byte[] body)
     {
-        setBody(Collections.singletonList(QpidByteBuffer.wrap(body)));
+        setBody(ByteBuffer.wrap(body));
     }
 
     public final String getBodyString() {
@@ -338,10 +303,7 @@
     {
         if (_body != null)
         {
-            for (QpidByteBuffer buf : _body)
-            {
-                buf.dispose();
-            }
+            _body = null;
         }
     }
 }
diff --git a/client/src/main/java/org/apache/qpid/transport/Method.java b/client/src/main/java/org/apache/qpid/transport/Method.java
index d23ce72..744556a 100644
--- a/client/src/main/java/org/apache/qpid/transport/Method.java
+++ b/client/src/main/java/org/apache/qpid/transport/Method.java
@@ -20,12 +20,11 @@
  */
 package org.apache.qpid.transport;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.transport.network.Frame;
-
 import static org.apache.qpid.transport.util.Functions.str;
 
-import java.util.Collection;
+import java.nio.ByteBuffer;
+
+import org.apache.qpid.transport.network.Frame;
 
 /**
  * Method
@@ -126,12 +125,12 @@
         throw new UnsupportedOperationException();
     }
 
-    public Collection<QpidByteBuffer> getBody()
+    public ByteBuffer getBody()
     {
         return null;
     }
 
-    public void setBody(Collection<QpidByteBuffer> body)
+    public void setBody(ByteBuffer body)
     {
         throw new UnsupportedOperationException();
     }
@@ -217,7 +216,7 @@
                 str.append(st);
             }
         }
-        Collection<QpidByteBuffer> body = getBody();
+        ByteBuffer body = getBody();
         if (body != null)
         {
             str.append("\n  body=");
diff --git a/client/src/main/java/org/apache/qpid/transport/ProtocolHeader.java b/client/src/main/java/org/apache/qpid/transport/ProtocolHeader.java
index f0d4887..a9481ac 100644
--- a/client/src/main/java/org/apache/qpid/transport/ProtocolHeader.java
+++ b/client/src/main/java/org/apache/qpid/transport/ProtocolHeader.java
@@ -20,7 +20,8 @@
  */
 package org.apache.qpid.transport;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.transport.network.Frame;
 import org.apache.qpid.transport.network.NetworkDelegate;
 import org.apache.qpid.transport.network.NetworkEvent;
@@ -92,9 +93,9 @@
         return false;
     }
 
-    public QpidByteBuffer toByteBuffer()
+    public ByteBuffer toByteBuffer()
     {
-        QpidByteBuffer buf = QpidByteBuffer.allocate(8);
+        ByteBuffer buf = ByteBuffer.allocate(8);
         buf.put(AMQP);
         buf.put(protoClass);
         buf.put(instance);
diff --git a/client/src/main/java/org/apache/qpid/transport/network/Assembler.java b/client/src/main/java/org/apache/qpid/transport/network/Assembler.java
index 931b629..0f383b9 100644
--- a/client/src/main/java/org/apache/qpid/transport/network/Assembler.java
+++ b/client/src/main/java/org/apache/qpid/transport/network/Assembler.java
@@ -22,12 +22,10 @@
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.DeliveryProperties;
 import org.apache.qpid.transport.Header;
 import org.apache.qpid.transport.MessageProperties;
@@ -243,7 +241,7 @@
             break;
         case BODY:
             command = getIncompleteCommand(channel);
-            command.setBody(Collections.singletonList(QpidByteBuffer.wrap(segment)));
+            command.setBody(segment);
             setIncompleteCommand(channel, null);
             emit(channel, command);
             break;
diff --git a/client/src/main/java/org/apache/qpid/transport/network/Disassembler.java b/client/src/main/java/org/apache/qpid/transport/network/Disassembler.java
index 47f9d7a..785e252 100644
--- a/client/src/main/java/org/apache/qpid/transport/network/Disassembler.java
+++ b/client/src/main/java/org/apache/qpid/transport/network/Disassembler.java
@@ -28,14 +28,10 @@
 import static org.apache.qpid.transport.network.Frame.LAST_SEG;
 
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.FrameSizeObserver;
 import org.apache.qpid.transport.Header;
@@ -48,6 +44,7 @@
 import org.apache.qpid.transport.SegmentType;
 import org.apache.qpid.transport.Struct;
 import org.apache.qpid.transport.codec.BBEncoder;
+import org.apache.qpid.util.ByteBufferUtils;
 
 /**
  * Disassembler
@@ -172,47 +169,31 @@
         {
             ByteBuffer buf = enc.underlyingBuffer();
             buf.flip();
-            QpidByteBuffer copy = QpidByteBuffer.allocate(_sender.isDirectBufferPreferred(), buf.remaining());
-            copy.putCopyOf(QpidByteBuffer.wrap(buf));
+            ByteBuffer copy = ByteBuffer.allocate(buf.remaining());
+            ByteBufferUtils.copyTo(buf, copy);
             copy.flip();
 
-            final QpidByteBuffer methodBuf = copy.view(0, methodLimit);
-            fragment(flags, type, method, Collections.singletonList(methodBuf));
-            methodBuf.dispose();
+            final ByteBuffer methodBuf = ByteBufferUtils.view(copy,0, methodLimit);
+            fragment(flags, type, method, methodBuf);
             if (payload)
             {
-                Collection<QpidByteBuffer> bodies = method.getBody();
-                QpidByteBuffer headerBuf = copy.view(methodLimit, headerLimit);
-                fragment(bodies == null ? LAST_SEG : 0x0, SegmentType.HEADER, method, Collections.singletonList(headerBuf));
-                headerBuf.dispose();
-                if (bodies != null)
+                ByteBuffer body = method.getBody();
+                ByteBuffer headerBuf = ByteBufferUtils.view(copy, methodLimit, headerLimit);
+                fragment(body == null ? LAST_SEG : 0x0, SegmentType.HEADER, method, headerBuf);
+                if (body != null)
                 {
-                    Collection<QpidByteBuffer> dup = new ArrayList<>(bodies.size());
-                    for(QpidByteBuffer b : bodies)
-                    {
-                        dup.add(b.duplicate());
-                    }
-                    fragment(LAST_SEG, SegmentType.BODY, method, dup);
-                    for(QpidByteBuffer b : dup)
-                    {
-                        b.dispose();
-                    }
+                    fragment(LAST_SEG, SegmentType.BODY, method, body.duplicate());
                 }
             }
-           copy.dispose();
         }
     }
 
-    private void fragment(byte flags, SegmentType type, ProtocolEvent event, Collection<QpidByteBuffer> buffers)
+    private void fragment(byte flags, SegmentType type, ProtocolEvent event, ByteBuffer buffer)
     {
         byte typeb = (byte) type.getValue();
         byte track = event.getEncodedTrack() == Frame.L4 ? (byte) 1 : (byte) 0;
 
-        int remaining = 0;
-        for(QpidByteBuffer b : buffers)
-        {
-            remaining += b.remaining();
-        }
+        int remaining = buffer.remaining();
         boolean first = true;
         while (true)
         {
@@ -230,7 +211,7 @@
                 newflags |= LAST_FRAME;
             }
 
-            frame(newflags, typeb, track, event.getChannel(), size, buffers);
+            frame(newflags, typeb, track, event.getChannel(), size, buffer);
 
             if (remaining == 0)
             {
@@ -239,9 +220,9 @@
         }
     }
 
-    private void frame(byte flags, byte type, byte track, int channel, int size, Collection<QpidByteBuffer> buffers)
+    private void frame(byte flags, byte type, byte track, int channel, int size, ByteBuffer buffer)
     {
-        QpidByteBuffer data = QpidByteBuffer.allocate(_sender.isDirectBufferPreferred(), HEADER_SIZE);
+        ByteBuffer data = ByteBuffer.allocate(HEADER_SIZE);
 
         data.put(0, flags);
         data.put(1, type);
@@ -252,31 +233,12 @@
 
 
         _sender.send(data);
-        data.dispose();
 
         if(size > 0)
         {
-            int residual = size;
-            for(QpidByteBuffer b : buffers)
-            {
-                final int remaining = b.remaining();
-                if(remaining > 0 )
-                {
-                    if(remaining >= residual)
-                    {
-                        final QpidByteBuffer buffer = b.view(0, residual);
-                        _sender.send(buffer);
-                        buffer.dispose();
-                        b.position(b.position() + residual);
-                        break;
-                    }
-                    else
-                    {
-                        _sender.send(b);
-                        residual-=remaining;
-                    }
-                }
-            }
+            final ByteBuffer view = ByteBufferUtils.view(buffer, 0, size);
+            _sender.send(view);
+            buffer.position(buffer.position() + size);
         }
     }
 
diff --git a/client/src/main/java/org/apache/qpid/transport/network/io/IoSender.java b/client/src/main/java/org/apache/qpid/transport/network/io/IoSender.java
index 3ab0601..b17e3de 100644
--- a/client/src/main/java/org/apache/qpid/transport/network/io/IoSender.java
+++ b/client/src/main/java/org/apache/qpid/transport/network/io/IoSender.java
@@ -23,6 +23,7 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.Socket;
+import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.net.ssl.SSLSocket;
@@ -30,7 +31,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.thread.Threading;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.SenderClosedException;
@@ -117,13 +117,7 @@
         return result;
     }
 
-    @Override
-    public boolean isDirectBufferPreferred()
-    {
-        return false;
-    }
-
-    public void send(QpidByteBuffer buf)
+    public void send(ByteBuffer buf)
     {
         checkNotAlreadyClosed();
 
diff --git a/client/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLSender.java b/client/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLSender.java
index 16d5a00..b7802f7 100644
--- a/client/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLSender.java
+++ b/client/src/main/java/org/apache/qpid/transport/network/security/sasl/SASLSender.java
@@ -21,6 +21,7 @@
 package org.apache.qpid.transport.network.security.sasl;
 
 
+import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.security.sasl.SaslException;
@@ -28,7 +29,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.SenderException;
 
@@ -71,13 +71,7 @@
        delegate.flush();
     }
 
-    @Override
-    public boolean isDirectBufferPreferred()
-    {
-        return false;
-    }
-
-    public void send(QpidByteBuffer buf)
+    public void send(ByteBuffer buf)
     {
         if (closed.get())
         {
@@ -98,7 +92,7 @@
                     byte[] out = getSaslClient().wrap(appData, 0, length);
                     LOGGER.debug("out.length {}", out.length);
 
-                    delegate.send(QpidByteBuffer.wrap(out));
+                    delegate.send(ByteBuffer.wrap(out));
                 }
                 catch (SaslException e)
                 {
@@ -111,7 +105,6 @@
         {
             delegate.send(buf);
         }
-        buf.dispose();
     }
 
 
diff --git a/client/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java b/client/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java
index 236b68d..a8c8eb5 100644
--- a/client/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java
+++ b/client/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java
@@ -19,6 +19,7 @@
  */
 package org.apache.qpid.transport.network.security.ssl;
 
+import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -32,10 +33,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.SenderException;
 import org.apache.qpid.transport.network.security.SSLStatus;
+import org.apache.qpid.util.ByteBufferUtils;
 
 public class SSLSender implements ByteBufferSender
 {
@@ -44,14 +45,14 @@
     private final ByteBufferSender delegate;
     private final SSLEngine engine;
     private final int sslBufSize;
-    private final QpidByteBuffer netData;
+    private final ByteBuffer netData;
     private final long timeout;
     private final SSLStatus _sslStatus;
 
     private String _hostname;
 
     private final AtomicBoolean closed = new AtomicBoolean(false);
-    private final ConcurrentLinkedQueue<QpidByteBuffer> _pending = new ConcurrentLinkedQueue<>();
+    private final ConcurrentLinkedQueue<ByteBuffer> _pending = new ConcurrentLinkedQueue<>();
 
 
     public SSLSender(SSLEngine engine, ByteBufferSender delegate, SSLStatus sslStatus)
@@ -59,7 +60,7 @@
         this.engine = engine;
         this.delegate = delegate;
         sslBufSize = engine.getSession().getPacketBufferSize();
-        netData = QpidByteBuffer.allocate(sslBufSize);
+        netData = ByteBuffer.allocate(sslBufSize);
         timeout = Long.getLong("qpid.ssl_timeout", 60000);
         _sslStatus = sslStatus;
     }
@@ -111,9 +112,9 @@
 
     private void tearDownSSLConnection() throws Exception
     {
-        SSLEngineResult result = QpidByteBuffer.encryptSSL(engine,
-                                                           Collections.singletonList(QpidByteBuffer.allocate(0)),
-                                                           netData);
+        SSLEngineResult result = ByteBufferUtils.encryptSSL(engine,
+                                                            Collections.singletonList(ByteBuffer.allocate(0)),
+                                                            netData);
         Status status = result.getStatus();
         int read   = result.bytesProduced();
         while (status != Status.CLOSED)
@@ -128,7 +129,7 @@
                 netData.limit(netData.position());
                 netData.position(netData.position() - read);
 
-                QpidByteBuffer data = netData.slice();
+                ByteBuffer data = netData.slice();
 
                 netData.limit(limit);
                 netData.position(netData.position() + read);
@@ -136,9 +137,9 @@
                 delegate.send(data);
                 flush();
             }
-            result = QpidByteBuffer.encryptSSL(engine,
-                                               Collections.singletonList(QpidByteBuffer.allocate(0)),
-                                               netData);
+            result = ByteBufferUtils.encryptSSL(engine,
+                                                Collections.singletonList(ByteBuffer.allocate(0)),
+                                                netData);
             status = result.getStatus();
             read   = result.bytesProduced();
         }
@@ -151,13 +152,7 @@
 
     }
 
-    @Override
-    public boolean isDirectBufferPreferred()
-    {
-        return false;
-    }
-
-    public void send(QpidByteBuffer appData)
+    public void send(ByteBuffer appData)
     {
         _pending.add(appData.duplicate());
 
@@ -178,16 +173,15 @@
             int read = 0;
             try
             {
-                SSLEngineResult result = QpidByteBuffer.encryptSSL(engine, _pending, netData);
+                SSLEngineResult result = ByteBufferUtils.encryptSSL(engine, _pending, netData);
 
                 while(!_pending.isEmpty())
                 {
-                    QpidByteBuffer buf = _pending.peek();
+                    ByteBuffer buf = _pending.peek();
                     if (buf.hasRemaining())
                     {
                         break;
                     }
-                    buf.dispose();
                     _pending.poll();
                 }
 
@@ -207,7 +201,7 @@
                 netData.limit(netData.position());
                 netData.position(netData.position() - read);
 
-                QpidByteBuffer data = netData.slice();
+                ByteBuffer data = netData.slice();
 
                 netData.limit(limit);
                 netData.position(netData.position() + read);
diff --git a/client/src/main/java/org/apache/qpid/transport/util/Functions.java b/client/src/main/java/org/apache/qpid/transport/util/Functions.java
index 68523f7..3c60f1b 100644
--- a/client/src/main/java/org/apache/qpid/transport/util/Functions.java
+++ b/client/src/main/java/org/apache/qpid/transport/util/Functions.java
@@ -23,10 +23,6 @@
 import static java.lang.Math.min;
 
 import java.nio.ByteBuffer;
-import java.util.Collection;
-
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.util.ByteBufferUtils;
 
 
 /**
@@ -72,32 +68,6 @@
 
     public static final String str(ByteBuffer buf, int limit,int start)
     {
-        return str(QpidByteBuffer.wrap(buf), limit, start);
-    }
-
-    public static final String str(QpidByteBuffer buf)
-    {
-        return str(buf, buf.remaining());
-    }
-
-    public static final String str(QpidByteBuffer buf, int limit)
-    {
-        return str(buf, limit, buf.position());
-    }
-
-    public static final String str(Collection<QpidByteBuffer> buf, int limit, int start)
-    {
-        return str(ByteBufferUtils.combine(buf),limit,start);
-    }
-
-
-    public static final String str(Collection<QpidByteBuffer> buf, int limit)
-    {
-        return str(buf, limit, 0);
-    }
-
-    public static final String str(QpidByteBuffer buf, int limit, int start)
-    {
         StringBuilder str = new StringBuilder();
         str.append('"');
 
@@ -139,10 +109,6 @@
     {
         return hex(bytes, limit, "");
     }
-    public static String hex(QpidByteBuffer bytes, int limit)
-    {
-        return hex(bytes, limit, "");
-    }
 
     public static String hex(byte[] bytes, int limit, CharSequence separator)
     {
@@ -163,25 +129,4 @@
         }
         return sb.toString();
     }
-
-    public static String hex(QpidByteBuffer bytes, int limit, CharSequence separator)
-    {
-        limit = Math.min(limit, bytes == null ? 0 : bytes.remaining());
-        StringBuilder sb = new StringBuilder(3 + limit*2);
-        for(int i = 0; i < limit; i++)
-        {
-            sb.append(HEX_CHARACTERS[(((int)(bytes.get(bytes.position()+i))) & 0xf0)>>4]);
-            sb.append(HEX_CHARACTERS[(((int)bytes.get(bytes.position()+i)) & 0x0f)]);
-            if(i != bytes.remaining() - 1)
-            {
-                sb.append(separator);
-            }
-        }
-        if(bytes != null && bytes.remaining()>limit)
-        {
-            sb.append("...");
-        }
-        return sb.toString();
-    }
-
 }
diff --git a/client/src/main/java/org/apache/qpid/util/ByteBufferUtils.java b/client/src/main/java/org/apache/qpid/util/ByteBufferUtils.java
index ce1ae1c..0f31c93 100644
--- a/client/src/main/java/org/apache/qpid/util/ByteBufferUtils.java
+++ b/client/src/main/java/org/apache/qpid/util/ByteBufferUtils.java
@@ -23,13 +23,16 @@
 import java.nio.ByteBuffer;
 import java.util.Collection;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
 
 public class ByteBufferUtils
 {
     private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.allocate(0);
+    private static final ByteBuffer[] EMPTY_BYTE_BUFFER_ARRAY = new ByteBuffer[0];
 
-    public static ByteBuffer combine(Collection<QpidByteBuffer> bufs)
+    public static ByteBuffer combine(Collection<ByteBuffer> bufs)
     {
         if(bufs == null || bufs.isEmpty())
         {
@@ -39,33 +42,88 @@
         {
             int size = 0;
             boolean isDirect = false;
-            for(QpidByteBuffer buf : bufs)
+            for(ByteBuffer buf : bufs)
             {
                 size += buf.remaining();
                 isDirect = isDirect || buf.isDirect();
             }
             ByteBuffer combined = isDirect ? ByteBuffer.allocateDirect(size) : ByteBuffer.allocate(size);
 
-            for(QpidByteBuffer buf : bufs)
+            for(ByteBuffer buf : bufs)
             {
-                buf.copyTo(combined);
+                copyTo(buf, combined);
             }
             combined.flip();
             return combined;
         }
     }
 
-    public static int remaining(Collection<QpidByteBuffer> bufs)
-    {
-        int size = 0;
-        if (bufs != null && !bufs.isEmpty())
-        {
-            for (QpidByteBuffer buf : bufs)
-            {
-                size += buf.remaining();
-            }
 
+    public static long getUnsignedInt(ByteBuffer buffer)
+    {
+        return ((long) buffer.getInt()) & 0xffffffffL;
+    }
+
+    public static void putUnsignedInt(ByteBuffer buffer, long value)
+    {
+        buffer.putInt((int) value);
+    }
+
+    public static int getUnsignedShort(ByteBuffer buffer)
+    {
+        return ((int) buffer.getShort()) & 0xffff;
+    }
+
+    public static void putUnsignedShort(ByteBuffer buffer, int value)
+    {
+        buffer.putShort((short) value);
+    }
+
+    public static short getUnsignedByte(ByteBuffer buffer)
+    {
+        return (short) (((short) buffer.get()) & 0xff);
+    }
+
+    public static void putUnsignedByte(ByteBuffer buffer, short value)
+    {
+        buffer.put((byte) value);
+    }
+
+    public static ByteBuffer view(ByteBuffer buffer, int offset, int length)
+    {
+        ByteBuffer view = buffer.slice();
+        view.position(offset);
+        int newLimit = Math.min(view.position() + length, view.capacity());
+        view.limit(newLimit);
+        return view.slice();
+    }
+
+    public static void copyTo(ByteBuffer src, byte[] dst)
+    {
+        ByteBuffer copy = src.duplicate();
+        copy.get(dst);
+    }
+
+    public static void copyTo(ByteBuffer src, ByteBuffer dst)
+    {
+        ByteBuffer copy = src.duplicate();
+        dst.put(copy);
+    }
+
+    public static SSLEngineResult encryptSSL(SSLEngine engine,
+                                             final Collection<ByteBuffer> buffers,
+                                             ByteBuffer dest) throws SSLException
+    {
+        final ByteBuffer[] src;
+        // QPID-7447: prevent unnecessary allocations
+        if (buffers.isEmpty())
+        {
+            src = EMPTY_BYTE_BUFFER_ARRAY;
         }
-        return size;
+        else
+        {
+            src = buffers.toArray(new ByteBuffer[buffers.size()]);
+        }
+        return engine.wrap(src, dest);
     }
 }
diff --git a/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStreamTest.java b/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStreamTest.java
deleted file mode 100644
index c7b421e..0000000
--- a/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferOutputStreamTest.java
+++ /dev/null
@@ -1,114 +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.qpid.bytebuffer;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-import org.junit.Assert;
-
-public class QpidByteBufferOutputStreamTest extends TestCase
-{
-    public void testWriteByteByByte() throws Exception
-    {
-        boolean direct = false;
-        QpidByteBufferOutputStream stream = new QpidByteBufferOutputStream(direct, 3);
-        stream.write('a');
-        stream.write('b');
-
-        Collection<QpidByteBuffer> bufs = stream.fetchAccumulatedBuffers();
-        assertEquals("Unexpected number of buffers", 2, bufs.size());
-        Iterator<QpidByteBuffer> bufItr = bufs.iterator();
-
-        QpidByteBuffer buf1 = bufItr.next();
-        assertBufferContent("1st buffer", buf1, "a".getBytes(), direct);
-
-
-        QpidByteBuffer buf2 = bufItr.next();
-        assertBufferContent("2nd buffer", buf2, "b".getBytes(), direct);
-    }
-
-    public void testWriteByteArrays() throws Exception
-    {
-        boolean direct = false;
-        QpidByteBufferOutputStream stream = new QpidByteBufferOutputStream(direct, 8);
-        stream.write("abcd".getBytes(), 0, 4);
-        stream.write("_ef_".getBytes(), 1, 2);
-
-        Collection<QpidByteBuffer> bufs = stream.fetchAccumulatedBuffers();
-        assertEquals("Unexpected number of buffers", 2, bufs.size());
-        Iterator<QpidByteBuffer> bufItr = bufs.iterator();
-
-        QpidByteBuffer buf1 = bufItr.next();
-        assertBufferContent("1st buffer", buf1, "abcd".getBytes(), direct);
-
-        QpidByteBuffer buf2 = bufItr.next();
-        assertBufferContent("2nd buffer", buf2, "ef".getBytes(), direct);
-    }
-
-    public void testWriteMixed() throws Exception
-    {
-        boolean direct = true;
-        QpidByteBufferOutputStream stream = new QpidByteBufferOutputStream(direct, 3);
-        stream.write('a');
-        stream.write("bcd".getBytes());
-
-        Collection<QpidByteBuffer> bufs = stream.fetchAccumulatedBuffers();
-        assertEquals("Unexpected number of buffers", 2, bufs.size());
-        Iterator<QpidByteBuffer> bufItr = bufs.iterator();
-
-        QpidByteBuffer buf1 = bufItr.next();
-        assertBufferContent("1st buffer", buf1, "a".getBytes(), direct);
-
-        QpidByteBuffer buf2 = bufItr.next();
-        assertBufferContent("2nd buffer", buf2, "bcd".getBytes(), direct);
-    }
-
-
-    public void testWriteByteArrays_ArrayTooLargeForSingleBuffer() throws Exception
-    {
-        boolean direct = false;
-        QpidByteBufferOutputStream stream = new QpidByteBufferOutputStream(direct, 8);
-        stream.write("abcdefghi".getBytes());
-
-        Collection<QpidByteBuffer> bufs = stream.fetchAccumulatedBuffers();
-        assertEquals("Unexpected number of buffers", 2, bufs.size());
-        Iterator<QpidByteBuffer> bufItr = bufs.iterator();
-
-        QpidByteBuffer buf1 = bufItr.next();
-        assertBufferContent("1st buffer", buf1, "abcdefgh".getBytes(), direct);
-
-        QpidByteBuffer buf2 = bufItr.next();
-        assertBufferContent("2nd buffer", buf2, "i".getBytes(), direct);
-    }
-
-    private void assertBufferContent(String bufName, QpidByteBuffer buf, byte[] expectedBytes, final boolean direct)
-    {
-        assertEquals(bufName + " has unexpected number of bytes", expectedBytes.length, buf.remaining());
-        byte[] copy = new byte[buf.remaining()];
-        buf.get(copy);
-        Assert.assertArrayEquals(bufName + " has unexpected content", expectedBytes, copy);
-        assertEquals(bufName + " has unexpected type", direct, buf.isDirect());
-    }
-
-}
\ No newline at end of file
diff --git a/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferTest.java b/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferTest.java
deleted file mode 100644
index 67f5634..0000000
--- a/client/src/test/java/org/apache/qpid/bytebuffer/QpidByteBufferTest.java
+++ /dev/null
@@ -1,917 +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.qpid.bytebuffer;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
-import com.google.common.io.ByteStreams;
-import org.junit.Assert;
-import org.mockito.internal.util.Primitives;
-
-import org.apache.qpid.test.utils.QpidTestCase;
-import org.apache.qpid.util.ByteBufferUtils;
-
-public class QpidByteBufferTest extends QpidTestCase
-{
-    private static final int BUFFER_SIZE = 10;
-    private static final int POOL_SIZE = 20;
-
-
-    private QpidByteBuffer _slicedBuffer;
-    private QpidByteBuffer _parent;
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-        QpidByteBuffer.initialisePool(BUFFER_SIZE, POOL_SIZE);
-        _parent = QpidByteBuffer.allocateDirect(BUFFER_SIZE);
-    }
-
-    @Override
-    public void tearDown() throws Exception
-    {
-        super.tearDown();
-        _parent.dispose();
-        if (_slicedBuffer != null)
-        {
-            _slicedBuffer.dispose();
-        }
-    }
-
-    public void testPutGetByIndex() throws Exception
-    {
-        testPutGetByIndex(double.class, 1.0);
-        testPutGetByIndex(float.class, 1.0f);
-        testPutGetByIndex(long.class, 1L);
-        testPutGetByIndex(int.class, 1);
-        testPutGetByIndex(char.class, 'A');
-        testPutGetByIndex(short.class, (short)1);
-        testPutGetByIndex(byte.class, (byte)1);
-    }
-
-    public void testPutGet() throws Exception
-    {
-        testPutGet(double.class, false, 1.0);
-        testPutGet(float.class, false, 1.0f);
-        testPutGet(long.class, false, 1L);
-        testPutGet(int.class, false, 1);
-        testPutGet(char.class, false, 'A');
-        testPutGet(short.class, false, (short)1);
-        testPutGet(byte.class, false, (byte)1);
-
-        testPutGet(int.class, true, 1L);
-        testPutGet(short.class, true, 1);
-        testPutGet(byte.class, true, (short)1);
-    }
-
-    public void testMarkReset() throws Exception
-    {
-        _slicedBuffer = createSlice();
-
-        _slicedBuffer.mark();
-        _slicedBuffer.position(_slicedBuffer.position() + 1);
-        assertEquals("Unexpected position after move", 1, _slicedBuffer.position());
-
-        _slicedBuffer.reset();
-        assertEquals("Unexpected position after reset", 0, _slicedBuffer.position());
-    }
-
-    public void testPosition() throws Exception
-    {
-        _slicedBuffer = createSlice();
-
-        assertEquals("Unexpected position for new slice", 0, _slicedBuffer.position());
-
-        _slicedBuffer.position(1);
-        assertEquals("Unexpected position after advance", 1, _slicedBuffer.position());
-
-        final int oldLimit = _slicedBuffer.limit();
-        _slicedBuffer.limit(oldLimit - 1);
-        try
-        {
-            _slicedBuffer.position(oldLimit);
-            fail("Exception not thrown");
-        }
-        catch (IllegalArgumentException e)
-        {
-            // pass
-        }
-    }
-
-    public void testBulkPutGet() throws Exception
-    {
-        _slicedBuffer = createSlice();
-
-        final byte[] source = getTestBytes(_slicedBuffer.remaining());
-
-        QpidByteBuffer rv = _slicedBuffer.put(source, 0, source.length);
-        assertEquals("Unexpected builder return value", _slicedBuffer, rv);
-
-        _slicedBuffer.flip();
-        byte[] target = new byte[_slicedBuffer.remaining()];
-        rv = _slicedBuffer.get(target, 0, target.length);
-        assertEquals("Unexpected builder return value", _slicedBuffer, rv);
-
-        Assert.assertArrayEquals("Unexpected bulk put/get result", source, target);
-
-
-        _slicedBuffer.clear();
-        _slicedBuffer.position(1);
-
-        try
-        {
-            _slicedBuffer.put(source, 0, source.length);
-            fail("Exception not thrown");
-        }
-        catch (BufferOverflowException e)
-        {
-            // pass
-        }
-
-        assertEquals("Position should be unchanged after failed put", 1, _slicedBuffer.position());
-
-        try
-        {
-            _slicedBuffer.get(target, 0, target.length);
-            fail("Exception not thrown");
-        }
-        catch (BufferUnderflowException e)
-        {
-            // pass
-        }
-
-        assertEquals("Position should be unchanged after failed get", 1, _slicedBuffer.position());
-
-
-    }
-
-    public void testByteBufferPutGet()
-    {
-        _slicedBuffer = createSlice();
-        final byte[] source = getTestBytes(_slicedBuffer.remaining());
-
-        ByteBuffer sourceByteBuffer = ByteBuffer.wrap(source);
-
-        QpidByteBuffer rv = _slicedBuffer.put(sourceByteBuffer);
-        assertEquals("Unexpected builder return value", _slicedBuffer, rv);
-
-        assertEquals("Unexpected position", _slicedBuffer.capacity(), _slicedBuffer.position());
-        assertEquals("Unexpected remaining", 0, _slicedBuffer.remaining());
-
-        assertEquals("Unexpected remaining in source ByteBuffer", 0, sourceByteBuffer.remaining());
-
-        _slicedBuffer.flip();
-
-        ByteBuffer destinationByteBuffer =  ByteBuffer.allocate(source.length);
-        _slicedBuffer.get(destinationByteBuffer);
-
-
-        assertEquals("Unexpected remaining", 0, _slicedBuffer.remaining());
-
-        assertEquals("Unexpected remaining in destination ByteBuffer", 0, destinationByteBuffer.remaining());
-        assertEquals("Unexpected position in destination ByteBuffer", source.length, destinationByteBuffer.position());
-
-        Assert.assertArrayEquals("Unexpected ByteBuffer put/get result", source, destinationByteBuffer.array());
-
-        _slicedBuffer.clear();
-        _slicedBuffer.position(1);
-
-        sourceByteBuffer.clear();
-        try
-        {
-            _slicedBuffer.put(sourceByteBuffer);
-            fail("Exception should be thrown");
-        }
-        catch(BufferOverflowException e)
-        {
-            // pass
-        }
-
-        assertEquals("Position should not be changed after failed put", 1, _slicedBuffer.position());
-        assertEquals("Source position should not changed after failed put", source.length, sourceByteBuffer.remaining());
-
-        _slicedBuffer.clear();
-        destinationByteBuffer.position(1);
-
-        try
-        {
-            _slicedBuffer.get(destinationByteBuffer);
-            fail("Exception should be thrown");
-        }
-        catch(BufferUnderflowException e )
-        {
-            // pass
-        }
-    }
-
-    public void testQpidByteBufferPutGet()
-    {
-        _slicedBuffer = createSlice();
-        final byte[] source = getTestBytes(_slicedBuffer.remaining());
-
-        QpidByteBuffer sourceQpidByteBuffer = QpidByteBuffer.wrap(source);
-
-        QpidByteBuffer rv = _slicedBuffer.put(sourceQpidByteBuffer);
-        assertEquals("Unexpected builder return value", _slicedBuffer, rv);
-
-        assertEquals("Unexpected position", _slicedBuffer.capacity(), _slicedBuffer.position());
-        assertEquals("Unexpected remaining", 0, _slicedBuffer.remaining());
-
-        assertEquals("Unexpected remaining in source QpidByteBuffer", 0, sourceQpidByteBuffer.remaining());
-
-        _slicedBuffer.flip();
-
-        ByteBuffer destinationByteBuffer =  ByteBuffer.allocate(source.length);
-        _slicedBuffer.get(destinationByteBuffer);
-
-        assertEquals("Unexpected remaining", 0, _slicedBuffer.remaining());
-
-        assertEquals("Unexpected remaining in destination ByteBuffer", 0, destinationByteBuffer.remaining());
-        assertEquals("Unexpected position in destination ByteBuffer", source.length, destinationByteBuffer.position());
-
-        Assert.assertArrayEquals("Unexpected ByteBuffer put/get result", source, destinationByteBuffer.array());
-
-        _slicedBuffer.clear();
-        _slicedBuffer.position(1);
-
-        sourceQpidByteBuffer.clear();
-        try
-        {
-            _slicedBuffer.put(sourceQpidByteBuffer);
-            fail("Exception should be thrown");
-        }
-        catch(BufferOverflowException e)
-        {
-            // pass
-        }
-
-        assertEquals("Position should not be changed after failed put", 1, _slicedBuffer.position());
-        assertEquals("Source position should not changed after failed put", source.length, sourceQpidByteBuffer.remaining());
-    }
-
-    public void testDuplicate()
-    {
-        _slicedBuffer = createSlice();
-        _slicedBuffer.position(1);
-        int originalLimit = _slicedBuffer.limit();
-        _slicedBuffer.limit(originalLimit - 1);
-
-        QpidByteBuffer duplicate = _slicedBuffer.duplicate();
-        try
-        {
-            assertEquals("Unexpected position", _slicedBuffer.position(), duplicate.position() );
-            assertEquals("Unexpected limit", _slicedBuffer.limit(), duplicate.limit() );
-            assertEquals("Unexpected capacity", _slicedBuffer.capacity(), duplicate.capacity() );
-
-            duplicate.position(2);
-            duplicate.limit(originalLimit - 2);
-
-            assertEquals("Unexpected position in the original", 1, _slicedBuffer.position());
-            assertEquals("Unexpected limit in the original", originalLimit -1, _slicedBuffer.limit());
-        }
-        finally
-        {
-            duplicate.dispose();
-        }
-    }
-
-    public void testCopyToByteBuffer()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-        _slicedBuffer.flip();
-
-        int originalRemaining = _slicedBuffer.remaining();
-        ByteBuffer destination =  ByteBuffer.allocate(source.length);
-        _slicedBuffer.copyTo(destination);
-
-        assertEquals("Unexpected remaining in original QBB", originalRemaining, _slicedBuffer.remaining());
-        assertEquals("Unexpected remaining in destination", 0, destination.remaining());
-
-        Assert.assertArrayEquals("Unexpected copyTo result", source, destination.array());
-    }
-
-    public void testCopyToArray()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-        _slicedBuffer.flip();
-
-        int originalRemaining = _slicedBuffer.remaining();
-        byte[] destination = new byte[source.length];
-        _slicedBuffer.copyTo(destination);
-
-        assertEquals("Unexpected remaining in original QBB", originalRemaining, _slicedBuffer.remaining());
-
-        Assert.assertArrayEquals("Unexpected copyTo result", source, destination);
-    }
-
-    public void testPutCopyOf()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-
-        QpidByteBuffer sourceQpidByteBuffer =  QpidByteBuffer.wrap(source);
-        _slicedBuffer.putCopyOf(sourceQpidByteBuffer);
-
-        assertEquals("Copied buffer should not be changed", source.length, sourceQpidByteBuffer.remaining());
-        assertEquals("Buffer should be full", 0, _slicedBuffer.remaining());
-        _slicedBuffer.flip();
-
-        byte[] destination = new byte[source.length];
-        _slicedBuffer.get(destination);
-
-        Assert.assertArrayEquals("Unexpected putCopyOf result", source, destination);
-    }
-
-    public void testCompact()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-
-        _slicedBuffer.position(1);
-        _slicedBuffer.limit(_slicedBuffer.limit() - 1);
-
-        int remaining =  _slicedBuffer.remaining();
-        _slicedBuffer.compact();
-
-        assertEquals("Unexpected position", remaining, _slicedBuffer.position());
-        assertEquals("Unexpected limit", _slicedBuffer.capacity(), _slicedBuffer.limit());
-
-        _slicedBuffer.flip();
-
-
-        byte[] destination =  new byte[_slicedBuffer.remaining()];
-        _slicedBuffer.get(destination);
-
-        byte[] expected =  new byte[source.length - 2];
-        System.arraycopy(source, 1, expected, 0, expected.length);
-
-        Assert.assertArrayEquals("Unexpected compact result", expected, destination);
-    }
-
-    public void testSliceOfSlice()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-
-        _slicedBuffer.position(1);
-        _slicedBuffer.limit(_slicedBuffer.limit() - 1);
-
-        int remaining = _slicedBuffer.remaining();
-        QpidByteBuffer newSlice = _slicedBuffer.slice();
-        try
-        {
-            assertEquals("Unexpected position in original", 1, _slicedBuffer.position());
-            assertEquals("Unexpected limit in original", source.length - 1, _slicedBuffer.limit());
-            assertEquals("Unexpected position", 0, newSlice.position());
-            assertEquals("Unexpected limit", remaining, newSlice.limit());
-            assertEquals("Unexpected capacity", remaining, newSlice.capacity());
-
-            byte[] destination =  new byte[newSlice.remaining()];
-            newSlice.get(destination);
-
-            byte[] expected =  new byte[source.length - 2];
-            System.arraycopy(source, 1, expected, 0, expected.length);
-            Assert.assertArrayEquals("Unexpected slice result", expected, destination);
-        }
-        finally
-        {
-            newSlice.dispose();
-        }
-    }
-
-    public void testViewOfSlice()
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-
-        _slicedBuffer.position(1);
-        _slicedBuffer.limit(_slicedBuffer.limit() - 1);
-
-        QpidByteBuffer view = _slicedBuffer.view(0, _slicedBuffer.remaining());
-        try
-        {
-            assertEquals("Unexpected position in original", 1, _slicedBuffer.position());
-            assertEquals("Unexpected limit in original", source.length - 1, _slicedBuffer.limit());
-
-            assertEquals("Unexpected position", 0, view.position());
-            assertEquals("Unexpected limit", _slicedBuffer.remaining(), view.limit());
-            assertEquals("Unexpected capacity", _slicedBuffer.remaining(), view.capacity());
-
-            byte[] destination =  new byte[view.remaining()];
-            view.get(destination);
-
-            byte[] expected =  new byte[source.length - 2];
-            System.arraycopy(source, 1, expected, 0, expected.length);
-            Assert.assertArrayEquals("Unexpected view result", expected, destination);
-        }
-        finally
-        {
-            view.dispose();
-        }
-
-        view = _slicedBuffer.view(1, _slicedBuffer.remaining() - 2);
-        try
-        {
-            assertEquals("Unexpected position in original", 1, _slicedBuffer.position());
-            assertEquals("Unexpected limit in original", source.length - 1, _slicedBuffer.limit());
-
-            assertEquals("Unexpected position", 0, view.position());
-            assertEquals("Unexpected limit", _slicedBuffer.remaining() - 2, view.limit());
-            assertEquals("Unexpected capacity", _slicedBuffer.remaining() - 2, view.capacity());
-
-            byte[] destination =  new byte[view.remaining()];
-            view.get(destination);
-
-            byte[] expected =  new byte[source.length - 4];
-            System.arraycopy(source, 2, expected, 0, expected.length);
-            Assert.assertArrayEquals("Unexpected view result", expected, destination);
-        }
-        finally
-        {
-            view.dispose();
-        }
-    }
-
-    public void testAsInputStream() throws Exception
-    {
-        _slicedBuffer = createSlice();
-        byte[] source = getTestBytes(_slicedBuffer.remaining());
-        _slicedBuffer.put(source);
-
-        _slicedBuffer.position(1);
-        _slicedBuffer.limit(_slicedBuffer.limit() - 1);
-
-        ByteArrayOutputStream destination = new ByteArrayOutputStream();
-        try(InputStream is = _slicedBuffer.asInputStream())
-        {
-            ByteStreams.copy(is, destination);
-        }
-
-        byte[] expected =  new byte[source.length - 2];
-        System.arraycopy(source, 1, expected, 0, expected.length);
-        Assert.assertArrayEquals("Unexpected view result", expected, destination.toByteArray());
-    }
-
-    public void testAsByteBuffer() throws Exception
-    {
-        _slicedBuffer = createSlice();
-
-        _slicedBuffer.position(1);
-        _slicedBuffer.limit(_slicedBuffer.limit() - 1);
-
-        _slicedBuffer.mark();
-        int remaining = _slicedBuffer.remaining();
-        byte[] source = getTestBytes(remaining);
-        _slicedBuffer.put(source);
-        _slicedBuffer.reset();
-
-        ByteBuffer buffer = _slicedBuffer.asByteBuffer();
-        assertEquals("Unexpected remaining", remaining, buffer.remaining());
-
-        byte[] target = new byte[remaining];
-        buffer.get(target);
-        Assert.assertArrayEquals("Unexpected asByteBuffer result", source, target);
-    }
-
-    public void testDecode()
-    {
-        _slicedBuffer = createSlice();
-        final String input = "ABC";
-        _slicedBuffer.put(input.getBytes());
-        _slicedBuffer.flip();
-
-        final CharBuffer charBuffer = _slicedBuffer.decode(StandardCharsets.US_ASCII);
-        final char[] destination = new char[charBuffer.remaining()];
-        charBuffer.get(destination);
-        Assert.assertArrayEquals("Unexpected char buffer", input.toCharArray(), destination);
-    }
-
-    private byte[] getTestBytes(final int length)
-    {
-        final byte[] source = new byte[length];
-        for (int i = 0; i < source.length; i++)
-        {
-            source[i] = (byte) ('A' + i);
-        }
-        return source;
-    }
-
-    private QpidByteBuffer createSlice()
-    {
-        _parent.position(1);
-        _parent.limit(_parent.capacity() - 1);
-
-        return _parent.slice();
-    }
-
-    private void testPutGet(final Class<?> primitiveTargetClass, final boolean unsigned, final Object value) throws Exception
-    {
-        int size = sizeof(primitiveTargetClass);
-
-        _parent.position(1);
-        _parent.limit(size + 1);
-
-        _slicedBuffer = _parent.slice();
-        _parent.limit(_parent.capacity());
-
-        assertEquals("Unexpected position ", 0, _slicedBuffer.position());
-        assertEquals("Unexpected limit ", size, _slicedBuffer.limit());
-        assertEquals("Unexpected capacity ", size, _slicedBuffer.capacity());
-
-        String methodSuffix = getMethodSuffix(primitiveTargetClass, unsigned);
-        Method put = _slicedBuffer.getClass().getMethod("put" + methodSuffix, Primitives.primitiveTypeOf(value.getClass()));
-        Method get = _slicedBuffer.getClass().getMethod("get" + methodSuffix);
-
-
-        _slicedBuffer.mark();
-        QpidByteBuffer rv = (QpidByteBuffer) put.invoke(_slicedBuffer, value);
-        assertEquals("Unexpected builder return value for type " + methodSuffix, _slicedBuffer, rv);
-
-        assertEquals("Unexpected position for type " + methodSuffix, size, _slicedBuffer.position());
-
-        try
-        {
-            invokeMethod(put, value);
-            fail("BufferOverflowException should be thrown for put with insufficient room for " + methodSuffix);
-        }
-        catch (BufferOverflowException e)
-        {
-            // pass
-        }
-
-        _slicedBuffer.reset();
-
-        assertEquals("Unexpected position after reset", 0, _slicedBuffer.position());
-
-        Object retrievedValue = get.invoke(_slicedBuffer);
-        assertEquals("Unexpected value retrieved from get method for " + methodSuffix, value, retrievedValue);
-        try
-        {
-            invokeMethod(get);
-            fail("BufferUnderflowException not thrown for get with insufficient room for " + methodSuffix);
-        }
-        catch (BufferUnderflowException ite)
-        {
-            // pass
-        }
-    }
-
-    private void testPutGetByIndex(final Class<?> primitiveTargetClass, Object value) throws Exception
-    {
-        int size = sizeof(primitiveTargetClass);
-
-        _parent.position(1);
-        _parent.limit(size + 1);
-
-        _slicedBuffer = _parent.slice();
-        _parent.limit(_parent.capacity());
-
-        String methodSuffix = getMethodSuffix(primitiveTargetClass, false);
-        Method put = _slicedBuffer.getClass().getMethod("put" + methodSuffix, int.class, primitiveTargetClass);
-        Method get = _slicedBuffer.getClass().getMethod("get" + methodSuffix, int.class);
-
-        QpidByteBuffer rv = (QpidByteBuffer) put.invoke(_slicedBuffer, 0, value);
-        assertEquals("Unexpected builder return value for type " + methodSuffix, _slicedBuffer, rv);
-
-        Object retrievedValue = get.invoke(_slicedBuffer, 0);
-        assertEquals("Unexpected value retrieved from index get method for " + methodSuffix, value, retrievedValue);
-
-        try
-        {
-            invokeMethod(put, 1, value);
-            fail("IndexOutOfBoundsException not thrown for  indexed " + methodSuffix + " put");
-        }
-        catch (IndexOutOfBoundsException ite)
-        {
-            // pass
-        }
-
-        try
-        {
-            invokeMethod(put, -1, value);
-            fail("IndexOutOfBoundsException not thrown for indexed " + methodSuffix + " put with negative index");
-        }
-        catch (IndexOutOfBoundsException ite)
-        {
-            // pass
-        }
-
-        try
-        {
-            invokeMethod(get, 1);
-            fail("IndexOutOfBoundsException not thrown for indexed " + methodSuffix + " get");
-        }
-        catch (IndexOutOfBoundsException ite)
-        {
-            // pass
-        }
-
-        try
-        {
-            invokeMethod(get, -1);
-            fail("IndexOutOfBoundsException not thrown for indexed " + methodSuffix + " get with negative index");
-        }
-        catch (IndexOutOfBoundsException ite)
-        {
-            // pass
-        }
-    }
-
-    private void invokeMethod(final Method method, final Object... value)
-            throws Exception
-    {
-        try
-        {
-            method.invoke(_slicedBuffer, value);
-        }
-        catch (InvocationTargetException e)
-        {
-            Throwable cause = e.getCause();
-            if (cause instanceof Exception)
-            {
-                throw (Exception)cause;
-            }
-            fail(String.format("Unexpected throwable on method %s invocation: %s", method.getName(), cause));
-        }
-    }
-
-
-    private String getMethodSuffix(final Class<?> target, final boolean unsigned)
-    {
-        StringBuilder name = new StringBuilder();
-        if (unsigned)
-        {
-            name.append("Unsigned");
-        }
-        if ((!target.isAssignableFrom(byte.class) || unsigned))
-        {
-            String simpleName = target.getSimpleName();
-            name.append(simpleName.substring(0, 1).toUpperCase()).append(simpleName.substring(1));
-        }
-
-        return name.toString();
-    }
-
-    private int sizeof(final Class<?> type)
-    {
-        if (type.isAssignableFrom(double.class))
-        {
-            return 8;
-        }
-        else if (type.isAssignableFrom(float.class))
-        {
-            return 4;
-        }
-        else if (type.isAssignableFrom(long.class))
-        {
-            return 8;
-        }
-        else if (type.isAssignableFrom(int.class))
-        {
-            return 4;
-        }
-        else if (type.isAssignableFrom(short.class))
-        {
-            return 2;
-        }
-        else if (type.isAssignableFrom(char.class))
-        {
-            return 2;
-        }
-        else if (type.isAssignableFrom(byte.class))
-        {
-            return 1;
-        }
-        else
-        {
-            throw new UnsupportedOperationException("Unexpected type " + type);
-        }
-    }
-
-    public void testPooledBufferIsZeroedLoan() throws Exception
-    {
-        QpidByteBuffer buffer = QpidByteBuffer.allocateDirect(BUFFER_SIZE);
-
-        buffer.put((byte) 0xFF);
-        buffer.dispose();
-
-        buffer = QpidByteBuffer.allocateDirect(BUFFER_SIZE);
-        buffer.limit(1);
-        assertEquals("Pooled QpidByteBuffer is not zeroed.", (byte) 0x0, buffer.get());
-    }
-
-    public void testAllocateDirectOfSameSize() throws Exception
-    {
-        int bufferSize = BUFFER_SIZE;
-        QpidByteBuffer buffer = QpidByteBuffer.allocateDirect(bufferSize);
-        assertEquals("Unexpected buffer size", bufferSize, buffer.capacity());
-        assertEquals("Unexpected position on newly created buffer", 0, buffer.position());
-        assertEquals("Unexpected limit on newly created buffer", bufferSize, buffer.limit());
-    }
-
-    public void testAllocateDirectOfSmallerSize() throws Exception
-    {
-        int bufferSize = BUFFER_SIZE - 1;
-        QpidByteBuffer buffer = QpidByteBuffer.allocateDirect(bufferSize);
-        assertEquals("Unexpected buffer size", bufferSize, buffer.capacity());
-        assertEquals("Unexpected position on newly created buffer", 0, buffer.position());
-        assertEquals("Unexpected limit on newly created buffer", bufferSize, buffer.limit());
-    }
-
-    public void testAllocateDirectOfLargerSize() throws Exception
-    {
-        int bufferSize = BUFFER_SIZE + 1;
-        QpidByteBuffer buffer = QpidByteBuffer.allocateDirect(bufferSize);
-        assertEquals("Unexpected buffer size", bufferSize, buffer.capacity());
-        assertEquals("Unexpected position on newly created buffer", 0, buffer.position());
-        assertEquals("Unexpected limit on newly created buffer", bufferSize, buffer.limit());
-    }
-
-    public void testAllocateDirectWithNegativeSize() throws Exception
-    {
-        try
-        {
-            QpidByteBuffer.allocateDirect(-1);
-            fail("It is not legal to create buffer with negative size.");
-        }
-        catch (IllegalArgumentException e)
-        {
-            // pass
-        }
-    }
-
-    public void testSettingUpPoolTwice() throws Exception
-    {
-        try
-        {
-            QpidByteBuffer.initialisePool(BUFFER_SIZE + 1, POOL_SIZE + 1);
-            fail("It is not legal to initialize buffer twice with different settings.");
-        }
-        catch (IllegalStateException e)
-        {
-            // pass
-        }
-    }
-
-    public void testDeflateInflateDirect() throws Exception
-    {
-        byte[] input = "aaabbbcccddddeeeffff".getBytes();
-        Collection<QpidByteBuffer> inputBufs = QpidByteBuffer.allocateDirectCollection(input.length);
-
-        int offset = 0;
-        for (QpidByteBuffer buf : inputBufs)
-        {
-            int len = buf.remaining();
-            buf.put(input, offset, len);
-            buf.flip();
-            offset += len;
-        }
-        assertEquals(input.length, ByteBufferUtils.remaining(inputBufs));
-
-        doDeflateInflate(input, inputBufs, true);
-    }
-
-    public void testDeflateInflateHeap() throws Exception
-    {
-        byte[] input = "aaabbbcccddddeeeffff".getBytes();
-        Collection<QpidByteBuffer> inputBufs = Collections.singleton(QpidByteBuffer.wrap(input));
-
-        doDeflateInflate(input, inputBufs, false);
-    }
-
-    public void testInflatingUncompressedBytes_ThrowsZipException() throws Exception
-    {
-        byte[] input = "not_a_compressed_stream".getBytes();
-        QpidByteBuffer original = QpidByteBuffer.wrap(input);
-
-        try
-        {
-            QpidByteBuffer.inflate(Collections.singleton(original));
-            fail("Exception not thrown");
-        }
-        catch(java.util.zip.ZipException ze)
-        {
-            // PASS
-        }
-    }
-
-    public void testSlice() throws Exception
-    {
-        QpidByteBuffer directBuffer = QpidByteBuffer.allocate(true, 6);
-        directBuffer.position(2);
-        directBuffer.limit(5);
-        QpidByteBuffer directSlice = directBuffer.slice();
-
-        assertTrue("Direct slice should be direct too", directSlice.isDirect());
-        assertEquals("Unexpected capacity", 3, directSlice.capacity());
-        assertEquals("Unexpected limit", 3, directSlice.limit());
-        assertEquals("Unexpected position", 0, directSlice.position());
-
-        directBuffer.dispose();
-        directSlice.dispose();
-    }
-
-    public void testView() throws Exception
-    {
-        byte[] content = "ABCDEF".getBytes();
-        QpidByteBuffer buffer = QpidByteBuffer.allocate(true, content.length);
-        buffer.put(content);
-        buffer.position(2);
-        buffer.limit(5);
-
-        QpidByteBuffer view = buffer.view(0, buffer.remaining());
-
-        assertTrue("Unexpected view direct", view.isDirect());
-
-        assertEquals("Unexpected capacity", 3, view.capacity());
-        assertEquals("Unexpected limit", 3, view.limit());
-        assertEquals("Unexpected position", 0, view.position());
-
-        byte[] destination = new byte[view.remaining()];
-        view.get(destination);
-
-        Assert.assertArrayEquals("CDE".getBytes(), destination);
-
-        QpidByteBuffer viewWithOffset = buffer.view(1, 1);
-        destination = new byte[viewWithOffset.remaining()];
-        viewWithOffset.get(destination);
-
-        Assert.assertArrayEquals("D".getBytes(), destination);
-
-        buffer.dispose();
-        view.dispose();
-        viewWithOffset.dispose();
-    }
-
-    private void doDeflateInflate(byte[] input,
-                                  Collection<QpidByteBuffer> inputBufs,
-                                  boolean direct) throws IOException
-    {
-        Collection<QpidByteBuffer> deflatedBufs = QpidByteBuffer.deflate(inputBufs);
-        assertNotNull(deflatedBufs);
-
-        Collection<QpidByteBuffer> inflatedBufs = QpidByteBuffer.inflate(deflatedBufs);
-        assertNotNull(inflatedBufs);
-        assertTrue("Expected at least on buffer", inflatedBufs.size() >= 1);
-
-        int bufNum = 1;
-        int inputOffset = 0;
-        int inflatedBytesTotal = 0;
-        for(QpidByteBuffer inflatedBuf : inflatedBufs)
-        {
-            assertEquals("Inflated buf " + bufNum + " is of wrong type", direct, inflatedBuf.isDirect());
-
-            int inflatedBytesCount = inflatedBuf.remaining();
-            inflatedBytesTotal += inflatedBytesCount;
-
-            byte[] inflatedBytes = new byte[inflatedBytesCount];
-            inflatedBuf.get(inflatedBytes);
-            byte[] expectedBytes = Arrays.copyOfRange(input, inputOffset, inputOffset + inflatedBytes.length);
-            Assert.assertArrayEquals("Inflated buf" + bufNum + " has unexpected content", expectedBytes, inflatedBytes);
-
-            inputOffset += inflatedBytes.length;
-            bufNum++;
-        }
-
-        assertEquals("Unexpected number of inflated bytes", input.length, inflatedBytesTotal);
-    }
-
-}
diff --git a/client/src/test/java/org/apache/qpid/client/message/Encrypted091MessageFactoryTest.java b/client/src/test/java/org/apache/qpid/client/message/Encrypted091MessageFactoryTest.java
index 2062900..bbdc3d1 100644
--- a/client/src/test/java/org/apache/qpid/client/message/Encrypted091MessageFactoryTest.java
+++ b/client/src/test/java/org/apache/qpid/client/message/Encrypted091MessageFactoryTest.java
@@ -38,7 +38,6 @@
 import javax.crypto.spec.SecretKeySpec;
 import javax.security.auth.x500.X500Principal;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.client.AMQConnection;
 import org.apache.qpid.client.AMQSession;
 import org.apache.qpid.framing.BasicContentHeaderProperties;
@@ -78,7 +77,7 @@
 
             final int headerLength = _props.getPropertyListSize() + 2;
             _unencrypted = new byte[headerLength + _data.length];
-            QpidByteBuffer output = QpidByteBuffer.wrap(_unencrypted);
+            ByteBuffer output = ByteBuffer.wrap(_unencrypted);
             output.putShort((short) (_props.getPropertyFlags() & 0xffff));
             _props.writePropertyListPayload(output);
 
diff --git a/client/src/test/java/org/apache/qpid/codec/AMQDecoderTest.java b/client/src/test/java/org/apache/qpid/codec/AMQDecoderTest.java
index 49505b4..282d3fb 100644
--- a/client/src/test/java/org/apache/qpid/codec/AMQDecoderTest.java
+++ b/client/src/test/java/org/apache/qpid/codec/AMQDecoderTest.java
@@ -29,7 +29,6 @@
 import java.util.List;
 import java.util.Random;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.framing.AMQBody;
 import org.apache.qpid.framing.AMQDataBlock;
 import org.apache.qpid.framing.AMQFrame;
@@ -138,7 +137,7 @@
         {
             assertEquals(ContentBody.TYPE, ((AMQFrame) frames.get(0)).getBodyFrame().getFrameType());
             ContentBody decodedBody = (ContentBody) ((AMQFrame) frames.get(0)).getBodyFrame();
-            final ByteBuffer byteBuffer = decodedBody.getPayload().asByteBuffer().duplicate();
+            final ByteBuffer byteBuffer = decodedBody.getPayload().duplicate();
             byte[] bodyBytes = new byte[byteBuffer.remaining()];
             byteBuffer.get(bodyBytes);
             assertTrue("Body was corrupted", Arrays.equals(payload, bodyBytes));
@@ -246,16 +245,10 @@
 
     private static class TestSender implements ByteBufferSender
     {
-        private final Collection<QpidByteBuffer> _sentBuffers = new ArrayList<>();
+        private final Collection<ByteBuffer> _sentBuffers = new ArrayList<>();
 
         @Override
-        public boolean isDirectBufferPreferred()
-        {
-            return false;
-        }
-
-        @Override
-        public void send(final QpidByteBuffer msg)
+        public void send(final ByteBuffer msg)
         {
             _sentBuffers.add(msg.duplicate());
             msg.position(msg.limit());
@@ -273,7 +266,7 @@
 
         }
 
-        public Collection<QpidByteBuffer> getSentBuffers()
+        public Collection<ByteBuffer> getSentBuffers()
         {
             return _sentBuffers;
         }
diff --git a/client/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java b/client/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
index c6c870a..2a46dcf 100644
--- a/client/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
+++ b/client/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
@@ -20,7 +20,8 @@
  */
 package org.apache.qpid.framing;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.test.utils.QpidTestCase;
 
 
@@ -78,7 +79,7 @@
 
     public void testPopulatePropertiesFromBuffer() throws Exception
     {
-        QpidByteBuffer buf = QpidByteBuffer.wrap(new byte[300]);
+        ByteBuffer buf = ByteBuffer.wrap(new byte[300]);
         _testProperties.populatePropertiesFromBuffer(buf, 99, 99);
     }
 
diff --git a/client/src/test/java/org/apache/qpid/framing/EncodingUtilsTest.java b/client/src/test/java/org/apache/qpid/framing/EncodingUtilsTest.java
index dd81e25..e55f000 100644
--- a/client/src/test/java/org/apache/qpid/framing/EncodingUtilsTest.java
+++ b/client/src/test/java/org/apache/qpid/framing/EncodingUtilsTest.java
@@ -20,41 +20,27 @@
 
 package org.apache.qpid.framing;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import java.nio.ByteBuffer;
+
 import org.apache.qpid.test.utils.QpidTestCase;
 
 
 public class EncodingUtilsTest extends QpidTestCase
 {
     private static final int BUFFER_SIZE = 10;
-    private static final int POOL_SIZE = 20;
 
-    private QpidByteBuffer _buffer;
+    private ByteBuffer _buffer;
 
     @Override
     protected void setUp() throws Exception
     {
         super.setUp();
-        QpidByteBuffer.initialisePool(BUFFER_SIZE, POOL_SIZE);
-        _buffer = QpidByteBuffer.allocateDirect(BUFFER_SIZE);
-    }
-
-    @Override
-    public void tearDown() throws Exception
-    {
-        try
-        {
-            _buffer.dispose();
-        }
-        finally
-        {
-            super.tearDown();
-        }
+        _buffer = ByteBuffer.allocate(BUFFER_SIZE);
     }
 
     public void testReadLongAsShortStringWhenDigitsAreSpecified() throws Exception
     {
-        _buffer.putUnsignedByte((short)3);
+        _buffer.put((byte)3);
         _buffer.put((byte)'9');
         _buffer.put((byte)'2');
         _buffer.put((byte)'0');
@@ -64,7 +50,7 @@
 
     public void testReadLongAsShortStringWhenNonDigitCharacterIsSpecified() throws Exception
     {
-        _buffer.putUnsignedByte((short)2);
+        _buffer.put((byte)2);
         _buffer.put((byte)'1');
         _buffer.put((byte)'a');
         _buffer.flip();
diff --git a/client/src/test/java/org/apache/qpid/framing/FieldTableTest.java b/client/src/test/java/org/apache/qpid/framing/FieldTableTest.java
index 508617b..f759ddc 100644
--- a/client/src/test/java/org/apache/qpid/framing/FieldTableTest.java
+++ b/client/src/test/java/org/apache/qpid/framing/FieldTableTest.java
@@ -21,16 +21,16 @@
 package org.apache.qpid.framing;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.test.utils.QpidTestCase;
 import org.junit.Assert;
 
 import org.apache.qpid.AMQPInvalidClassException;
+import org.apache.qpid.test.utils.QpidTestCase;
 
 public class FieldTableTest extends QpidTestCase
 {
@@ -465,7 +465,7 @@
         outerTable.setFieldTable("innerTable", innerTable);
 
         // Write the outer table into the buffer.
-        QpidByteBuffer buf = QpidByteBuffer.allocate(EncodingUtils.encodedFieldTableLength(outerTable));
+        ByteBuffer buf = ByteBuffer.allocate(EncodingUtils.encodedFieldTableLength(outerTable));
 
         outerTable.writeToBuffer(buf);
 
@@ -594,7 +594,7 @@
         table.setString("null-string", null);
 
 
-        QpidByteBuffer buf = QpidByteBuffer.allocate((int) table.getEncodedSize() + 4);
+        ByteBuffer buf = ByteBuffer.allocate((int) table.getEncodedSize() + 4);
         table.writeToBuffer(buf);
 
         buf.flip();
@@ -916,7 +916,7 @@
         assertEquals("unexpected data length", 24, length);
 
         //Create a second FieldTable from the encoded bytes
-        FieldTable tableFromBytes = new FieldTable(QpidByteBuffer.wrap(data));
+        FieldTable tableFromBytes = new FieldTable(ByteBuffer.wrap(data));
 
         //Create a final FieldTable and addAll() from the table created with encoded bytes
         FieldTable destinationTable = new FieldTable();
