diff --git a/basice2e/clients.goldoutput/client20.txt b/basice2e/clients.goldoutput/client20.txt
index 2b10e4046835de371f6c155d4167bd3efefa75c4..9576ea854f487e54b187ce4f5a327a797fc914d1 100644
--- a/basice2e/clients.goldoutput/client20.txt
+++ b/basice2e/clients.goldoutput/client20.txt
@@ -3,40 +3,20 @@ Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
-Received 10
+Received 5
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
 Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Sent: Hello from 20, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
-Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
 Message received: Hello from 21, without E2E Encryption
-Received 10
+Received 5
diff --git a/basice2e/clients.goldoutput/client21.txt b/basice2e/clients.goldoutput/client21.txt
index 12b9325a98938a9ca969f1321a8fb084bb3283ea..0ce63adb0c05c577975d35f62348f44419cb2379 100644
--- a/basice2e/clients.goldoutput/client21.txt
+++ b/basice2e/clients.goldoutput/client21.txt
@@ -3,40 +3,20 @@ Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
-Received 10
+Received 5
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
 Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Sent: Hello from 21, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
-Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
 Message received: Hello from 20, without E2E Encryption
-Received 10
+Received 5
diff --git a/basice2e/clients.goldoutput/client80.txt b/basice2e/clients.goldoutput/client80.txt
new file mode 100644
index 0000000000000000000000000000000000000000..859ae7de3ed856fc1d2f01ce3645c4e01687126a
--- /dev/null
+++ b/basice2e/clients.goldoutput/client80.txt
@@ -0,0 +1,10 @@
+Created new group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Got group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Printed list of 1 groups.
+Received group message: "Hello 2 from 82"
+Received group message: "Hello from 81"
+Received group message: "Hello from 82"
+Sent message "Hello 2 from 80" to group.
+Sent message "Hello from 80" to group.
+Waiting for 1 group message(s) to be received.
+Waiting for 2 group message(s) to be received.
diff --git a/basice2e/clients.goldoutput/client81.txt b/basice2e/clients.goldoutput/client81.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e6a105d189c4372a9f3ef435dc4db80de96d4163
--- /dev/null
+++ b/basice2e/clients.goldoutput/client81.txt
@@ -0,0 +1,11 @@
+Got group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Joined group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Left group.
+Printed list of 1 groups.
+Received group message: "Hello from 80"
+Received group message: "Hello from 82"
+Sent message "Hello from 81" to group.
+Timed out waiting for 1 group message(s).
+Waiting for 1 group message(s) to be received.
+Waiting for 2 group message(s) to be received.
+Waiting for group request to be received.
diff --git a/basice2e/clients.goldoutput/client82.txt b/basice2e/clients.goldoutput/client82.txt
new file mode 100644
index 0000000000000000000000000000000000000000..170f71e6278532248e9de2bcffed4c00862e7509
--- /dev/null
+++ b/basice2e/clients.goldoutput/client82.txt
@@ -0,0 +1,11 @@
+Got group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Joined group with name "Group Name" and message "80 inviting 81 and 82 to new group"
+Printed list of 1 groups.
+Received group message: "Hello 2 from 80"
+Received group message: "Hello from 80"
+Received group message: "Hello from 81"
+Sent message "Hello 2 from 82" to group.
+Sent message "Hello from 82" to group.
+Waiting for 1 group message(s) to be received.
+Waiting for 2 group message(s) to be received.
+Waiting for group request to be received.
diff --git a/basice2e/run.sh b/basice2e/run.sh
index 9e2a7ff1ce2bce96802d54650169fd7cd83c484c..431746caee05651154a406008ac80ee97ad440ad 100755
--- a/basice2e/run.sh
+++ b/basice2e/run.sh
@@ -37,6 +37,7 @@ CLIENTCLEAN=results/clients-cleaned
 CLIENTOPTS="--password hello --ndf results/ndf.json --waitTimeout 90 --unsafe-channel-creation -v $DEBUGLEVEL"
 CLIENTUDOPTS="--password hello --ndf results/ndf.json -v $DEBUGLEVEL"
 CLIENTSINGLEOPTS="--password hello --ndf results/ndf.json -v $DEBUGLEVEL"
+CLIENTGROUPOPTS="--password hello --ndf results/ndf.json -v $DEBUGLEVEL"
 
 mkdir -p $SERVERLOGS
 mkdir -p $GATEWAYLOGS
