diff --git a/iot/TTNTest/TTNTest.ino b/iot/TTNTest/TTNTest.ino
index 408a713..a1585ca 100644
--- a/iot/TTNTest/TTNTest.ino
+++ b/iot/TTNTest/TTNTest.ino
@@ -1,6 +1,5 @@
 /*******************************************************************************
  * Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
- * Copyright (c) 2018 Terry Moore, MCCI
  *
  * Permission is hereby granted, free of charge, to anyone
  * obtaining a copy of this document and accompanying files,
@@ -10,30 +9,18 @@
  *
  * This example sends a valid LoRaWAN packet with payload "Hello,
  * world!", using frequency and encryption settings matching those of
- * the The Things Network.
+ * the (early prototype version of) The Things Network.
  *
- * This uses ABP (Activation-by-personalisation), where a DevAddr and
- * Session keys are preconfigured (unlike OTAA, where a DevEUI and
- * application key is configured, while the DevAddr and session keys are
- * assigned/generated in the over-the-air-activation procedure).
+ * Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in g1,
+ *  0.1% in g2).
  *
- * Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
- * g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
- * violated by this sketch when left running for longer)!
+ * Change DEVADDR to a unique address!
+ * See http://thethingsnetwork.org/wiki/AddressSpace
  *
- * To use this sketch, first register your application and device with
- * the things network, to set or generate a DevAddr, NwkSKey and
- * AppSKey. Each device should have their own unique values for these
- * fields.
- *
- * Do not forget to define the radio type correctly in
- * arduino-lmic/project_config/lmic_project_config.h or from your BOARDS.txt.
+ * Do not forget to define the radio type correctly in config.h.
  *
  *******************************************************************************/
 
- // References:
- // [feather] adafruit-feather-m0-radio-with-lora-module.pdf
-
 #include <lmic.h>
 #include <hal/hal.h>
 #include <SPI.h>
@@ -42,8 +29,7 @@
 
 // These callbacks are only used in over-the-air activation, so they are
 // left empty here (we cannot leave them out completely unless
-// DISABLE_JOIN is set in arduino-lmic/project_config/lmic_project_config.h,
-// otherwise the linker will complain).
+// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
 void os_getArtEui (u1_t* buf) { }
 void os_getDevEui (u1_t* buf) { }
 void os_getDevKey (u1_t* buf) { }
