#include <logfunc.hpp>
 
 using namespace std;
-using boost::scoped_array;
 using I2n::Logger::GlobalLogger;
 
 //-----------------------------------------------------------------------------
         const std::size_t &payload_size_in_bytes
 ) :
     PayloadSizeInBytes( payload_size_in_bytes ),
-    Payload( new uint8_t[ payload_size_in_bytes ] )
+    Payload( payload_size_in_bytes )
 {
     BOOST_ASSERT( 0 < PayloadSizeInBytes );
-    BOOST_ASSERT( Payload.get() != NULL );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
 
-    fill( Payload.get(), Payload.get() + PayloadSizeInBytes, 0 );
+    fill( Payload.begin(), Payload.end(), 0 );
 }
 
 /**
         const MessagePayload &other
 ) :
     PayloadSizeInBytes( other.PayloadSizeInBytes ),
-    Payload( new uint8_t[ other.PayloadSizeInBytes ] )
+    Payload( other.PayloadSizeInBytes )
 {
     BOOST_ASSERT( 0 < PayloadSizeInBytes );
-    BOOST_ASSERT( Payload.get() != NULL );
-    BOOST_ASSERT( other.Payload.get() != NULL );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+    BOOST_ASSERT( other.Payload.capacity() == other.PayloadSizeInBytes );
 
-    copy( other.Payload.get(), other.Payload.get() + PayloadSizeInBytes, Payload.get() );
+    copy( other.Payload.begin(), other.Payload.end(), Payload.begin() );
 
     BOOST_ASSERT( PayloadSizeInBytes == other.PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() >= other.Payload.size() );
+    BOOST_ASSERT( equal( Payload.begin(), Payload.end(), other.Payload.begin() ) );
+    BOOST_ASSERT( equal( other.Payload.begin(), other.Payload.end(), Payload.begin() ) );
 }
 
 /**
 MessagePayload& MessagePayload::operator=( const MessagePayload &other )
 {
     BOOST_ASSERT( 0 < PayloadSizeInBytes );
-    BOOST_ASSERT( Payload.get() != NULL );
-    BOOST_ASSERT( other.Payload.get() != NULL );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+    BOOST_ASSERT( other.Payload.capacity() == other.PayloadSizeInBytes );
+    BOOST_ASSERT( !other.Payload.empty() );
 
     // checking for self-assignment (i.e. object1 = object1)
-    if ( &other == this ) {
+    if ( &other == this )
+    {
         return *this;
     }
 
     size_t new_payload_size_in_bytes = other.PayloadSizeInBytes;
-    uint8_t *new_payload_data = new uint8_t[ new_payload_size_in_bytes ];
-    Payload.reset( new_payload_data );
-    PayloadSizeInBytes = new_payload_size_in_bytes;
+    size_t old_payload_size_in_bytes = PayloadSizeInBytes;
+    if ( new_payload_size_in_bytes > old_payload_size_in_bytes )
+    {
+        Payload.reserve( new_payload_size_in_bytes );
+        PayloadSizeInBytes = new_payload_size_in_bytes;
+    }
 
-    copy( other.Payload.get(), other.Payload.get() + other.PayloadSizeInBytes, Payload.get() );
+    copy( other.Payload.begin(), other.Payload.end(), Payload.begin() );
 
     BOOST_ASSERT( PayloadSizeInBytes == other.PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() >= other.Payload.size() );
+    BOOST_ASSERT( equal( Payload.begin(), Payload.end(), other.Payload.begin() ) );
+    BOOST_ASSERT( equal( other.Payload.begin(), other.Payload.end(), Payload.begin() ) );
 
     return *this;               //lint !e429
 }
  */
 const uint8_t& MessagePayload::operator[]( size_t offset ) const
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
     BOOST_ASSERT( offset < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
 
-    ptrdiff_t index = static_cast<ptrdiff_t>(offset);
+    ptrdiff_t index = static_cast<ptrdiff_t>( offset );
     return Payload[ index ];
 }
 
  */
 uint8_t& MessagePayload::operator[]( size_t offset )
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
     BOOST_ASSERT( offset < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
 
-    ptrdiff_t index = static_cast<ptrdiff_t>(offset);
+    ptrdiff_t index = static_cast<ptrdiff_t>( offset );
     return Payload[ index ];
 } //lint !e1762
 
  *
  * @return a pointer to the array encapsulated by this class.
  */
