diff --git a/iot/main/gps.cpp b/iot/main/gps.cpp
index 77b0d5a..df3049a 100644
--- a/iot/main/gps.cpp
+++ b/iot/main/gps.cpp
@@ -1,18 +1,19 @@
 #include "gps.h"
 #include "settings.h"
 
-// The serial connection to the GPS device
-SoftwareSerial* serial_gps;
-
-void gps_begin() {
-	serial_gps = new SoftwareSerial(PIN_GPS_RX, PIN_GPS_TX);
+SoftwareSerial gps_begin() {
+	SoftwareSerial serial_gps(PIN_GPS_RX, PIN_GPS_TX);
 	// Initialise the software-based serial connection to the GPS device
-	serial_gps->begin(BAUD_GPS);
+	serial_gps.begin(BAUD_GPS);
+	return serial_gps;
 }
 
 GPSLocation gps_fetch() {
+	// The serial connection to the GPS module
+	SoftwareSerial serial_gps = gps_begin();
 	// The GPS message decoder
 	TinyGPSPlus	gps;
+	// The struct that will hold the result
 	GPSLocation result;
 	
 	Serial.print(F("[gps] Working: "));
@@ -25,17 +26,20 @@ GPSLocation gps_fetch() {
 		}
 		
 		// Make sure there's something to read
-		if(serial_gps->available() <= 0)
+		if(serial_gps.available() <= 0)
 			continue;
 		
 		// If it failed, go around again
-		if(!gps.encode(serial_gps->read()))
+		if(!gps.encode(serial_gps.read()))
 			continue;
 		
 		// If we haven't acquired a lock yet, go around again
-		// Also go around again if the location is the same hasn't yet been updated (GPS devices are strange)
-		if(!gps.location.isValid()) {
-			// NOTE: It can really take a rather long time to get a lock. Just wait patiently :-)
+		if(!gps.location.isValid()
+		#ifdef SD_DEBUG_ENABLED
+			|| !gps.time.isValid()
+		#endif
+		) {
+			// NOTE: It can take a rather long time to get a lock. Just wait patiently :-)
 			if(millis() - ms_last_update > 500) Serial.print(".");
 			ms_last_update = millis();
 			continue;
@@ -48,21 +52,16 @@ GPSLocation gps_fetch() {
 		result.lng = gps.location.lng();
 		#ifdef SD_DEBUG_ENABLED
 		snprintf(result.time, 19, "%04d-%02d-%02d %02d:%02d:%02d",
-			gps.date.year(),
-			gps.date.month(),
-			gps.date.day(),
-			gps.time.hour(),
-			gps.time.minute(),
-			gps.time.second()
+			gps.date.year(), gps.date.month(), gps.date.day(),
+			gps.time.hour(), gps.time.minute(), gps.time.second()
 		);
 		#endif
 		return result;
 	}
+	
+	gps_end(serial_gps);
 }
 
-void gps_end() {
-	serial_gps->end();
-	delete serial_gps;
-	//delete gps;
-	// Serial.println(F("[warning] Putting the GPS device to sleep isn't implemented yet."));
+void gps_end(SoftwareSerial serial_gps) {
+	serial_gps.end();
 }
diff --git a/iot/main/gps.h b/iot/main/gps.h
index a67187b..0e1c17e 100644
--- a/iot/main/gps.h
+++ b/iot/main/gps.h
@@ -19,7 +19,7 @@ struct GPSLocation {
 /**
  * Initialises the connection to the GPS device.
  */
-void gps_begin();
+SoftwareSerial gps_begin();
 
 /**
  * Fetches new data from the GPS module.
@@ -34,5 +34,6 @@ GPSLocation gps_fetch();
  * system and so doesn't get turned off after each measurement, as it takes 
  * ~30s to reacquire a lock when it first starts up - hence why we put it to 
  * sleep instead.
+ * TODO: Connect the gps module to the timed power rail instead, as its; got an onboard battery.
  */
-void gps_end();
+void gps_end(SoftwareSerial gps);
diff --git a/iot/main/main.ino b/iot/main/main.ino
index d81f564..beb7796 100644
--- a/iot/main/main.ino
+++ b/iot/main/main.ino
@@ -19,19 +19,10 @@ void setup() {
 	Serial.println(F("[main] Starting"));
 	
 	random_begin();
-	Serial.println(freeMemory(), DEC); // 1
 	
-	peripheral_register(PIN_SPI_CS_RFM95);
-	peripheral_register(PIN_SPI_CS_SD);
-	
-	Serial.println(freeMemory(), DEC); // 2
-	
-	gps_begin();
-	Serial.println(freeMemory(), DEC); // 3
+	Serial.println(freeMemory(), DEC);
 	GPSLocation gps_data = gps_fetch();
-	Serial.println(freeMemory(), DEC); // 4
-	gps_end();
-	Serial.println(freeMemory(), DEC); // 5
+	Serial.println(freeMemory(), DEC);
 	
 	Serial.print(F("[main] Location ")); Serial.print(gps_data.lat); Serial.print(F(", ")); Serial.println(gps_data.lng);
 	
@@ -41,6 +32,10 @@ void setup() {
 	Serial.println(id);
 	
 	// Activate microSD card breakout board on the SPI bus
+	
+	peripheral_register(PIN_SPI_CS_RFM95);
+	peripheral_register(PIN_SPI_CS_SD);
+	
 	peripheral_unsilence(PIN_SPI_CS_SD);
 	
 	store_init();
