diff --git a/performance_results/ideal/merged_stats.csv b/performance_results/ideal/merged_stats.csv
new file mode 100644
index 0000000000000000000000000000000000000000..369aab13dff0643ebde87f7623b1a207e78f5b25
--- /dev/null
+++ b/performance_results/ideal/merged_stats.csv
@@ -0,0 +1,7 @@
+data_sent,data_received,data_truncated_received,fec_sent,fec_received,ack_sent,ack_received,nack_received,packet_ignored,throughput,min_rtt,max_rtt,packet_retransmitted,fec
+43263.0,0.0,0.0,0.0,0.0,0.0,38716.0,30.0,0.0,996184.9375,7.0,222.0,38737.0,0
+43386.0,0.0,0.0,1132.0,0.0,0.0,38845.0,24.0,0.0,1002924.3125,4.0,294.0,38860.0,1
+44906.0,0.0,0.0,1132.0,0.0,0.0,40370.0,17.0,0.0,1033694.0,4.0,218.0,40380.0,1
+34710.0,0.0,0.0,0.0,0.0,0.0,30175.0,19.0,0.0,925487.25,6.0,545.0,30184.0,0
+36801.0,0.0,0.0,0.0,0.0,0.0,32265.0,19.0,0.0,968436.4375,4.0,300.0,32275.0,0
+30674.0,0.0,0.0,1132.0,0.0,0.0,26133.0,25.0,0.0,948363.9375,5.0,249.0,26148.0,1
diff --git a/performance_results/ideal/output.gif b/performance_results/ideal/output.gif
new file mode 100644
index 0000000000000000000000000000000000000000..ae8a968b45b58c62a535e62648696f90a97b37d3
Binary files /dev/null and b/performance_results/ideal/output.gif differ
diff --git a/performance_results/ideal/receiver_1_with_FEC.csv b/performance_results/ideal/receiver_1_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6177c35a89de1a4159be0316a16ee8ff9a3e0828
--- /dev/null
+++ b/performance_results/ideal/receiver_1_with_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5859
+data_truncated_received:19
+fec_sent:0
+fec_received:724
+ack_sent:39291
+ack_received:0
+nack_received:0
+packet_ignored:453
+throughput:1044119.437500
+packet_duplicated:1457
+packet_recovered:124
diff --git a/performance_results/ideal/receiver_1_without_FEC.csv b/performance_results/ideal/receiver_1_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..de8471fab8a1a875c241d9694f7d3f153ede6b7a
--- /dev/null
+++ b/performance_results/ideal/receiver_1_without_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5904
+data_truncated_received:23
+fec_sent:0
+fec_received:0
+ack_sent:39165
+ack_received:0
+nack_received:0
+packet_ignored:392
+throughput:1001298.562500
+packet_duplicated:1378
+packet_recovered:0
diff --git a/performance_results/ideal/receiver_2_with_FEC.csv b/performance_results/ideal/receiver_2_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0787b14cbd88158b2e6a67802cfb72a6595b2b95
--- /dev/null
+++ b/performance_results/ideal/receiver_2_with_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5853
+data_truncated_received:19
+fec_sent:0
+fec_received:721
+ack_sent:40197
+ack_received:0
+nack_received:0
+packet_ignored:467
+throughput:1029673.375000
+packet_duplicated:1450
+packet_recovered:123
diff --git a/performance_results/ideal/receiver_2_without_FEC.csv b/performance_results/ideal/receiver_2_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c40a93eab833a87b56381be50973644aba18e783
--- /dev/null
+++ b/performance_results/ideal/receiver_2_without_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5877
+data_truncated_received:27
+fec_sent:0
+fec_received:0
+ack_sent:37830
+ack_received:0
+nack_received:0
+packet_ignored:383
+throughput:993940.812500
+packet_duplicated:1351
+packet_recovered:0
diff --git a/performance_results/ideal/receiver_3_with_FEC.csv b/performance_results/ideal/receiver_3_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..108a0757ff3d62f915eb7449032a296965682cef
--- /dev/null
+++ b/performance_results/ideal/receiver_3_with_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5449
+data_truncated_received:18
+fec_sent:0
+fec_received:763
+ack_sent:27451
+ack_received:0
+nack_received:0
+packet_ignored:352
+throughput:971431.750000
+packet_duplicated:1072
+packet_recovered:149
diff --git a/performance_results/ideal/receiver_3_without_FEC.csv b/performance_results/ideal/receiver_3_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..22ca3b148e307d92c3920fe33d8aea21fbeaca08
--- /dev/null
+++ b/performance_results/ideal/receiver_3_without_FEC.csv
@@ -0,0 +1,12 @@
+data_sent:0
+data_received:5835
+data_truncated_received:27
+fec_sent:0
+fec_received:0
+ack_sent:38436
+ack_received:0
+nack_received:0
+packet_ignored:422
+throughput:992450.312500
+packet_duplicated:1309
+packet_recovered:0
diff --git a/performance_results/ideal/sender_1_with_FEC.csv b/performance_results/ideal/sender_1_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..d13c7407ddee13e74689be91d9a7dadb30cd6a04
--- /dev/null
+++ b/performance_results/ideal/sender_1_with_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:43811
+data_received:0
+data_truncated_received:0
+fec_sent:1132
+fec_received:0
+ack_sent:0
+ack_received:39275
+nack_received:19
+packet_ignored:0
+throughput:1039259.312500
+min_rtt:4
+max_rtt:240
+packet_retransmitted:39285
diff --git a/performance_results/ideal/sender_1_without_FEC.csv b/performance_results/ideal/sender_1_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..f5cb9a721ce8edda9d1be664064bab690ee8d9bb
--- /dev/null
+++ b/performance_results/ideal/sender_1_without_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:43706
+data_received:0
+data_truncated_received:0
+fec_sent:0
+fec_received:0
+ack_sent:0
+ack_received:39165
+nack_received:23
+packet_ignored:0
+throughput:997203.437500
+min_rtt:5
+max_rtt:230
+packet_retransmitted:39180
diff --git a/performance_results/ideal/sender_2_with_FEC.csv b/performance_results/ideal/sender_2_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..aef860215a8d0267f082557c9888d928e107dfe1
--- /dev/null
+++ b/performance_results/ideal/sender_2_with_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:44734
+data_received:0
+data_truncated_received:0
+fec_sent:1132
+fec_received:0
+ack_sent:0
+ack_received:40197
+nack_received:19
+packet_ignored:0
+throughput:1022288.937500
+min_rtt:2
+max_rtt:227
+packet_retransmitted:40208
diff --git a/performance_results/ideal/sender_2_without_FEC.csv b/performance_results/ideal/sender_2_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6b2f8d3f29c5071792cf015b71c2fd69e546d1c4
--- /dev/null
+++ b/performance_results/ideal/sender_2_without_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:42374
+data_received:0
+data_truncated_received:0
+fec_sent:0
+fec_received:0
+ack_sent:0
+ack_received:37829
+nack_received:27
+packet_ignored:0
+throughput:984541.062500
+min_rtt:4
+max_rtt:238
+packet_retransmitted:37848
diff --git a/performance_results/ideal/sender_3_with_FEC.csv b/performance_results/ideal/sender_3_with_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e76ed44be6c77c075d1c301d0e06b1dfa307582d
--- /dev/null
+++ b/performance_results/ideal/sender_3_with_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:31985
+data_received:0
+data_truncated_received:0
+fec_sent:1132
+fec_received:0
+ack_sent:0
+ack_received:27451
+nack_received:18
+packet_ignored:0
+throughput:963552.000000
+min_rtt:1
+max_rtt:300
+packet_retransmitted:27459
diff --git a/performance_results/ideal/sender_3_without_FEC.csv b/performance_results/ideal/sender_3_without_FEC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c8e0b2410ddde808b85103b03e1261a64f72f2b4
--- /dev/null
+++ b/performance_results/ideal/sender_3_without_FEC.csv
@@ -0,0 +1,13 @@
+data_sent:42970
+data_received:0
+data_truncated_received:0
+fec_sent:0
+fec_received:0
+ack_sent:0
+ack_received:38427
+nack_received:27
+packet_ignored:0
+throughput:990699.375000
+min_rtt:6
+max_rtt:251
+packet_retransmitted:38444
diff --git a/src/receiver.c b/src/receiver.c
index 899f07301471cdf7219921c7c8952bb3e5d579c5..1efc9eb5cc1c1a6172b153f2c0e71037165c74e8 100644
--- a/src/receiver.c
+++ b/src/receiver.c
@@ -37,13 +37,9 @@ int main(int argc, char **argv) {
         return print_usage(argv[0]);
     }
 
