diff --git a/basice2e/e2eReport.py b/basice2e/e2eReport.py
new file mode 100644
index 0000000000000000000000000000000000000000..86b530ede06fddfcfd9031d466471db1e3508981
--- /dev/null
+++ b/basice2e/e2eReport.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python3
+
+# This script is used for building reports on dropped E2E integration tests
+import logging
+
+import re
+import glob
+import os
+import logging as log
+
+resultsDir = "./results/clients"
+
+
+def err(s):
+    """
+    Helper for printing errors and exiting
+
+    :param s: Error string to print
+    """
+    log.error(s)
+    exit(1)
+
+
+def find_files():
+    """Obtains list of files to search."""
+    if not os.path.isdir(resultsDir):
+        err("Directory {} does not exist!".format(resultsDir))
+    return glob.glob('{}/client*.log'.format(resultsDir))
+
+
+def read_file(path, phrases):
+    """Reads the lines of a file."""
+    while 1:
+        with open(path, 'r') as file:
+            line = file.readline()
+            if not line:
+                break
+            else:
+                for phrase in phrases:
+                    if phrase in line:
+                        yield line
+
+
+def main():
+    log.basicConfig(format='[%(levelname)s] %(asctime)s: %(message)s',
+                    level=log.INFO, datefmt='%d-%b-%y %H:%M:%S')
+    log_files = find_files()
+
+    messages_sent = dict()
+    messages_received = dict()
+    rounds_sent = dict()
+
+    # Scan each log file
+    for path in log_files:
+        log.info("Scanning {}".format(path))
+        with open(path, 'r') as file:
+            while True:
+                line = file.readline()
+                if not line:
+                    break
+                else:
+                    if "Successfully sent to EphID" in line:
+                        # Capture message sending
+                        sent_message = re.findall('msgDigest: (.{20})\)', line)[0]
+                        log.debug("Located sent message: {}".format(sent_message))
+                        messages_sent[sent_message] = {"sender": os.path.basename(path)}
+
+                        # Capture rounds messages were sent in
+                        sent_round = re.findall('\) in round ([0-9]+)', line)[0]
+                        log.debug("Located sent round: {}".format(sent_round))
+                        messages_sent[sent_message]["round"] = sent_round
+                        if sent_round not in rounds_sent:
+                            rounds_sent[sent_round] = False
+
+                    elif "Received message of type" in line:
+                        # Capture message receiving
+                        received_messages = re.findall(' msgDigest: (.{20})', line)
+                        for received_message in received_messages:
+                            log.debug("Located received message: {}".format(received_message))
+                            messages_received[received_message] = os.path.basename(path)
+
+                    elif "Round(s)" in line:
+                        # Capture round success
+                        successful_rounds = re.findall('Round\(s\) ([0-9]+) successful', line)
+                        for successful_round in successful_rounds:
+                            log.debug("Located successful round: {}".format(successful_round))
+                            rounds_sent[successful_round] = True
+
+    # Print results
+    num_successful = 0
+    for msgDigest, senderDict in messages_sent.items():
+        if msgDigest in messages_received:
+            log.debug("Message {} sent by {} on round {} was received".format(msgDigest,
+                                                                              senderDict["sender"],
+                                                                              senderDict["round"]))
+            num_successful += 1
+        else:
+            log.error("Message {} sent by {} on round {} was NOT received".format(msgDigest,
+                                                                                  senderDict["sender"],
+                                                                                  senderDict["round"]))
+    for round_id, was_successful in rounds_sent.items():
+        if was_successful:
+            log.debug("Round {} was successful".format(round_id))
+        else:
+            log.warning("Round {} was NOT confirmed successful, messages may have been dropped".format(round_id))
+
+    log.info("{}/{} messages received successfully!".format(num_successful, len(messages_sent)))
+
+
+if __name__ == "__main__":
+    main()
+
+# INFO 2021/05/07 15:25:14 Received message of type None from ouQD89J4YdmlzcAkdjjgVa49SANsi1JL5JLVjrWjZtED, msgDigest: inDu2/zmGD+vtCMVHXdg
+# INFO 2021/05/19 15:29:09 Received 2 messages in Round 65253 for -7 (AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD)
+# INFO 2021/05/07 15:25:03 Sending to EphID -15 (ouQD89J4YdmlzcAkdjjgVa49SANsi1JL5JLVjrWjZtED) on round 797, (msgDigest: YTuZd9p8759GBMNz8Dw7, ecrMsgDigest: JshXEJ4WTBsbRFWQDBYq) via gateway sAtfNaRd1jePhfRrcDgZgHHAAmhZ/F0jDbD4JgAfkMsB
+# INFO 2021/05/07 15:25:04 Successfully sent to EphID -15 (source: ouQD89J4YdmlzcAkdjjgVa49SANsi1JL5JLVjrWjZtED) in round 797 (msgDigest: YTuZd9p8759GBMNz8Dw7)
+# INFO 2021/05/07 15:25:04 Result of sending message "Hello from Rick42, with E2E Encryption" to "ouQD89J4YdmlzcAkdjjgVa49SANsi1JL5JLVjrWjZtED":
+# INFO 2021/05/07 15:25:04 	Round(s) 795 successful