public function fillObject(string $rawMQTTHeaders, ClientInterface $client): ReadableContentInterface
    {
        // Retrieve full message first
        $fullMessage = $this->completePossibleIncompleteMessage($rawMQTTHeaders, $client);
        // Handy to maintain for debugging purposes
        #$this->logger->debug('Bin data', [\unreal4u\MQTT\DebugTools::convertToBinaryRepresentation($rawMQTTHeaders)]);

        // Handy to have: the first byte
        $firstByte = ord($fullMessage{0});
        // TopicName size is always on the second position after the size of the remaining length field (1 to 4 bytes)
        $topicSize = ord($fullMessage{$this->sizeOfRemainingLengthField + 2});
        // With the first byte, we can determine the QoS level of the incoming message
        $qosLevel = $this->determineIncomingQoSLevel($firstByte);

        $messageStartPosition = $this->sizeOfRemainingLengthField + 3;
        // If we have a QoS level present, we must retrieve the packet identifier as well
        if ($qosLevel->getQoSLevel() > 0) {
            $this->logger->debug('QoS level above 0, shifting message start position and getting packet identifier');
            // [2 (fixed header) + 2 (topic size) + $topicSize] marks the beginning of the 2 packet identifier bytes
            $this->setPacketIdentifier(new PacketIdentifier(Utilities::convertBinaryStringToNumber(
                $fullMessage{$this->sizeOfRemainingLengthField + 3 + $topicSize} .
                $fullMessage{$this->sizeOfRemainingLengthField + 4 + $topicSize}
            )));
            $this->logger->debug('Determined packet identifier', ['PI' => $this->getPacketIdentifier()]);
            $messageStartPosition += 2;
        }

        // At this point $rawMQTTHeaders will be always 1 byte long, initialize a Message object with dummy data for now
        $this->message = new Message(
            // Save to assume a constant here: first 2 bytes will always be fixed header, next 2 bytes are topic size
            substr($fullMessage, $messageStartPosition + $topicSize),
            new TopicName(substr($fullMessage, $this->sizeOfRemainingLengthField + 3, $topicSize))
        );
        $this->analyzeFirstByte($firstByte, $qosLevel);

        $this->logger->debug('Determined headers', [
            'topicSize' => $topicSize,
            'QoSLevel' => $this->message->getQoSLevel(),
            'isDuplicate' => $this->isRedelivery,
            'isRetained' => $this->message->isRetained(),
            #'packetIdentifier' => $this->packetIdentifier->getPacketIdentifierValue(), // This is not always set!
        ]);

        return $this;
    }