-    ASSERT(1 == 1);                     // Try to change it to see what happens when it fails
-    // DEBUG_DUMP("Some bytes", 11);    // You can use it with any pointer type
-
     DEBUG("Receiver has following arguments: stats_filename is %s, listen_ip is %s, listen_port is %u",
         stats_filename, listen_ip, listen_port);
 
-    // 1. Bind address to port
     struct sockaddr_in6 * addr = (struct sockaddr_in6 *) malloc(sizeof(struct sockaddr_in6));
     const char * res = real_address(listen_ip, addr);
     if (res != NULL)
diff --git a/src/receiver_utils.c b/src/receiver_utils.c
index ff3586eeb527ee80357424e3ec0e4ff6d3cd80e4..a25dd7e48a99f3ac3487c113e634db5f69c151d5 100644
--- a/src/receiver_utils.c
+++ b/src/receiver_utils.c
@@ -74,6 +74,7 @@ int send_if_inneed(struct pollfd * pfd, receiver_state_t * state)
 int consume_data_pkt(receiver_state_t * state, uint8_t seqnum_to_consume)
 {
     ASSERT(state->recvd_data_buf[seqnum_to_consume] != NULL);
+    state->bytes_received = state->bytes_received + pkt_get_length(state->recvd_data_buf[seqnum_to_consume]);
     size_t written = fwrite((void *) pkt_get_payload(state->recvd_data_buf[seqnum_to_consume]), sizeof(char), (size_t) pkt_get_length(state->recvd_data_buf[seqnum_to_consume]), stdout);
     if (written != pkt_get_length(state->recvd_data_buf[seqnum_to_consume]))
     {
@@ -254,7 +255,7 @@ int prepare_ack_to_send(receiver_state_t * state)
  */
 int handle_data_pkt(receiver_state_t * state, const pkt_t * pkt)
 {
-    state->stats->data_received++;
+    
     DEBUG("Received data packet seqnum %d with timestamp %d | current_window_size : %d, current_window_start : %d", 
                pkt_get_seqnum(pkt), pkt_get_timestamp(pkt), state->curr_recv_window, state->recv_window_start);
                
@@ -488,13 +489,14 @@ int handle_valid_pkt(receiver_state_t * state, const pkt_t * pkt)
         return prepare_ack_to_send(state);
     }
     
-    state->timestamp_last_packet = time((time_t *) &(state->timestamp_last_packet));
+    gettimeofday(&(state->timestamp_last_packet), NULL);
     uint8_t tr = pkt_get_tr(pkt);
     if (tr == 1)
     {   /* If truncated */
         return handle_truncated_pkt(state, pkt);
     } else if (pkt_get_type(pkt) == PTYPE_DATA)
     {   /* Type DATA    */
+        state->stats->data_received++; // Can't be put in handle data pckt cause it used by fec too
         return handle_data_pkt(state, pkt);
     } else if (pkt_get_type(pkt) == PTYPE_FEC) 
     {   /* Type FEC     */
@@ -620,7 +622,8 @@ receiver_state_t * state_new()
     to_return->transfer_done             = 0;
     to_return->next_to_consume           = 0;
     to_return->last_packet               = 256;  // No valid seqnum will reach this value, max value 255
-    to_return->last_data_packet          = 256;    
+    to_return->last_data_packet          = 256; 
+    to_return->bytes_received            = 0;   
     return to_return;
 }
 
@@ -654,15 +657,15 @@ void receiver_read_write_loop(int sfd, const char * pathname)
     pfd->events         = POLLIN | POLLOUT;
     if (wait_for_client(sfd) == 0)
     {   
-        state->timestamp_first_packet = time((time_t *) &(state->timestamp_first_packet));
+        gettimeofday(&(state->timestamp_first_packet), NULL);
         reception_loop(pfd, state);
     }
     DEBUG("Done the transfer with done status being %s", (state->transfer_done) ? "true" : "false");
     sleep(2);
-    double time = difftime(state->timestamp_last_packet, state->timestamp_first_packet);
-    DEBUG("The difference between the two is %f seconds", (double) state->timestamp_last_packet - state->timestamp_first_packet);
-    DEBUG("The transfer took %f seconds", time);
-    state->stats->throughput = ((state->stats->data_received + state->stats->packet_recovered) * MAX_PAYLOAD_SIZE) / time;
+    double time_in_ms = time_milliseconds(&(state->timestamp_last_packet)) - time_milliseconds(&(state->timestamp_first_packet));
+    DEBUG("The difference between the two is %f seconds", (double) time_in_ms * 1000);
+    DEBUG("The transfer took %f seconds", time_in_ms);
+    state->stats->throughput = (state->bytes_received * 8 ) / (time_in_ms / 1000);
     write_stats_to_file(pathname, state->stats, RECEIVER);
     state_del(state);
     free(pfd);
diff --git a/src/receiver_utils.h b/src/receiver_utils.h
index e34e503d4e995c3ef5ab9f80d2e705768d7d786c..3b265271661622be639ea82b39bb2d1d34dfa844 100644
--- a/src/receiver_utils.h
+++ b/src/receiver_utils.h
@@ -51,8 +51,9 @@ typedef struct
     uint16_t last_data_packet;
     uint16_t next_to_consume;
     transfer_stats_t * stats;
-    time_t timestamp_first_packet;
-    time_t timestamp_last_packet;
+    struct timeval timestamp_first_packet;
+    struct timeval timestamp_last_packet;
+    unsigned long long int bytes_received;
 } receiver_state_t;
 
 
diff --git a/tests/extract_perfomance_stats.py b/tests/extract_perfomance_stats.py
new file mode 100644
index 0000000000000000000000000000000000000000..061073808010e072ad42474579e5b2f4f2c86c1f
--- /dev/null
+++ b/tests/extract_perfomance_stats.py
@@ -0,0 +1,66 @@
+""""
+Written by : Samuel de Meester and Van Ingenzi
+
+This code does data analysis on the results of our TRTP perfomance bash tests.
+"""
+from cmath import exp
+import sys
+import os
+import pandas as pd
+
+"""
+Return a dictionary of the different values found in the receiver stats (.csv) file
+"""
+def read_receiver_stats(filename):
+    dictionary = {}
+    with open(filename, 'r') as f:
+        for line in f.readlines():
+            key, value = line.split(":")
+            dictionary[key] = float(value)
+    return dictionary
+
+"""
+Return a dictionary of the different values found in the sender stats (.csv) file
+"""
+def read_sender_stats(filename):
+    dictionary = {}
+    with open(filename, 'r') as f:
+        for line in f.readlines():
+            key, value = line.split(":")
+            dictionary[key] = float(value)
+    return dictionary
+
+"""
+For each dataset we summarise the
+"""
+def merge_sender_stats(path_to_dir:str) -> list:
+    to_return = []
+    for _, _, files in os.walk(path_to_dir, topdown=True):
+        for file_basename in files:
+            if (file_basename[-4:] == ".csv") and (file_basename[:6] == "sender"):
+                stats = read_receiver_stats(os.path.join(path_to_dir, file_basename))
+                stats["fec"] = 0 if "without" in file_basename else 1
+                to_return.append(stats)
+    return to_return
+
+def main(path_to_dir:str) -> None:
+    full_path = os.path.abspath(path_to_dir)
+    if not os.path.isdir(full_path):
+        print(f"The given path is not a directory, {full_path}")
+        return None
+    for root, _, _ in os.walk(full_path, topdown=True):
+        if (os.path.exists(os.path.join(root, 'sender_merged_stats.csv'))):
+            os.remove(os.path.join(root, 'sender_merged_stats.csv'))
+        if root != full_path:
+            merged_sender_stats = merge_sender_stats(root)
+            df = pd.DataFrame.from_dict(merged_sender_stats )
+            df.to_csv(os.path.join(root, 'sender_merged_stats.csv'), index=False, header=True)
+    return None
+
+if __name__ == "__main__":
+    if (len(sys.argv) != 2):
+        print(f"""
+This python is to be run as follow : {sys.argv[0]} <path_to_perfomance_results>
+        """)
+    path_to_results_dir = sys.argv[1]
+    main(path_to_results_dir)
diff --git a/tests/perfomance_test.sh b/tests/perfomance_test.sh
index 9a94fabd01af6cd0d2f6012d7d5812bb5b1eb0c0..50cf19f5417d5e807a8d0879cf1ccabe04495354 100755
--- a/tests/perfomance_test.sh
+++ b/tests/perfomance_test.sh
@@ -30,8 +30,8 @@ echo -e "The linksimulator paramateres are:
         \t\t-CUT RATE:   ${CUT_RATE}%      \t-JITTER: ${JITTER}ms 
         \t\t-LOSS RATE:  ${LOSS_RATE}%\n"
 
-ITER=0
 OUTPUT=${OUTPUT_DIR}/output.${BSN_EXT}
+err=0
 
 for ITER in 1 2 3; do 
   for MODE in "${MODES[@]}"; do
@@ -75,7 +75,7 @@ for ITER in 1 2 3; do
       fi
     fi
 
-    sleep 5 # We wait 5s for the receiver to finish up
+    sleep 20 # We wait 20s for the receiver to finish up
 
     if kill -0 $receiver_pid &> /dev/null ; then
       echo "The receiver didn't stop at the end of the transfer!"
diff --git a/tests/performances_tests.py b/tests/performances_tests.py
deleted file mode 100644
index 92b09e9b858ca3e17992a17a2f7399d105196e57..0000000000000000000000000000000000000000
--- a/tests/performances_tests.py
+++ /dev/null
@@ -1,23 +0,0 @@
-
-"""
-Return a dictionary of the different values found in the receiver stats (.csv) file
-"""
-def read_receiver_stats(filename):
-    dictionary = {}
-    with open(filename, 'r') as f:
-        for line in f.readlines():
-            key, value = line.split(":")
-            dictionary[key] = int(value)
-    return dictionary
-
-"""
-Return a dictionary of the different values found in the sender stats (.csv) file
-"""
-def read_sender_stats(filename):
-    dictionary = {}
-    with open(filename, 'r') as f:
-        for line in f.readlines():
-            key, value = line.split(":")
-            dictionary[key] = int(value)
-    return dictionary
-