@@ -85,28 +71,23 @@ void onEvent (ev_t ev) {
 		case EV_JOINED:
 			Serial.println(F("EV_JOINED"));
 			break;
-		/*
-		|| This event is defined but not used in the code. No
-		|| point in wasting codespace on it.
-		||
-		|| case EV_RFU1:
-		||     Serial.println(F("EV_RFU1"));
-		||     break;
-		*/
+		case EV_RFU1:
+			Serial.println(F("EV_RFU1"));
+			break;
 		case EV_JOIN_FAILED:
 			Serial.println(F("EV_JOIN_FAILED"));
 			break;
 		case EV_REJOIN_FAILED:
 			Serial.println(F("EV_REJOIN_FAILED"));
 			break;
+			break;
 		case EV_TXCOMPLETE:
 			Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
-			if (LMIC.txrxFlags & TXRX_ACK)
-			  Serial.println(F("Received ack"));
-			if (LMIC.dataLen) {
-			  Serial.println(F("Received "));
-			  Serial.println(LMIC.dataLen);
-			  Serial.println(F(" bytes of payload"));
+			if(LMIC.dataLen) {
+				// data received in rx slot after tx
+				Serial.print(F("Data Received: "));
+				Serial.write(LMIC.frame+LMIC.dataBeg, LMIC.dataLen);
+				Serial.println();
 			}
 			// Schedule next transmission
 			os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
@@ -127,20 +108,8 @@ void onEvent (ev_t ev) {
 		case EV_LINK_ALIVE:
 			Serial.println(F("EV_LINK_ALIVE"));
 			break;
-		/*
-		|| This event is defined but not used in the code. No
-		|| point in wasting codespace on it.
-		||
-		|| case EV_SCAN_FOUND:
-		||    Serial.println(F("EV_SCAN_FOUND"));
-		||    break;
-		*/
-		case EV_TXSTART:
-			Serial.println(F("EV_TXSTART"));
-			break;
-		default:
-			Serial.print(F("Unknown event: "));
-			Serial.println((unsigned) ev);
+		 default:
+			Serial.println(F("Unknown event"));
 			break;
 	}
 }
@@ -158,17 +127,8 @@ void do_send(osjob_t* j){
 }
 
 void setup() {
-//    pinMode(13, OUTPUT); 
-	while (!Serial); // wait for Serial to be initialized
 	Serial.begin(115200);
-	delay(100);     // per sample code on RF_95 test
 	Serial.println(F("Starting"));
-	
-	// Activate the right SPI device
-	pinMode(10, OUTPUT);
-	pinMode(3, OUTPUT);
-	digitalWrite(10, LOW);
-	digitalWrite(3, HIGH);
 
 	#ifdef VCC_ENABLE
 	// For Pinoccio Scout boards
@@ -192,13 +152,12 @@ void setup() {
 	uint8_t nwkskey[sizeof(NWKSKEY)];
 	memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
 	memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
-	LMIC_setSession (0x13, DEVADDR, nwkskey, appskey);
+	LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
 	#else
-	// If not running an AVR with PROGMEM, just use the arrays directly
-	LMIC_setSession (0x13, DEVADDR, NWKSKEY, APPSKEY);
+	// If not running an AVR with PROGMEM, just use the arrays directly 
+	LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
 	#endif
 
-	#if defined(CFG_eu868)
 	// Set up the channels used by the Things Network, which corresponds
 	// to the defaults of most gateways. Without this, only three base
 	// channels from the LoRaWAN specification are used, which certainly
@@ -220,21 +179,11 @@ void setup() {
 	// devices' ping slots. LMIC does not have an easy way to define set this
 	// frequency and support for class B is spotty and untested, so this
 	// frequency is not configured here.
-	#elif defined(CFG_us915)
-	// NA-US channels 0-71 are configured automatically
-	// but only one group of 8 should (a subband) should be active
-	// TTN recommends the second sub band, 1 in a zero based count.
-	// https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json
-	LMIC_selectSubBand(1);
-	#endif
 
 	// Disable link check validation
 	LMIC_setLinkCheckMode(0);
 
-	// TTN uses SF9 for its RX2 window.
-	LMIC.dn2Dr = DR_SF9;
-
-	// Set data rate and transmit power for uplink
+	// Set data rate and transmit power (note: txpow seems to be ignored by the library)
 	LMIC_setDrTxpow(DR_SF7,14);
 
 	// Start job
@@ -242,15 +191,5 @@ void setup() {
 }
 
 void loop() {
-	unsigned long now;
-	now = millis();
-	if ((now & 512) != 0) {
-	  digitalWrite(13, HIGH);
-	}
-	else {
-	  digitalWrite(13, LOW);
-	}
-	  
 	os_runloop_once();
-	
 }
diff --git a/iot/TTNTestABPNew/TTNTest.ino b/iot/TTNTestABPNew/TTNTest.ino
new file mode 100644
index 0000000..408a713
--- /dev/null
+++ b/iot/TTNTestABPNew/TTNTest.ino
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
+ * Copyright (c) 2018 Terry Moore, MCCI
+ *
+ * Permission is hereby granted, free of charge, to anyone
+ * obtaining a copy of this document and accompanying files,
+ * to do whatever they want with them without any restriction,
+ * including, but not limited to, copying, modification and redistribution.
+ * NO WARRANTY OF ANY KIND IS PROVIDED.
+ *
+ * This example sends a valid LoRaWAN packet with payload "Hello,
+ * world!", using frequency and encryption settings matching those of
+ * the The Things Network.
+ *
+ * This uses ABP (Activation-by-personalisation), where a DevAddr and
+ * Session keys are preconfigured (unlike OTAA, where a DevEUI and
+ * application key is configured, while the DevAddr and session keys are
+ * assigned/generated in the over-the-air-activation procedure).
+ *
+ * Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
+ * g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
+ * violated by this sketch when left running for longer)!
+ *
+ * To use this sketch, first register your application and device with
+ * the things network, to set or generate a DevAddr, NwkSKey and
+ * AppSKey. Each device should have their own unique values for these
+ * fields.
+ *
+ * Do not forget to define the radio type correctly in
+ * arduino-lmic/project_config/lmic_project_config.h or from your BOARDS.txt.
+ *
+ *******************************************************************************/
+
+ // References:
+ // [feather] adafruit-feather-m0-radio-with-lora-module.pdf
+
+#include <lmic.h>
+#include <hal/hal.h>
+#include <SPI.h>
+
+#include "config.custom.h"
+
+// These callbacks are only used in over-the-air activation, so they are
+// left empty here (we cannot leave them out completely unless
+// DISABLE_JOIN is set in arduino-lmic/project_config/lmic_project_config.h,
+// otherwise the linker will complain).
+void os_getArtEui (u1_t* buf) { }
+void os_getDevEui (u1_t* buf) { }
+void os_getDevKey (u1_t* buf) { }
+
+static uint8_t mydata[] = "Hello, world!";
+static osjob_t sendjob;
+
+// Schedule TX every this many seconds (might become longer due to duty
+// cycle limitations).
+const unsigned TX_INTERVAL = 60;
+
+// Pin mapping
+const lmic_pinmap lmic_pins = {
+	.nss = 10,
+	.rxtx = LMIC_UNUSED_PIN,
+	.rst = 9,
+	.dio = {2, 6, 7},
+};
+
+void onEvent (ev_t ev) {
+	Serial.print(os_getTime());
+	Serial.print(": ");
+	switch(ev) {
+		case EV_SCAN_TIMEOUT:
+			Serial.println(F("EV_SCAN_TIMEOUT"));
+			break;
+		case EV_BEACON_FOUND:
+			Serial.println(F("EV_BEACON_FOUND"));
+			break;
+		case EV_BEACON_MISSED:
+			Serial.println(F("EV_BEACON_MISSED"));
+			break;
+		case EV_BEACON_TRACKED:
+			Serial.println(F("EV_BEACON_TRACKED"));
+			break;
+		case EV_JOINING:
+			Serial.println(F("EV_JOINING"));
+			break;
+		case EV_JOINED:
+			Serial.println(F("EV_JOINED"));
+			break;
+		/*
+		|| This event is defined but not used in the code. No
+		|| point in wasting codespace on it.
+		||
+		|| case EV_RFU1:
+		||     Serial.println(F("EV_RFU1"));
+		||     break;
+		*/
+		case EV_JOIN_FAILED:
+			Serial.println(F("EV_JOIN_FAILED"));
+			break;
+		case EV_REJOIN_FAILED:
+			Serial.println(F("EV_REJOIN_FAILED"));
+			break;
+		case EV_TXCOMPLETE:
+			Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
+			if (LMIC.txrxFlags & TXRX_ACK)
+			  Serial.println(F("Received ack"));
+			if (LMIC.dataLen) {
+			  Serial.println(F("Received "));
+			  Serial.println(LMIC.dataLen);
+			  Serial.println(F(" bytes of payload"));
+			}
+			// Schedule next transmission
+			os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
+			break;
+		case EV_LOST_TSYNC:
+			Serial.println(F("EV_LOST_TSYNC"));
+			break;
+		case EV_RESET:
+			Serial.println(F("EV_RESET"));
+			break;
+		case EV_RXCOMPLETE:
+			// data received in ping slot
+			Serial.println(F("EV_RXCOMPLETE"));
+			break;
+		case EV_LINK_DEAD:
+			Serial.println(F("EV_LINK_DEAD"));
+			break;
+		case EV_LINK_ALIVE:
+			Serial.println(F("EV_LINK_ALIVE"));
+			break;
+		/*
+		|| This event is defined but not used in the code. No
+		|| point in wasting codespace on it.
+		||
+		|| case EV_SCAN_FOUND:
+		||    Serial.println(F("EV_SCAN_FOUND"));
+		||    break;
+		*/
+		case EV_TXSTART:
+			Serial.println(F("EV_TXSTART"));
+			break;
+		default:
+			Serial.print(F("Unknown event: "));
+			Serial.println((unsigned) ev);
+			break;
+	}
+}
+
+void do_send(osjob_t* j){
+	// Check if there is not a current TX/RX job running
+	if (LMIC.opmode & OP_TXRXPEND) {
+		Serial.println(F("OP_TXRXPEND, not sending"));
+	} else {
+		// Prepare upstream data transmission at the next possible time.
+		LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
+		Serial.println(F("Packet queued"));
+	}
+	// Next TX is scheduled after TX_COMPLETE event.
+}
+
+void setup() {
+//    pinMode(13, OUTPUT); 
+	while (!Serial); // wait for Serial to be initialized
+	Serial.begin(115200);
+	delay(100);     // per sample code on RF_95 test
+	Serial.println(F("Starting"));
+	
+	// Activate the right SPI device
+	pinMode(10, OUTPUT);
+	pinMode(3, OUTPUT);
+	digitalWrite(10, LOW);
+	digitalWrite(3, HIGH);
+
+	#ifdef VCC_ENABLE
+	// For Pinoccio Scout boards
+	pinMode(VCC_ENABLE, OUTPUT);
+	digitalWrite(VCC_ENABLE, HIGH);
+	delay(1000);
+	#endif
+
+	// LMIC init
+	os_init();
+	// Reset the MAC state. Session and pending data transfers will be discarded.
+	LMIC_reset();
+
+	// Set static session parameters. Instead of dynamically establishing a session
+	// by joining the network, precomputed session parameters are be provided.
+	#ifdef PROGMEM
+	// On AVR, these values are stored in flash and only copied to RAM
+	// once. Copy them to a temporary buffer here, LMIC_setSession will
+	// copy them into a buffer of its own again.
+	uint8_t appskey[sizeof(APPSKEY)];
+	uint8_t nwkskey[sizeof(NWKSKEY)];
+	memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
+	memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
+	LMIC_setSession (0x13, DEVADDR, nwkskey, appskey);
+	#else
+	// If not running an AVR with PROGMEM, just use the arrays directly
+	LMIC_setSession (0x13, DEVADDR, NWKSKEY, APPSKEY);
+	#endif
+
+	#if defined(CFG_eu868)
+	// Set up the channels used by the Things Network, which corresponds
+	// to the defaults of most gateways. Without this, only three base
+	// channels from the LoRaWAN specification are used, which certainly
+	// works, so it is good for debugging, but can overload those
+	// frequencies, so be sure to configure the full frequency range of
+	// your network here (unless your network autoconfigures them).
+	// Setting up channels should happen after LMIC_setSession, as that
+	// configures the minimal channel set.
+	LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);      // g-band
+	LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
+	LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK,  DR_FSK),  BAND_MILLI);      // g2-band
+	// TTN defines an additional channel at 869.525Mhz using SF9 for class B
+	// devices' ping slots. LMIC does not have an easy way to define set this
+	// frequency and support for class B is spotty and untested, so this
+	// frequency is not configured here.
+	#elif defined(CFG_us915)
+	// NA-US channels 0-71 are configured automatically
+	// but only one group of 8 should (a subband) should be active
+	// TTN recommends the second sub band, 1 in a zero based count.
+	// https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json
+	LMIC_selectSubBand(1);
+	#endif
+
+	// Disable link check validation
+	LMIC_setLinkCheckMode(0);
+
+	// TTN uses SF9 for its RX2 window.
+	LMIC.dn2Dr = DR_SF9;
+
+	// Set data rate and transmit power for uplink
+	LMIC_setDrTxpow(DR_SF7,14);
+
+	// Start job
+	do_send(&sendjob);
+}
+
+void loop() {
+	unsigned long now;
+	now = millis();
+	if ((now & 512) != 0) {
+	  digitalWrite(13, HIGH);
+	}
+	else {
+	  digitalWrite(13, LOW);
+	}
+	  
+	os_runloop_once();
+	
+}
diff --git a/iot/TTNTestABPNew/config.custom.h.example b/iot/TTNTestABPNew/config.custom.h.example
new file mode 100644
index 0000000..65a82ea
--- /dev/null
+++ b/iot/TTNTestABPNew/config.custom.h.example
@@ -0,0 +1,15 @@
+// Copy this file to have the name "config.custom.h", and fill in the 3 sections below
+
+// LoRaWAN NwkSKey, network session key
+// Big endian (i.e. msb)
+static const PROGMEM u1_t NWKSKEY[16] = { .... };
+
+// LoRaWAN AppSKey, application session key
+// Big endian (i.e. msb)
+static const u1_t PROGMEM APPSKEY[16] = { .... };
+
+// LoRaWAN end-device address (DevAddr)
+// See http://thethingsnetwork.org/wiki/AddressSpace
+// The library converts the address to network byte order as needed.
+// Big endian (i.e. msb)
+static const u4_t DEVADDR = 0x....; // <-- Change this address for every node!
