diff --git a/ESP8266_Transmitter/ESP8266_Transmitter.ino b/ESP8266_Transmitter/ESP8266_Transmitter.ino
index 4fffad637355b06b147ee22cc286e1a22c081532..a5d7062f98ed746c8aeffb0b0faf463e8490092b 100644
--- a/ESP8266_Transmitter/ESP8266_Transmitter.ino
+++ b/ESP8266_Transmitter/ESP8266_Transmitter.ino
@@ -45,10 +45,13 @@
 #define DEBUG 1
 #define MIN_RAND_DELAY 500 // ms
 #define MAX_RAND_DELAY 1250 // ms
-#define POLLING_FREQUENCY 2500 // ms Take value every POLLING_FREQUENCY ms
 #define MAX_TRANSMISSION_RETRIES 5 // No. Retries before recordings new values then retry
-#define TX_AFTER_N_READINGS 10 // No. of samples, after which Transmit Avg Readings
 #define TX_RESERVATION_TIME 1 // How long do we require use of TX for sending packets? (Seconds)
+
+// Variable Values - May be updated by Gateway
+int TX_AFTER_N_READINGS = 4; // No. of samples, after which Transmit Avg Readings
+int POLLING_FREQUENCY = 30000; // ms Take value every POLLING_FREQUENCY ms
+
 int pollEventCount = 0; // Number of times data has been sampled in this recording period
 
 // Lora Config
@@ -155,6 +158,7 @@ bool setupLoRa() {
 
   LoRa.setSpreadingFactor(loraSpreadingFactor);
   LoRa.setSignalBandwidth(loraSignalBandwidth);
+  LoRa.setTxPower(20);
 
   Serial.println("[+] LoRa Initialized OK!");
   return true;
@@ -360,6 +364,7 @@ StaticJsonDocument<1024> listenForAndConsumeMessage(int listenDuration) {
       }
     }
 
+    Serial.println(incoming);
     // Deserialize - TODO Error Handling https://arduinojson.org/v6/api/json/deserializejson/
     deserializeJson(json, incoming);
     break;
@@ -445,7 +450,22 @@ boolean listenForTxPayloadAccept(int listenDuration, int messageID) {
 
     Serial.println("[+] Transmit - Payload - Ack Recieved: " + String(ackStatus) + "\n");
     
-    if (ackStatus) { return true; } // It all worked :)
+    if (ackStatus) {  // It all worked :)
+      // Check for any updated config values
+      const int newTxAfterNReadings = json["txAfterNReadings"];
+      if (newTxAfterNReadings != NULL && newTxAfterNReadings != TX_AFTER_N_READINGS) {
+        TX_AFTER_N_READINGS = newTxAfterNReadings;
+        Serial.println("[+] Tx After N Readings Updated, now: " + String(TX_AFTER_N_READINGS) + " samples");
+      }
+      
+      const int newPollingFrequency = json["pollingFrequency"];
+      if (newPollingFrequency != NULL && newPollingFrequency != POLLING_FREQUENCY) {
+        POLLING_FREQUENCY = newPollingFrequency;
+        Serial.println("[+] Polling Frequency Updated, now: " + String(POLLING_FREQUENCY) + "ms");
+      }
+      
+      return true; 
+    }
 
     // TODO Retransmit, recover, etc
     Serial.println("[-] Transmit - Payload - Ack Failed - TODO Setup Retransmission");
@@ -483,7 +503,7 @@ boolean transmitData(DynamicJsonDocument payload) {
   sendTxHello(msgCount);
 
   // Await TX Hello Auth - Expect: Timeout | Not Auth | Accept + Clear To Transmit
-  if (!listenForTxHelloAccept(TX_RESERVATION_TIME * 2, msgCount)) { 
+  if (!listenForTxHelloAccept(TX_RESERVATION_TIME * 4, msgCount)) { 
     return false; // Can't transmit just now, we will retry
   }
 
@@ -584,11 +604,12 @@ void loop() {
 
     // Transmission failed, handle re-tries
     int numRetries = 1;
+    waitRandomDelay(TX_RESERVATION_TIME*2); // Introduce random delay to avoid another collision
     
     while (!transmitData(sensorData) && numRetries < MAX_TRANSMISSION_RETRIES){
       numRetries++;
       Serial.println("[-] Failed to send packet, retrying. Attempt " + String(numRetries) + " of " + String(MAX_TRANSMISSION_RETRIES) + "\n");
-      waitRandomDelay(TX_RESERVATION_TIME); // Introduce random delay to avoid another collision
+      waitRandomDelay(TX_RESERVATION_TIME*2); // Introduce random delay to avoid another collision
     }
 
     // We were able to transmit after retries, values reset, now record new values