-uint8_t* MessagePayload::get() const
+uint8_t* MessagePayload::get()
 {
-    return Payload.get();
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+
+    // Vector containers have their elements stored in contiguous storage
+    // locations, which means that their elements can be accessed not only
+    // using iterators but also using offsets on regular pointers to elements.
+    return static_cast<uint8_t *>( &Payload[ 0 ] );
 }
 
 /**
         const size_t extra_payload_size_in_bytes
 )
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     BOOST_ASSERT( extra_payload_data != NULL );
 
     if ( 0 < extra_payload_size_in_bytes )
     {
         BOOST_ASSERT( 0 < extra_payload_size_in_bytes );
 
-        // as Payload.reset() deletes the array previously held by Payload, we
-        // can't reference that array by old_payload_data pointer, thus it is
-        // required to copy the old array to another memory location in order to
-        // keep the original data intact
         size_t old_payload_size_in_bytes = PayloadSizeInBytes;
-        uint8_t *old_payload_data = new uint8_t[ old_payload_size_in_bytes ];
-        copy( Payload.get(), Payload.get() + PayloadSizeInBytes, old_payload_data );
-        scoped_array<uint8_t> old_payload( old_payload_data );
-
         size_t new_payload_size_in_bytes = old_payload_size_in_bytes + extra_payload_size_in_bytes;
-        uint8_t *new_payload_data = new uint8_t[ new_payload_size_in_bytes ];
-
-        // copy both data, the original and the one to be appended, to the new
-        // buffer, in contiguous memory.
-        copy( &old_payload_data[0], &old_payload_data[old_payload_size_in_bytes], &new_payload_data[0] );
-        copy( &extra_payload_data[0], &extra_payload_data[extra_payload_size_in_bytes], &new_payload_data[old_payload_size_in_bytes] );
-
-        // the reset() deletes the old array held by Payload
-        Payload.reset( new_payload_data );
         PayloadSizeInBytes = new_payload_size_in_bytes;
 
+        Payload.insert( Payload.end(),
+                        &extra_payload_data[ 0 ],
+                        &extra_payload_data[ extra_payload_size_in_bytes ]
+        );
+
 #ifndef BOOST_DISABLE_ASSERTS
         BOOST_ASSERT( PayloadSizeInBytes == ( old_payload_size_in_bytes + extra_payload_size_in_bytes ) );
 
-        uint8_t *original_data_begin = Payload.get();
-        uint8_t *original_data_end = Payload.get() + old_payload_size_in_bytes;
-        BOOST_ASSERT( equal( original_data_begin, original_data_end, old_payload_data ) );
-
-        uint8_t *extra_data_begin = Payload.get() + old_payload_size_in_bytes;
-        uint8_t *extra_data_end = Payload.get() + old_payload_size_in_bytes + extra_payload_size_in_bytes;
+        uint8_t *extra_data_begin = &Payload[ old_payload_size_in_bytes ];
+        uint8_t *extra_data_end = &Payload[ old_payload_size_in_bytes + extra_payload_size_in_bytes ];
         BOOST_ASSERT( equal( extra_data_begin, extra_data_end, extra_payload_data ) );
 #endif
     }
         const int bit_index
 ) const
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     const int max_bit_index = 7;
     BOOST_ASSERT( ( 0 <= byte_index ) && ( byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= bit_index ) && ( bit_index <= max_bit_index ) );
         const int byte_index,
         const int bit_index,
         const bool value
-) const
+)
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     const int max_bit_index = 7;
     BOOST_ASSERT( ( 0 <= byte_index ) && ( byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= bit_index ) && ( bit_index <= max_bit_index ) );
         const int right_byte_index
 ) const
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     BOOST_ASSERT( ( 0 <= left_byte_index ) && ( left_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= right_byte_index ) && ( right_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( left_byte_index < right_byte_index );
         const int left_byte_index,
         const int right_byte_index,
         const uint16_t value
-) const
+)
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     BOOST_ASSERT( ( 0 <= left_byte_index ) && ( left_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= right_byte_index ) && ( right_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( left_byte_index < right_byte_index );
         const int last_byte_index
 ) const
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     BOOST_ASSERT( ( 0 <= first_byte_index ) && ( first_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= last_byte_index ) && ( last_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( first_byte_index < last_byte_index );
         const int first_byte_index,
         const int last_byte_index,
         const uint32_t value
-) const
+)
 {
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
     BOOST_ASSERT( ( 0 <= first_byte_index ) && ( first_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( ( 0 <= last_byte_index ) && ( last_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
     BOOST_ASSERT( first_byte_index < last_byte_index );
  */
 istream& MessagePayload::read( istream &is )
 {
-    BOOST_ASSERT( Payload.get() != NULL );
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
 
-    char *payload_data_array = reinterpret_cast<char *>( Payload.get() );
+    char *payload_data_array = reinterpret_cast<char *>( &Payload[ 0 ] );
 
     (void) is.read( payload_data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
 
                 << " bytes, but received " << is.gcount() << " bytes." << endl;
     }
 
+    BOOST_ASSERT( Payload.size() == PayloadSizeInBytes );
+    BOOST_ASSERT( !Payload.empty() );
+
     return is;
 }
 
  */
 ostream& MessagePayload::write( ostream &os ) const
 {
-    BOOST_ASSERT( Payload.get() != NULL );
+    BOOST_ASSERT( 0 < PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+    BOOST_ASSERT( Payload.size() == PayloadSizeInBytes );
+    BOOST_ASSERT( !Payload.empty() );
 
-    const char *data_array = reinterpret_cast<const char *>( Payload.get() );
+    // Vector containers have their elements stored in contiguous storage
+    // locations, which means that their elements can be accessed not only
+    // using iterators but also using offsets on regular pointers to elements.
+    const char *payload_data_array = reinterpret_cast<const char *>( &Payload[ 0 ] );
 
-    (void) os.write( data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
+    (void) os.write( payload_data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
 
     return os;
 }