@@ -271,11 +272,12 @@ then
     wait $PIDVAL2
 
     echo "FORCING MESSAGE PICKUP RETRY... (NON-E2E, PRECAN)"
-    CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS --forceMessagePickupRetry --unsafe -l $CLIENTOUT/client20.log -s blob20 --sendid 20 --destid 21 --sendCount 10 --receiveCount 10 -m \"Hello from 20, without E2E Encryption\""
+    # Higher timeouts for this test to allow message pickup retry to function
+    CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS --forceMessagePickupRetry --unsafe -l $CLIENTOUT/client20.log -s blob20 --sendid 20 --destid 21 --sendCount 5 --receiveCount 5 -m \"Hello from 20, without E2E Encryption\""
     eval $CLIENTCMD >> $CLIENTOUT/client20.txt || true &
     PIDVAL=$!
     echo "$CLIENTCMD -- $PIDVAL"
-    CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS --forceMessagePickupRetry --unsafe -l $CLIENTOUT/client21.log -s blob21 --sendid 21 --destid 20 --sendCount 10 --receiveCount 10 -m \"Hello from 21, without E2E Encryption\""
+    CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS --forceMessagePickupRetry --unsafe -l $CLIENTOUT/client21.log -s blob21 --sendid 21 --destid 20 --sendCount 5 --receiveCount 5 -m \"Hello from 21, without E2E Encryption\""
     eval $CLIENTCMD >> $CLIENTOUT/client21.txt || true &
     PIDVAL2=$!
     echo "$CLIENTCMD -- $PIDVAL"
@@ -417,11 +419,12 @@ wait $PIDVAL
 wait $PIDVAL2
 
 echo "FORCING MESSAGE PICKUP RETRY... "
-CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS --forceMessagePickupRetry -l $CLIENTOUT/client20.log -s blob20 --sendid 20 --destid 21 --sendCount 10 --receiveCount 10 -m \"Hello from 20, without E2E Encryption\""
+# Higher timeouts for this test to allow message pickup retry to function
+CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS --forceMessagePickupRetry -l $CLIENTOUT/client20.log -s blob20 --sendid 20 --destid 21 --sendCount 5 --receiveCount 5 -m \"Hello from 20, without E2E Encryption\""
 eval $CLIENTCMD >> $CLIENTOUT/client20.txt || true &
 PIDVAL=$!
 echo "$CLIENTCMD -- $PIDVAL"
-CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS --forceMessagePickupRetry -l $CLIENTOUT/client21.log -s blob21 --sendid 21 --destid 20 --sendCount 10 --receiveCount 10 -m \"Hello from 21, without E2E Encryption\""
+CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS --forceMessagePickupRetry -l $CLIENTOUT/client21.log -s blob21 --sendid 21 --destid 20 --sendCount 5 --receiveCount 5 -m \"Hello from 21, without E2E Encryption\""
 eval $CLIENTCMD >> $CLIENTOUT/client21.txt || true &
 PIDVAL2=$!
 echo "$CLIENTCMD -- $PIDVAL"
@@ -508,6 +511,202 @@ then
     wait $PIDVAL2
 fi
 
