diff --git a/src/network/event.hpp b/src/network/event.hpp
index cb929b0c5..60e324a93 100644
--- a/src/network/event.hpp
+++ b/src/network/event.hpp
@@ -82,11 +82,16 @@ public:
     /** Returns the peer of this event. */
     STKPeer* getPeer() const { return m_peer;  }
     // ------------------------------------------------------------------------
-    /** \brief Get a copy of the data.
-     *  \return A copy of the message data. This is empty for events like
+    /** \brief Get a const reference to the received data.
+     *  This is empty for events like connection or disconnections. 
+     */
+    const NetworkString& data() const { return m_data; }
+    // ------------------------------------------------------------------------
+    /** \brief Get a non-const reference to the received data.
+     *  A copy of the message data. This is empty for events like
      *  connection or disconnections. */
-    NetworkString data() const { return m_data; }
-
+    NetworkString& data() { return m_data; }
+    // ------------------------------------------------------------------------
 
 };   // class Event
 
diff --git a/src/network/network_string.hpp b/src/network/network_string.hpp
index dc10832c0..4274f1dd5 100644
--- a/src/network/network_string.hpp
+++ b/src/network/network_string.hpp
@@ -39,10 +39,11 @@ typedef unsigned char uchar;
 class NetworkString
 {
 private:
-    union {
+    union FloatAsInt 
+    {
         float f;
         uint8_t i[4];
-    } f_as_i; // float as integer
+    }; // float as integer
 
     // ------------------------------------------------------------------------
     union {
@@ -165,6 +166,7 @@ public:
     NetworkString& addFloat(const float& value) //!< BEWARE OF PRECISION
     {
         assert(sizeof(float) == 4);
+        FloatAsInt f_as_i;
         f_as_i.f = value;
         m_string.push_back(f_as_i.i[0]);
         m_string.push_back(f_as_i.i[1]);
@@ -339,8 +341,9 @@ public:
 
     // ------------------------------------------------------------------------
     /** Returns a 4-byte floating point value. */
-    float getFloat(int pos = 0) //!< BEWARE OF PRECISION
+    float getFloat(int pos = 0) const //!< BEWARE OF PRECISION
     {
+        FloatAsInt f_as_i;
         for (int i = 0; i < 4; i++)
             f_as_i.i[i] = m_string[pos + i];
         return f_as_i.f;
@@ -426,6 +429,7 @@ public:
     /** Get and remove a 4 byte floating point value. */
     float getAndRemoveFloat(int pos = 0) //!< BEWARE OF PRECISION
     {
+        FloatAsInt f_as_i;
         for (int i = 0; i < 4; i++)
             f_as_i.i[i] = m_string[pos + i];
         return f_as_i.f;
diff --git a/src/network/protocol.cpp b/src/network/protocol.cpp
index 3fb593b33..c4880ad01 100644
--- a/src/network/protocol.cpp
+++ b/src/network/protocol.cpp
@@ -57,7 +57,7 @@ ProtocolType Protocol::getProtocolType()
 
 bool Protocol::checkDataSizeAndToken(Event* event, int minimum_size)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < minimum_size || data[0] != 4)
     {
         Log::warn("Protocol", "Receiving a badly "
@@ -78,7 +78,7 @@ bool Protocol::checkDataSizeAndToken(Event* event, int minimum_size)
 
 bool Protocol::isByteCorrect(Event* event, int byte_nb, int value)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data[byte_nb] != value)
     {
         Log::info("Protocol", "Bad byte at pos %d. %d "
diff --git a/src/network/protocols/client_lobby_room_protocol.cpp b/src/network/protocols/client_lobby_room_protocol.cpp
index f615b921d..210b79ba3 100644
--- a/src/network/protocols/client_lobby_room_protocol.cpp
+++ b/src/network/protocols/client_lobby_room_protocol.cpp
@@ -136,7 +136,7 @@ bool ClientLobbyRoomProtocol::notifyEvent(Event* event)
     assert(m_setup); // assert that the setup exists
     if (event->getType() == EVENT_TYPE_MESSAGE)
     {
-        NetworkString data = event->data();
+        const NetworkString &data = event->data();
         assert(data.size()); // assert that data isn't empty
         uint8_t message_type = data[0];
         if (message_type != 0x03 &&
@@ -162,7 +162,7 @@ bool ClientLobbyRoomProtocol::notifyEventAsynchronous(Event* event)
     assert(m_setup); // assert that the setup exists
     if (event->getType() == EVENT_TYPE_MESSAGE)
     {
-        NetworkString data = event->data();
+        const NetworkString &data = event->data();
         assert(data.size()); // assert that data isn't empty
         uint8_t message_type = data[0];
         if (message_type == 0x03 ||
@@ -286,7 +286,7 @@ void ClientLobbyRoomProtocol::update()
  */
 void ClientLobbyRoomProtocol::newPlayer(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() != 7 || data[0] != 4 || data[5] != 1) // 7 bytes remains now
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a new player wasn't formated as expected.");
@@ -329,7 +329,7 @@ void ClientLobbyRoomProtocol::newPlayer(Event* event)
  */
 void ClientLobbyRoomProtocol::disconnectedPlayer(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() != 2 || data[0] != 1)
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a new player wasn't formated as expected.");
@@ -360,7 +360,7 @@ void ClientLobbyRoomProtocol::disconnectedPlayer(Event* event)
  */
 void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     if (data.size() < 12 || data[0] != 1 || data[2] != 4 || data[7] != 4) // 12 bytes remains now
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying an accepted connection wasn't formated as expected.");
@@ -429,7 +429,7 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
  */
 void ClientLobbyRoomProtocol::connectionRefused(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() != 2 || data[0] != 1) // 2 bytes remains now
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a refused connection wasn't formated as expected.");
@@ -464,7 +464,7 @@ void ClientLobbyRoomProtocol::connectionRefused(Event* event)
  */
 void ClientLobbyRoomProtocol::kartSelectionRefused(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() != 2 || data[0] != 1)
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a refused kart selection wasn't formated as expected.");
@@ -499,7 +499,7 @@ void ClientLobbyRoomProtocol::kartSelectionRefused(Event* event)
  */
 void ClientLobbyRoomProtocol::kartSelectionUpdate(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 3 || data[0] != 1)
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a kart selection update wasn't formated as expected.");
@@ -535,7 +535,7 @@ void ClientLobbyRoomProtocol::kartSelectionUpdate(Event* event)
  */
 void ClientLobbyRoomProtocol::startGame(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 5 || data[0] != 4)
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a kart "
@@ -568,7 +568,7 @@ void ClientLobbyRoomProtocol::startGame(Event* event)
  */
 void ClientLobbyRoomProtocol::startSelection(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 5 || data[0] != 4)
     {
         Log::error("ClientLobbyRoomProtocol", "A message notifying a kart "
@@ -600,12 +600,12 @@ void ClientLobbyRoomProtocol::startSelection(Event* event)
  */
 void ClientLobbyRoomProtocol::raceFinished(Event* event)
 {
-    if (event->data().size() < 5)
+    NetworkString &data = event->data();
+    if (data.size() < 5)
     {
         Log::error("ClientLobbyRoomProtocol", "Not enough data provided.");
         return;
     }
-    NetworkString data = event->data();
     if (event->getPeer()->getClientServerToken() != data.gui32(1))
     {
         Log::error("ClientLobbyRoomProtocol", "Bad token");
@@ -676,7 +676,7 @@ void ClientLobbyRoomProtocol::raceFinished(Event* event)
  */
 void ClientLobbyRoomProtocol::playerMajorVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 9))
         return;
     if (!isByteCorrect(event, 5, 1))
@@ -699,7 +699,7 @@ void ClientLobbyRoomProtocol::playerMajorVote(Event* event)
  */
 void ClientLobbyRoomProtocol::playerRaceCountVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 9))
         return;
     if (!isByteCorrect(event, 5, 1))
@@ -722,7 +722,7 @@ void ClientLobbyRoomProtocol::playerRaceCountVote(Event* event)
  */
 void ClientLobbyRoomProtocol::playerMinorVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 9))
         return;
     if (!isByteCorrect(event, 5, 1))
@@ -746,7 +746,7 @@ void ClientLobbyRoomProtocol::playerMinorVote(Event* event)
  */
 void ClientLobbyRoomProtocol::playerTrackVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 10))
         return;
     if (!isByteCorrect(event, 5, 1))
@@ -772,7 +772,7 @@ void ClientLobbyRoomProtocol::playerTrackVote(Event* event)
  */
 void ClientLobbyRoomProtocol::playerReversedVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 11))
         return;
     if (!isByteCorrect(event, 5, 1))
@@ -798,7 +798,7 @@ void ClientLobbyRoomProtocol::playerReversedVote(Event* event)
  */
 void ClientLobbyRoomProtocol::playerLapsVote(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (!checkDataSizeAndToken(event, 9))
         return;
     if (!isByteCorrect(event, 5, 1))
diff --git a/src/network/protocols/controller_events_protocol.cpp b/src/network/protocols/controller_events_protocol.cpp
index 711daa96b..9b75265f7 100644
--- a/src/network/protocols/controller_events_protocol.cpp
+++ b/src/network/protocols/controller_events_protocol.cpp
@@ -66,7 +66,7 @@ void ControllerEventsProtocol::setup()
 
 bool ControllerEventsProtocol::notifyEventAsynchronous(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 17)
     {
         Log::error("ControllerEventsProtocol", "The data supplied was not complete. Size was %d.", data.size());
diff --git a/src/network/protocols/game_events_protocol.cpp b/src/network/protocols/game_events_protocol.cpp
index 095451b77..6d65891e1 100644
--- a/src/network/protocols/game_events_protocol.cpp
+++ b/src/network/protocols/game_events_protocol.cpp
@@ -24,7 +24,7 @@ bool GameEventsProtocol::notifyEvent(Event* event)
 {
     if (event->getType() != EVENT_TYPE_MESSAGE)
         return true;
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     if (data.size() < 5) // for token and type
     {
         Log::warn("GameEventsProtocol", "Too short message.");
diff --git a/src/network/protocols/kart_update_protocol.cpp b/src/network/protocols/kart_update_protocol.cpp
index e4a5db5e5..a940f45cd 100644
--- a/src/network/protocols/kart_update_protocol.cpp
+++ b/src/network/protocols/kart_update_protocol.cpp
@@ -34,7 +34,7 @@ bool KartUpdateProtocol::notifyEventAsynchronous(Event* event)
 {
     if (event->getType() != EVENT_TYPE_MESSAGE)
         return true;
-    NetworkString ns = event->data();
+    NetworkString &ns = event->data();
     if (ns.size() < 36)
     {
         Log::info("KartUpdateProtocol", "Message too short.");
diff --git a/src/network/protocols/server_lobby_room_protocol.cpp b/src/network/protocols/server_lobby_room_protocol.cpp
index 62afdd528..3902993dd 100644
--- a/src/network/protocols/server_lobby_room_protocol.cpp
+++ b/src/network/protocols/server_lobby_room_protocol.cpp
@@ -66,7 +66,7 @@ bool ServerLobbyRoomProtocol::notifyEventAsynchronous(Event* event)
     assert(m_setup); // assert that the setup exists
     if (event->getType() == EVENT_TYPE_MESSAGE)
     {
-        NetworkString data = event->data();
+        const NetworkString &data = event->data();
         assert(data.size()); // message not empty
         uint8_t message_type;
         message_type = data[0];
@@ -336,7 +336,7 @@ void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
 void ServerLobbyRoomProtocol::connectionRequested(Event* event)
 {
     STKPeer* peer = event->getPeer();
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() != 5 || data[0] != 4)
     {
         Log::warn("ServerLobbyRoomProtocol", "Receiving badly formated message. Size is %d and first byte %d", data.size(), data[0]);
@@ -415,7 +415,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
  */
 void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 6))
         return;
@@ -476,7 +476,7 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
  */
 void ServerLobbyRoomProtocol::playerMajorVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 7))
         return;
@@ -507,7 +507,7 @@ void ServerLobbyRoomProtocol::playerMajorVote(Event* event)
  */
 void ServerLobbyRoomProtocol::playerRaceCountVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 7))
         return;
@@ -538,7 +538,7 @@ void ServerLobbyRoomProtocol::playerRaceCountVote(Event* event)
  */
 void ServerLobbyRoomProtocol::playerMinorVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 7))
         return;
@@ -569,7 +569,7 @@ void ServerLobbyRoomProtocol::playerMinorVote(Event* event)
  */
 void ServerLobbyRoomProtocol::playerTrackVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 8))
         return;
@@ -602,7 +602,7 @@ void ServerLobbyRoomProtocol::playerTrackVote(Event* event)
  */
 void ServerLobbyRoomProtocol::playerReversedVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 9))
         return;
@@ -635,7 +635,7 @@ void ServerLobbyRoomProtocol::playerReversedVote(Event* event)
  */
 void ServerLobbyRoomProtocol::playerLapsVote(Event* event)
 {
-    NetworkString data = event->data();
+    NetworkString &data = event->data();
     STKPeer* peer = event->getPeer();
     if (!checkDataSizeAndToken(event, 9))
         return;
diff --git a/src/network/protocols/start_game_protocol.cpp b/src/network/protocols/start_game_protocol.cpp
index ae871acb2..572dc9b10 100644
--- a/src/network/protocols/start_game_protocol.cpp
+++ b/src/network/protocols/start_game_protocol.cpp
@@ -37,7 +37,7 @@ StartGameProtocol::~StartGameProtocol()
 
 bool StartGameProtocol::notifyEventAsynchronous(Event* event)
 {
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 5)
     {
         Log::error("StartGameProtocol", "Too short message.");
diff --git a/src/network/protocols/synchronization_protocol.cpp b/src/network/protocols/synchronization_protocol.cpp
index d487d3fe1..b1d6ba8ac 100644
--- a/src/network/protocols/synchronization_protocol.cpp
+++ b/src/network/protocols/synchronization_protocol.cpp
@@ -36,7 +36,7 @@ bool SynchronizationProtocol::notifyEventAsynchronous(Event* event)
 {
     if (event->getType() != EVENT_TYPE_MESSAGE)
         return true;
-    NetworkString data = event->data();
+    const NetworkString &data = event->data();
     if (data.size() < 10)
     {
         Log::warn("SynchronizationProtocol", "Received a message too short.");