BOOST_ASSERT( Payload.get() != NULL );
     BOOST_ASSERT( other.Payload.get() != NULL );
 
-    // FIXME must resize the Payload in order to work
+    // checking for self-assignment (i.e. object1 = object1)
+    if ( &other == this ) {
+        return *this;
+    }
 
-    copy( other.Payload.get(), other.Payload.get() + PayloadSizeInBytes, Payload.get() );
+    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;
+
+    copy( other.Payload.get(), other.Payload.get() + other.PayloadSizeInBytes, Payload.get() );
 
     BOOST_ASSERT( PayloadSizeInBytes == other.PayloadSizeInBytes );