+
+
+echo "TESTING GROUP CHAT..."
+# Create authenticated channel between client 80 and 81
+CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client80.log -s blob80 --writeContact $CLIENTOUT/client80-contact.bin --unsafe -m \"Hello from contact 80 to myself, without E2E Encryption\""
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+wait $PIDVAL1
+CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client81.log -s blob81 --writeContact $CLIENTOUT/client81-contact.bin --destfile $CLIENTOUT/client80-contact.bin --send-auth-request --sendCount 0 --receiveCount 0"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+
+while [ ! -s $CLIENTOUT/client81-contact.bin ]; do
+    sleep 1
+    echo -n "."
+done
+echo
+
+TMPID=$(cat $CLIENTOUT/client80.log | grep "User\:" | awk -F' ' '{print $5}')
+CLIENT80ID=${TMPID}
+echo "CLIENT 80 ID: $CLIENT80ID"
+TMPID=$(cat $CLIENTOUT/client81.log | grep "User\:" | awk -F' ' '{print $5}')
+CLIENT81ID=${TMPID}
+echo "CLIENT 81 ID: $CLIENT81ID"
+
+# Client 81 will now wait for client 81's E2E Auth channel request and confirm
+CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client80.log -s blob80 --destfile $CLIENTOUT/client81-contact.bin --sendCount 0 --receiveCount 0"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+wait $PIDVAL1
+wait $PIDVAL2
+
+
+# Create authenticated channel between client 80 and 82
+CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client82.log -s blob82 --writeContact $CLIENTOUT/client82-contact.bin --destfile $CLIENTOUT/client80-contact.bin --send-auth-request --sendCount 0 --receiveCount 0"
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+
+while [ ! -s $CLIENTOUT/client82-contact.bin ]; do
+    sleep 1
+    echo -n "."
+done
+echo
+
+TMPID=$(cat $CLIENTOUT/client82.log | grep "User\:" | awk -F' ' '{print $5}')
+CLIENT82ID=${TMPID}
+echo "CLIENT 82 ID: $CLIENT82ID"
+
+# Client 82 will now wait for client 82's E2E Auth channel request and confirm
+CLIENTCMD="timeout 240s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client80.log -s blob80 --destfile $CLIENTOUT/client82-contact.bin --sendCount 0 --receiveCount 0"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+wait $PIDVAL1
+wait $PIDVAL3
+
+# User 1 Creates Group
+echo "Group User IDs: $CLIENT80ID $CLIENT81ID $CLIENT82ID"
+echo "b64:$CLIENT81ID" > $CLIENTOUT/groupParticipants
+echo "b64:$CLIENT82ID" >> $CLIENTOUT/groupParticipants
+CLIENTCMD="timeout 60s ../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --create $CLIENTOUT/groupParticipants --message \"80 inviting 81 and 82 to new group\""
+eval $CLIENTCMD > $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --join"
+eval $CLIENTCMD > $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --join"
+eval $CLIENTCMD > $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# Extract group ID -- Note to Jono this probably needs to be fixed!
+GROUPID=$(cat $CLIENTOUT/client80.log | grep -a "NewGroupID\:" | awk -F' ' '{print $5}')
+echo "Group ID: $GROUPID"
+
+# Print the group list from all users
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --list"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --list"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --list"
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# Print group from all users
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --show $GROUPID"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --show $GROUPID"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --show $GROUPID"
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# Now everyone sends their message
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --sendMessage $GROUPID --message \"Hello from 80\""
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --sendMessage $GROUPID --message \"Hello from 81\""
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --sendMessage $GROUPID --message \"Hello from 82\""
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# Everyone waits for their message
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --wait 2"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --wait 2"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --wait 2"
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# Member 2 leaves the group
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --leave $GROUPID"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+wait $PIDVAL2
+
+# 1 and 3 send a message successfully now, 2 does not
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --sendMessage $GROUPID --message \"Hello 2 from 80\""
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --sendMessage $GROUPID --message \"Hello 2 from 82\""
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+# All 3 wait again
+CLIENTCMD="../bin/client group -s blob80 -l $CLIENTOUT/client80.log $CLIENTGROUPOPTS --wait 1"
+eval $CLIENTCMD >> $CLIENTOUT/client80.txt 2>&1 || true &
+PIDVAL1=$!
+echo "$CLIENTCMD -- $PIDVAL1"
+CLIENTCMD="../bin/client group -s blob81 -l $CLIENTOUT/client81.log $CLIENTGROUPOPTS --wait 1"
+eval $CLIENTCMD >> $CLIENTOUT/client81.txt 2>&1 || true &
+PIDVAL2=$!
+echo "$CLIENTCMD -- $PIDVAL2"
+CLIENTCMD="../bin/client group -s blob82 -l $CLIENTOUT/client82.log $CLIENTGROUPOPTS --wait 1"
+eval $CLIENTCMD >> $CLIENTOUT/client82.txt 2>&1 || true &
+PIDVAL3=$!
+echo "$CLIENTCMD -- $PIDVAL3"
+wait $PIDVAL1
+wait $PIDVAL2
+wait $PIDVAL3
+
+sort -b -o "$CLIENTOUT/client80.txt" "$CLIENTOUT/client80.txt"
+sort -b -o "$CLIENTOUT/client81.txt" "$CLIENTOUT/client81.txt"
+sort -b -o "$CLIENTOUT/client82.txt" "$CLIENTOUT/client82.txt"
+
+echo "GROUP CHAT FINISHED!"
+
+
 cp $CLIENTOUT/*.txt $CLIENTCLEAN/
 
 sed -i.bak 's/Sending\ to\ .*\:/Sent:/g' $CLIENTCLEAN/client*.txt