diff --git a/decoder/html/script.js b/decoder/html/script.js
index a6bb7023..a0471c09 100644
--- a/decoder/html/script.js
+++ b/decoder/html/script.js
@@ -294,7 +294,18 @@ function time_format(time) {
 }
 
 function get_alt(p) {
-	return '---'; // TODO: Implement pressure to altitude calculation
+	var p_height;
+	p = p / 100; // convert pascal to millibar
+	if (p >= 226.32) {
+		p_height = 44330.8 * (1.0 - Math.exp(Math.log(p / 1013.25) * 0.190263));
+	}
+	if (p < 226.32 && p > 54.749) {
+		p_height = 11000 - 6341.624 * Math.log(p / 226.3202);
+	}
+	if (p <= 54.749) {
+	p_height = 20000 + 216650 * (Math.exp(Math.log(p / 54.749) * -0.0292173) -1.0);
+	}
+	return p_height;
 }
 
 function updateData() {
diff --git a/tracker/software/main.c b/tracker/software/main.c
index 5f2d4dbc..f64eeb2b 100644
--- a/tracker/software/main.c
+++ b/tracker/software/main.c
@@ -16,7 +16,7 @@ int main(void) {
     pktConfigureCoreIO();
 
     /* Setup the mutex for trace output. */
-    //DEBUG_INIT();
+    debug_init();
 
 #if ACTIVATE_CONSOLE
     /* Start console. */
@@ -33,7 +33,7 @@ int main(void) {
     chDbgAssert(pkt == true, "failed to init packet system");
 
     /* Start serial debug channel(s) if selected. */
-    pktSerialStart();
+    //pktSerialStart();
 
     /*
      * Create a packet radio service.
diff --git a/tracker/software/make/pp10a.make b/tracker/software/make/pp10a.make
index a0432818..eeacf91b 100644
--- a/tracker/software/make/pp10a.make
+++ b/tracker/software/make/pp10a.make
@@ -1,243 +1,243 @@
-##############################################################################
-# Build global options
-# NOTE: Can be overridden externally.
-#
-
-# Compiler options here.
-ifeq ($(USE_OPT),)
-  USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16
-endif
-
-# C specific options here (added to USE_OPT).
-ifeq ($(USE_COPT),)
-  USE_COPT = -std=c11
-endif
-
-# C++ specific options here (added to USE_OPT).
-ifeq ($(USE_CPPOPT),)
-  USE_CPPOPT = -fno-rtti
-endif
-
-# Enable this if you want the linker to remove unused code and data
-ifeq ($(USE_LINK_GC),)
-  USE_LINK_GC = yes
-endif
-
-# Linker extra moptions here.
-ifeq ($(USE_LDOPT),)
-  USE_LDOPT = 
-endif
-
-# Enable this if you want link time optimizations (LTO)
-ifeq ($(USE_LTO),)
-  USE_LTO = yes
-endif
-
-# If enabled, this option allows to compile the application in THUMB mode.
-ifeq ($(USE_THUMB),)
-  USE_THUMB = yes
-endif
-
-# Enable this if you want to see the full log while compiling.
-ifeq ($(USE_VERBOSE_COMPILE),)
-  USE_VERBOSE_COMPILE = no
-endif
-
-# If enabled, this option makes the build process faster by not compiling
-# modules not used in the current configuration.
-ifeq ($(USE_SMART_BUILD),)
-  USE_SMART_BUILD = yes
-endif
-
-#
-# Build global options
-##############################################################################
-
-##############################################################################
-# Architecture or project specific options
-#
-
-# Stack size to be allocated to the Cortex-M process stack. This stack is
-# the stack used by the main() thread.
-ifeq ($(USE_PROCESS_STACKSIZE),)
-  USE_PROCESS_STACKSIZE = 0x1000
-endif
-
-# Stack size to the allocated to the Cortex-M main/exceptions stack. This
-# stack is used for processing interrupts and exceptions.
-ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
-  USE_EXCEPTIONS_STACKSIZE = 0x5000
-endif
-
-# Enables the use of FPU (no, softfp, hard).
-ifeq ($(USE_FPU),)
-  USE_FPU = hard
-  USE_FPU_OPT = -mfloat-abi=$(USE_FPU) \
-   -mfpu=fpv4-sp-d16 -fsingle-precision-constant
-endif
-
-#
-# Architecture or project specific options
-##############################################################################
-
-##############################################################################
-# Project, sources and paths
-#
-
-# Define project name here
-PROJECT = pp10a
-
-# Imported source files and paths
-CHIBIOS = ChibiOS
-CONFDIR := ${CURDIR}/cfg/$(PROJECT)
-BUILDDIR := ${CURDIR}/build/$(PROJECT)
-DEPDIR := ${CURDIR}/.dep/$(PROJECT)
-CMSISINC = ${CURDIR}/CMSIS/include
-CMSISLIB = ${CURDIR}/CMSIS/Lib/GCC
-
-# ChibiOS versions of system calls
-ALLCSRC := $(CHIBIOS)/os/various/syscalls.c
-
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
-include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
-include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-# BOARD files.
-include $(CONFDIR)/board/board.mk
-# PORTAB files.
-include $(CONFDIR)/portab.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
-include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in AUTOBUILD_ROOT recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-include $(CHIBIOS)/os/various/shell/shell.mk
-include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk
-
-# Define linker script file here
-LDSCRIPT= $(CONFDIR)/STM32F413xH.ld
-
-#$(info $$ALLCSRC is [${ALLCSRC}])
-#$(info $$CONFDIR is [${CONFDIR}])
-#$(info $$ALLINC is [${ALLINC}])
-
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(TESTSRC) \
-       main.c \
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC)
-
-# C sources to be compiled in ARM mode regardless of the global setting.
-# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
-#       option that results in lower performance and larger code size.
-ACSRC =
-
-# C++ sources to be compiled in ARM mode regardless of the global setting.
-# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
-#       option that results in lower performance and larger code size.
-ACPPSRC =
-
-# C sources to be compiled in THUMB mode regardless of the global setting.
-# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
-#       option that results in lower performance and larger code size.
-TCSRC =
-
-# C sources to be compiled in THUMB mode regardless of the global setting.
-# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
-#       option that results in lower performance and larger code size.
-TCPPSRC =
-
-# List ASM source files here
-ASMSRC = $(ALLASMSRC)
-ASMXSRC = $(ALLXASMSRC)
-
-INCDIR = $(ALLINC) $(TESTINC)
-#$(info $$INCDIR is [${INCDIR}])
-#
-# Project, sources and paths
-##############################################################################
-
-##############################################################################
-# Compiler settings
-#
-
-MCU  = cortex-m4
-
-#TRGT = arm-elf-
-TRGT = arm-none-eabi-
-CC   = $(TRGT)gcc
-CPPC = $(TRGT)g++
-# Enable loading with g++ only if you need C++ runtime support.
-# NOTE: You can use C++ even without C++ support if you are careful. C++
-#       runtime support makes code size explode.
-LD   = $(TRGT)gcc
-#LD   = $(TRGT)g++
-CP   = $(TRGT)objcopy
-AS   = $(TRGT)gcc -x assembler-with-cpp
-AR   = $(TRGT)ar
-OD   = $(TRGT)objdump
-SZ   = $(TRGT)size
-HEX  = $(CP) -O ihex
-BIN  = $(CP) -O binary
-
-# ARM-specific options here
-AOPT =
-
-# THUMB-specific options here
-TOPT = -mthumb -DTHUMB
-
-# Define C warning options here
-CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
-
-# Define C++ warning options here
-CPPWARN = -Wall -Wextra -Wundef
-
-#
-# Compiler settings
-##############################################################################
-
-##############################################################################
-# Start of user section
-#
-
-# List all user C define here, like -D_DEBUG=1
-UDEFS = -D_GNU_SOURCE -DARM_MATH_CM4 -DSHELL_CMD_TEST_ENABLED=0 \
-		-DSHELL_CMD_EXIT_ENABLED=1 -DUSB_TRACE_LEVEL=5 \
-		-DSHELL_CMD_MEM_ENABLED=0
-		# -DDISABLE_HW_WATCHDOG=1
-
-# Define ASM defines here
-UADEFS =
-
-# List all user directories here
-UINCDIR = $(CMSISINC)
-
-# List the user directory to look for the libraries here
-ULIBDIR = $(CMSISLIB)
-
-# List all user libraries here
-ULIBS = -lm $(CMSISLIB)/libarm_cortexM4l_math.a
-
-#
-# End of user defines
-##############################################################################
-
-RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC
-include $(RULESPATH)/rules.mk
-
-burn-$(PROJECT):
-	st-flash write build/$(PROJECT)/$(PROJECT).bin 0x08000000
-
+##############################################################################
+# Build global options
+# NOTE: Can be overridden externally.
+#
+
+# Compiler options here.
+ifeq ($(USE_OPT),)
+  USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16
+endif
+
+# C specific options here (added to USE_OPT).
+ifeq ($(USE_COPT),)
+  USE_COPT = -std=c11
+endif
+
+# C++ specific options here (added to USE_OPT).
+ifeq ($(USE_CPPOPT),)
+  USE_CPPOPT = -fno-rtti
+endif
+
+# Enable this if you want the linker to remove unused code and data
+ifeq ($(USE_LINK_GC),)
+  USE_LINK_GC = yes
+endif
+
+# Linker extra moptions here.
+ifeq ($(USE_LDOPT),)
+  USE_LDOPT = 
+endif
+
+# Enable this if you want link time optimizations (LTO)
+ifeq ($(USE_LTO),)
+  USE_LTO = yes
+endif
+
+# If enabled, this option allows to compile the application in THUMB mode.
+ifeq ($(USE_THUMB),)
+  USE_THUMB = yes
+endif
+
+# Enable this if you want to see the full log while compiling.
+ifeq ($(USE_VERBOSE_COMPILE),)
+  USE_VERBOSE_COMPILE = no
+endif
+
+# If enabled, this option makes the build process faster by not compiling
+# modules not used in the current configuration.
+ifeq ($(USE_SMART_BUILD),)
+  USE_SMART_BUILD = yes
+endif
+
+#
+# Build global options
+##############################################################################
+
+##############################################################################
+# Architecture or project specific options
+#
+
+# Stack size to be allocated to the Cortex-M process stack. This stack is
+# the stack used by the main() thread.
+ifeq ($(USE_PROCESS_STACKSIZE),)
+  USE_PROCESS_STACKSIZE = 0x1000
+endif
+
+# Stack size to the allocated to the Cortex-M main/exceptions stack. This
+# stack is used for processing interrupts and exceptions.
+ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
+  USE_EXCEPTIONS_STACKSIZE = 0x5000
+endif
+
+# Enables the use of FPU (no, softfp, hard).
+ifeq ($(USE_FPU),)
+  USE_FPU = hard
+  USE_FPU_OPT = -mfloat-abi=$(USE_FPU) \
+   -mfpu=fpv4-sp-d16 -fsingle-precision-constant
+endif
+
+#
+# Architecture or project specific options
+##############################################################################
+
+##############################################################################
+# Project, sources and paths
+#
+
+# Define project name here
+PROJECT = pp10a
+
+# Imported source files and paths
+CHIBIOS = ChibiOS
+CONFDIR := ${CURDIR}/cfg/$(PROJECT)
+BUILDDIR := ${CURDIR}/build/$(PROJECT)
+DEPDIR := ${CURDIR}/.dep/$(PROJECT)
+CMSISINC = ${CURDIR}/CMSIS/include
+CMSISLIB = ${CURDIR}/CMSIS/Lib/GCC
+
+# ChibiOS versions of system calls
+ALLCSRC := $(CHIBIOS)/os/various/syscalls.c
+
+# Licensing files.
+include $(CHIBIOS)/os/license/license.mk
+# Startup files.
+include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
+# HAL-OSAL files (optional).
+include $(CHIBIOS)/os/hal/hal.mk
+include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
+include $(CHIBIOS)/os/hal/osal/rt/osal.mk
+# BOARD files.
+include $(CONFDIR)/board/board.mk
+# PORTAB files.
+include $(CONFDIR)/portab.mk
+# RTOS files (optional).
+include $(CHIBIOS)/os/rt/rt.mk
+include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
+# Auto-build files in AUTOBUILD_ROOT recursively.
+include $(CHIBIOS)/tools/mk/autobuild.mk
+# Other files (optional).
+include $(CHIBIOS)/test/lib/test.mk
+include $(CHIBIOS)/test/rt/rt_test.mk
+include $(CHIBIOS)/test/oslib/oslib_test.mk
+include $(CHIBIOS)/os/hal/lib/streams/streams.mk
+include $(CHIBIOS)/os/various/shell/shell.mk
+include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk
+
+# Define linker script file here
+LDSCRIPT= $(CONFDIR)/STM32F413xH.ld
+
+#$(info $$ALLCSRC is [${ALLCSRC}])
+#$(info $$CONFDIR is [${CONFDIR}])
+#$(info $$ALLINC is [${ALLINC}])
+
+# C sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CSRC = $(ALLCSRC) \
+       $(TESTSRC) \
+       main.c \
+
+# C++ sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CPPSRC = $(ALLCPPSRC)
+
+# C sources to be compiled in ARM mode regardless of the global setting.
+# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
+#       option that results in lower performance and larger code size.
+ACSRC =
+
+# C++ sources to be compiled in ARM mode regardless of the global setting.
+# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
+#       option that results in lower performance and larger code size.
+ACPPSRC =
+
+# C sources to be compiled in THUMB mode regardless of the global setting.
+# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
+#       option that results in lower performance and larger code size.
+TCSRC =
+
+# C sources to be compiled in THUMB mode regardless of the global setting.
+# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
+#       option that results in lower performance and larger code size.
+TCPPSRC =
+
+# List ASM source files here
+ASMSRC = $(ALLASMSRC)
+ASMXSRC = $(ALLXASMSRC)
+
+INCDIR = $(ALLINC) $(TESTINC)
+#$(info $$INCDIR is [${INCDIR}])
+#
+# Project, sources and paths
+##############################################################################
+
+##############################################################################
+# Compiler settings
+#
+
+MCU  = cortex-m4
+
+#TRGT = arm-elf-
+TRGT = arm-none-eabi-
+CC   = $(TRGT)gcc
+CPPC = $(TRGT)g++
+# Enable loading with g++ only if you need C++ runtime support.
+# NOTE: You can use C++ even without C++ support if you are careful. C++
+#       runtime support makes code size explode.
+LD   = $(TRGT)gcc
+#LD   = $(TRGT)g++
+CP   = $(TRGT)objcopy
+AS   = $(TRGT)gcc -x assembler-with-cpp
+AR   = $(TRGT)ar
+OD   = $(TRGT)objdump
+SZ   = $(TRGT)size
+HEX  = $(CP) -O ihex
+BIN  = $(CP) -O binary
+
+# ARM-specific options here
+AOPT =
+
+# THUMB-specific options here
+TOPT = -mthumb -DTHUMB
+
+# Define C warning options here
+CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
+
+# Define C++ warning options here
+CPPWARN = -Wall -Wextra -Wundef
+
+#
+# Compiler settings
+##############################################################################
+
+##############################################################################
+# Start of user section
+#
+
+# List all user C define here, like -D_DEBUG=1
+UDEFS = -D_GNU_SOURCE -DARM_MATH_CM4 -DSHELL_CMD_TEST_ENABLED=0 \
+		-DSHELL_CMD_EXIT_ENABLED=1 -DUSB_TRACE_LEVEL=5 \
+		-DSHELL_CMD_MEM_ENABLED=0
+		# -DDISABLE_HW_WATCHDOG=1
+
+# Define ASM defines here
+UADEFS =
+
+# List all user directories here
+UINCDIR = $(CMSISINC)
+
+# List the user directory to look for the libraries here
+ULIBDIR = $(CMSISLIB)
+
+# List all user libraries here
+ULIBS = -lm $(CMSISLIB)/libarm_cortexM4l_math.a
+
+#
+# End of user defines
+##############################################################################
+
+RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC
+include $(RULESPATH)/rules.mk
+
+burn-$(PROJECT):
+	st-flash write build/$(PROJECT)/$(PROJECT).bin 0x08000000
+
diff --git a/tracker/software/make/pp10b.make b/tracker/software/make/pp10b.make
index a3095376..56aad51a 100644
--- a/tracker/software/make/pp10b.make
+++ b/tracker/software/make/pp10b.make
@@ -239,4 +239,4 @@ include $(RULESPATH)/rules.mk
 
 burn-$(PROJECT):
 	st-flash write build/$(PROJECT)/$(PROJECT).bin 0x08000000
-
+
diff --git a/tracker/software/source/config/config.andreas b/tracker/software/source/config/config.andreas
new file mode 100644
index 00000000..a94181f5
--- /dev/null
+++ b/tracker/software/source/config/config.andreas
@@ -0,0 +1,197 @@
+/**
+ * Put your configuration settings here. See description of all fields in types.h
+ */
+
+
+#include "config.h"
+#include "aprs.h"
+#include "geofence.h"
+
+conf_t conf_sram;
+
+const conf_t conf_flash_default = {
+    // Primary position app
+    .pos_pri = {
+        .beacon = {
+            .active = false,
+            .cycle = TIME_S2I(60 * 5),
+            .init_delay = TIME_S2I(60),
+            .fixed = false // Add lat, lon, alt fields when enabling fixed
+        },
+        .radio_conf = {
+            .pwr = 0x1F,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
+            .cca = 0x4F,
+        },
+        // App identity
+        .call = "DL0CPS-11",
+        .path = "WIDE1-1",
+        .symbol = SYM_BALLOON,
+        .aprs_msg = true, // Enable APRS message reception on this app
+    },
+
+    // Secondary position app
+    .pos_sec = {
+        .beacon = {
+            .active = false,
+            .cycle = TIME_S2I(60 * 30), // Beacon interval
+            .init_delay = TIME_S2I(60),
+            .fixed = true, // Add lat, lon alt fields when enabling fixed
+            .lat = -337331175, // Degrees (expressed in 1e-7 form)
+            .lon = 1511143478, // Degrees (expressed in 1e-7 form)
+            .alt = 144 // Altitude in metres
+        },
+        .radio_conf = {
+            .pwr = 0x7F,
+            .freq = FREQ_APRS_RECEIVE,
+            .mod = MOD_AFSK,
+            .cca = 0x4F
+        },
+        // App identity
+        .call = "DL0CPS-5",
+        .path = "WIDE2-1",
+        .symbol = SYM_DIGIPEATER,
+        .aprs_msg = false, // Enable APRS message reception on this app
+    },
+
+    // Primary image app
+    .img_pri = {
+        .svc_conf = {
+            .active = false,
+            .cycle = TIME_S2I(60 * 5),
+            .init_delay = TIME_S2I(60 * 1),
+            .send_spacing = TIME_S2I(5)
+        },
+        .radio_conf = {
+            .pwr = 0x7F,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
+            .cca = 0x4F
+
+        },
+        // App identity
+        .call = "DL0CPS-15",
+        .path = "",
+
+        // Image settings
+        .res = RES_VGA,
+        .quality = 4,
+        .buf_size = 40 * 1024,
+        .redundantTx = false
+    },
+
+    // Secondary image app
+    .img_sec = {
+        .svc_conf = {
+            .active = false,
+            .cycle = TIME_S2I(60 * 15),
+            .init_delay = TIME_S2I(15 * 1),
+            .send_spacing = TIME_S2I(2)
+        },
+        .radio_conf = {
+            .pwr = 0x1F,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
+            .cca = 0x4F
+        },
+        // App identity
+        .call = "DL0CPS-12",
+        .path = "",
+
+        // Image settings
+        .res = RES_QVGA,
+        .quality = 4,
+        .buf_size = 15 * 1024,
+        .redundantTx = false
+    },
+
+    // Log app
+    .log = {
+        .svc_conf = {
+            .active = false,
+            .cycle = TIME_S2I(10),
+            .init_delay = TIME_S2I(5)
+        },
+        .radio_conf = {
+            .pwr = 0x7F,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
+            .cca = 0x4F
+        },
+        // Node identity
+        .call = "DL0CPS-11",
+        .path = "WIDE1-1",
+        .density = 10
+    },
+
+    // APRS app
+    .aprs = {
+        // The receive identity for APRS
+        .rx = {
+             .svc_conf = {
+                 // The packet receive service is enabled if true
+                 // Receive is paused and resumed by transmission
+                 .active = true,
+                 .init_delay = TIME_S2I(20)
+             },
+            // Receive radio configuration
+            .radio_conf = {
+                .freq = 144840000,
+                .mod = MOD_AFSK,
+                .rssi = 0x3F
+            },
+            // APRS identity used in message responses if digipeat is not enabled
+            .call = "DL0CPS-4",
+            .symbol = SYM_ANTENNA
+        },
+        .aprs_msg = false, // Set true to enable messages to be accepted on RX call sign
+        .digi = true,
+        .tx = {
+           // Transmit radio configuration
+           .radio_conf = {
+               .freq = FREQ_APRS_RECEIVE,
+               .pwr = 0x7F,
+               .mod = MOD_AFSK,
+               .cca = 0x4F
+           },
+           // Digipeat transmission identity
+           .call = "VK2GJ-5",
+           .path = "WIDE2-1",
+           .symbol = SYM_DIGIPEATER,
+           // A digipeater beacon can be added using one of the POS apps
+           // Set the POS identity the same as the dipipeater TX identity
+           // Alternatively the digipeater can have its own .beacon entry here
+       },
+    },
+
+    // Global controls
+
+    // Power control
+    .keep_cam_switched_on = false,
+    .gps_on_vbat = 3600, // mV
+    .gps_off_vbat = 3400, // mV
+    .gps_onper_vbat = 4000, // mV
+
+    // GPS altitude model control (air pressure controlled using on-board BME280)
+    .gps_pressure = 90000, // Air pressure (Pa) threshold for alt model switch
+    .gps_low_alt = GPS_STATIONARY,
+    .gps_high_alt = GPS_AIRBORNE_1G,
+
+    // APRS
+    // How often to send telemetry config (global for beacons)
+    .tel_enc_cycle = TIME_S2I(60 * 60 * 2),
+
+    // The default APRS frequency when geofence is not resolved
+    .freq = 144860000,
+
+    // The base station identity.
+    .base = {
+        // If enabled tracker initiated APRS messages are addressed to this call sign
+       .enabled = true,
+       .call = "DL0CPS-7",
+       .path = "WIDE2-1",
+    },
+
+    .magic = CONFIG_MAGIC_DEFAULT // Do not remove. This is the activation bit.
+};
diff --git a/tracker/software/source/config/config.c b/tracker/software/source/config/config.c
index e30315bc..7f1101db 100644
--- a/tracker/software/source/config/config.c
+++ b/tracker/software/source/config/config.c
@@ -48,7 +48,7 @@ const conf_t conf_flash_default = {
             .mod = MOD_AFSK,
             .cca = 0x4F
         },
-        // App identity
+        // App identity
         .call = "VK2GJ-5",
         .path = "WIDE2-1",
         .symbol = SYM_DIGIPEATER,
@@ -65,8 +65,8 @@ const conf_t conf_flash_default = {
         },
         .radio_conf = {
             .pwr = 0x7F,
-            .freq = FREQ_GEOFENCE,
-            .mod = MOD_AFSK,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
             .cca = 0x5F
 
         },
@@ -75,7 +75,7 @@ const conf_t conf_flash_default = {
         .path = "",
 
         // Image settings
-        .res = RES_QVGA,
+        .res = RES_VGA,
         .quality = 4,
         .buf_size = 50 * 1024,
         .redundantTx = false
@@ -85,15 +85,15 @@ const conf_t conf_flash_default = {
     .img_sec = {
         .svc_conf = {
             .active = false,
-            .cycle = TIME_S2I(60 * 5),
-            .init_delay = TIME_S2I(15 * 1),
-            .send_spacing = TIME_S2I(2)
+            .cycle = CYCLE_CONTINUOUSLY,
+            .init_delay = TIME_S2I(60),
+            .send_spacing = TIME_S2I(10)
         },
         .radio_conf = {
-            .pwr = 0x1F,
-            .freq = FREQ_APRS_AUSTRALIA,
-            .mod = MOD_AFSK,
-            .cca = 0x4F
+            .pwr = 0x7F,
+            .freq = 144860000,
+            .mod = MOD_2FSK,
+            .cca = 0x5F
         },
         // App identity
         .call = "VK2GJ-12",
@@ -139,9 +139,9 @@ const conf_t conf_flash_default = {
             .radio_conf = {
                 .freq = FREQ_APRS_AUSTRALIA,
                 .mod = MOD_AFSK,
-                .rssi = 0x3F
+                .rssi = 0x5F
             },
-            // APRS identity used in message responses if digipeat is not enabled
+            // APRS identity used in message responses if digipeat is not enabled
             .call = "VK2GJ-4",
             .symbol = SYM_ANTENNA
         },
@@ -153,7 +153,7 @@ const conf_t conf_flash_default = {
                .freq = FREQ_RX_APRS,
                .pwr = 0x7F,
                .mod = MOD_AFSK,
-               .cca = 0x4F
+               .cca = 0x5F
            },
            // Digipeat transmission identity
            .call = "VK2GJ-5",
@@ -169,9 +169,9 @@ const conf_t conf_flash_default = {
 
     // Power control
     .keep_cam_switched_on = false,
-    .gps_on_vbat = 3600, // mV
-    .gps_off_vbat = 3400, // mV
-    .gps_onper_vbat = 4000, // mV
+    .gps_on_vbat = 3300, // mV
+    .gps_off_vbat = 3000, // mV
+    .gps_onper_vbat = 3500, // mV
 
     // GPS altitude model control (air pressure controlled using on-board BME280)
     .gps_pressure = 90000, // Air pressure (Pa) threshold for alt model switch
@@ -180,7 +180,7 @@ const conf_t conf_flash_default = {
 
     // APRS
     // How often to send telemetry config (global for beacons)
-    .tel_enc_cycle = TIME_S2I(60 * 60 * 2),
+    .tel_enc_cycle = TIME_S2I(3600),
 
     // The default APRS frequency when geofence is not resolved
     .freq = FREQ_APRS_EUROPE,
diff --git a/tracker/software/source/config/config.h b/tracker/software/source/config/config.h
index 820c7b2a..6e66fe5b 100644
--- a/tracker/software/source/config/config.h
+++ b/tracker/software/source/config/config.h
@@ -1,15 +1,15 @@
-#ifndef __CONFIG_H__
-#define __CONFIG_H__
-
-#define TRACE_TIME					TRUE		/* Enables time tracing on debugging port */
-#define TRACE_FILE					TRUE		/* Enables file and line tracing on debugging port */
-
-#include "types.h"
-
-#define CONFIG_MAGIC_DEFAULT        0x41583235
-#define CONFIG_MAGIC_UPDATED        0x46583235
-
-extern conf_t conf_sram;
-extern const conf_t conf_flash_default;
-
-#endif /* __CONFIG_H__ */
+#ifndef __CONFIG_H__
+#define __CONFIG_H__
+
+#define TRACE_TIME					TRUE		/* Enables time tracing on debugging port */
+#define TRACE_FILE					TRUE		/* Enables file and line tracing on debugging port */
+
+#include "types.h"
+
+#define CONFIG_MAGIC_DEFAULT        0x41583235
+#define CONFIG_MAGIC_UPDATED        0x46583235
+
+extern conf_t conf_sram;
+extern const conf_t conf_flash_default;
+
+#endif /* __CONFIG_H__ */
diff --git a/tracker/software/source/config/sleep.c b/tracker/software/source/config/sleep.c
index 98a8c7ce..7c600ea0 100644
--- a/tracker/software/source/config/sleep.c
+++ b/tracker/software/source/config/sleep.c
@@ -1,72 +1,72 @@
-#include "ch.h"
-#include "hal.h"
-#include "sleep.h"
-#include "padc.h"
-#include "collector.h"
-#include "debug.h"
-#include "padc.h"
-#include "pac1720.h"
-
-/**
-  * Sleeping method. Returns true if sleeping condition are given.
-  */
-bool p_sleep(const sleep_conf_t *config)
-{
-	switch(config->type)
-	{
-		case SLEEP_WHEN_VBAT_BELOW_THRES:
-			return stm32_get_vbat() < config->vbat_thres;
-
-		case SLEEP_WHEN_VSOL_BELOW_THRES:
-			return stm32_get_vsol() < config->vsol_thres;
-
-		case SLEEP_WHEN_VBAT_ABOVE_THRES:
-			return stm32_get_vbat() > config->vbat_thres;
-
-		case SLEEP_WHEN_VSOL_ABOVE_THRES:
-			return stm32_get_vsol() > config->vsol_thres;
-
-		case SLEEP_WHEN_DISCHARGING:
-		case SLEEP_WHEN_CHARGING:
-			TRACE_WARN("Sleeping method not implemented");
-			return false;
-
-		case SLEEP_DISABLED:
-			return false;
-	}
-	return false;
-}
-
-sysinterval_t waitForTrigger(sysinterval_t prev, sysinterval_t timeout)
-{
-	/*switch(config->type)
-	{
-		case TRIG_NEW_POINT: // Wait for new data point
-			waitForNewDataPoint();
-			return chVTGetSystemTimeX();
-		
-		case TRIG_TIMEOUT: // Wait for specified timeout
-			return chThdSleepUntilWindowed(prev, prev + TIME_S2I(config->timeout));
-
-		case TRIG_CONTINUOUSLY: // Immediate trigger
-			return chVTGetSystemTimeX();
-
-		case TRIG_ONCE: // No trigger defined
-			chThdSleep(TIME_S2I(10));
-	}
-
-	return chVTGetSystemTimeX();*/
-
-	return chThdSleepUntilWindowed(prev, prev + timeout);
-}
-
-void trigger_new_data_point(void)
-{
-	uint32_t oldID = getLastDataPoint()->id;
-	dataPoint_t *newtp;
-	do { // Wait for new serial ID to be deployed
-		chThdSleep(TIME_MS2I(100));
-		newtp = getLastDataPoint();
-	} while(newtp->id == oldID);
-}
-
+#include "ch.h"
+#include "hal.h"
+#include "sleep.h"
+#include "padc.h"
+#include "collector.h"
+#include "debug.h"
+#include "padc.h"
+#include "pac1720.h"
+
+/**
+  * Sleeping method. Returns true if sleeping condition are given.
+  */
+bool p_sleep(const sleep_conf_t *config)
+{
+	switch(config->type)
+	{
+		case SLEEP_WHEN_VBAT_BELOW_THRES:
+			return stm32_get_vbat() < config->vbat_thres;
+
+		case SLEEP_WHEN_VSOL_BELOW_THRES:
+			return stm32_get_vsol() < config->vsol_thres;
+
+		case SLEEP_WHEN_VBAT_ABOVE_THRES:
+			return stm32_get_vbat() > config->vbat_thres;
+
+		case SLEEP_WHEN_VSOL_ABOVE_THRES:
+			return stm32_get_vsol() > config->vsol_thres;
+
+		case SLEEP_WHEN_DISCHARGING:
+		case SLEEP_WHEN_CHARGING:
+			TRACE_WARN("Sleeping method not implemented");
+			return false;
+
+		case SLEEP_DISABLED:
+			return false;
+	}
+	return false;
+}
+
+sysinterval_t waitForTrigger(sysinterval_t prev, sysinterval_t timeout)
+{
+	/*switch(config->type)
+	{
+		case TRIG_NEW_POINT: // Wait for new data point
+			waitForNewDataPoint();
+			return chVTGetSystemTimeX();
+		
+		case TRIG_TIMEOUT: // Wait for specified timeout
+			return chThdSleepUntilWindowed(prev, prev + TIME_S2I(config->timeout));
+
+		case TRIG_CONTINUOUSLY: // Immediate trigger
+			return chVTGetSystemTimeX();
+
+		case TRIG_ONCE: // No trigger defined
+			chThdSleep(TIME_S2I(10));
+	}
+
+	return chVTGetSystemTimeX();*/
+
+	return chThdSleepUntilWindowed(prev, prev + timeout);
+}
+
+void trigger_new_data_point(void)
+{
+	uint32_t oldID = getLastDataPoint()->id;
+	dataPoint_t *newtp;
+	do { // Wait for new serial ID to be deployed
+		chThdSleep(TIME_MS2I(100));
+		newtp = getLastDataPoint();
+	} while(newtp->id == oldID);
+}
+
diff --git a/tracker/software/source/config/sleep.h b/tracker/software/source/config/sleep.h
index b5268140..e3122159 100644
--- a/tracker/software/source/config/sleep.h
+++ b/tracker/software/source/config/sleep.h
@@ -1,17 +1,17 @@
-#ifndef __SLEEP_H__
-#define __SLEEP_H__
-
-#include "ch.h"
-#include "hal.h"
-#include "types.h"
-
-#define WAIT_FOR_DATA_POINT		trigger_new_data_point
-#define TX_CONTINUOSLY			trigger_immediately
-
-bool p_sleep(const sleep_conf_t *config);
-sysinterval_t waitForTrigger(sysinterval_t prev, sysinterval_t timeout);
-void trigger_new_data_point(void);
-void trigger_immediately(void);
-
-#endif /* __SLEEP_H__ */
-
+#ifndef __SLEEP_H__
+#define __SLEEP_H__
+
+#include "ch.h"
+#include "hal.h"
+#include "types.h"
+
+#define WAIT_FOR_DATA_POINT		trigger_new_data_point
+#define TX_CONTINUOSLY			trigger_immediately
+
+bool p_sleep(const sleep_conf_t *config);
+sysinterval_t waitForTrigger(sysinterval_t prev, sysinterval_t timeout);
+void trigger_new_data_point(void);
+void trigger_immediately(void);
+
+#endif /* __SLEEP_H__ */
+
diff --git a/tracker/software/source/config/types.h b/tracker/software/source/config/types.h
index 5c5cbdab..494334d1 100644
--- a/tracker/software/source/config/types.h
+++ b/tracker/software/source/config/types.h
@@ -50,7 +50,7 @@ typedef enum { // Modulation type
     MOD_NONE,
 	MOD_AFSK,
 	MOD_2FSK
-} mod_t;
+} radio_mod_t;
 
 typedef enum {
 	RES_NONE = 0,
@@ -66,7 +66,7 @@ typedef enum {
 typedef struct {
   radio_pwr_t       pwr;
   radio_freq_t      freq;
-  mod_t             mod;
+  radio_mod_t             mod;
   link_speed_t      speed;
   union {
     radio_squelch_t   cca;
@@ -77,14 +77,14 @@ typedef struct {
 typedef struct {
   radio_pwr_t       pwr;
   radio_freq_t      freq;
-  mod_t             mod;
+  radio_mod_t             mod;
   link_speed_t      speed;
   radio_squelch_t   cca;
 } radio_tx_conf_t; // Radio / Modulation
 
 typedef struct {
   radio_freq_t      freq;
-  mod_t             mod;
+  radio_mod_t             mod;
   link_speed_t      speed;
   radio_squelch_t   rssi;
 } radio_rx_conf_t; // Radio / Modulation
diff --git a/tracker/software/source/drivers/si446x.c b/tracker/software/source/drivers/si446x.c
index ac8e8198..dc23e871 100644
--- a/tracker/software/source/drivers/si446x.c
+++ b/tracker/software/source/drivers/si446x.c
@@ -1063,7 +1063,7 @@ bool Si446x_receiveNoLock(const radio_unit_t radio,
                           channel_hz_t step,
                           radio_ch_t channel,
                           radio_squelch_t rssi,
-                          mod_t mod) {
+                          radio_mod_t mod) {
 
   radio_freq_t op_freq = pktComputeOperatingFrequency(radio, freq,
                                                       step, channel,
@@ -1123,7 +1123,7 @@ bool Si4464_enableReceive(const radio_unit_t radio,
                           const channel_hz_t rx_step,
                           const radio_ch_t rx_chan,
                           const radio_squelch_t rx_rssi,
-                          const mod_t rx_mod) {
+                          const radio_mod_t rx_mod) {
 
   /* Get an absolute operating frequency in Hz. */
   radio_freq_t op_freq = pktComputeOperatingFrequency(radio,
diff --git a/tracker/software/source/drivers/si446x.h b/tracker/software/source/drivers/si446x.h
index 94d11175..397da6f6 100644
--- a/tracker/software/source/drivers/si446x.h
+++ b/tracker/software/source/drivers/si446x.h
@@ -316,13 +316,13 @@ extern "C" {
                             channel_hz_t rx_step,
                             radio_ch_t rx_chan,
                             radio_squelch_t rx_rssi,
-                            mod_t rx_mod);
+                            radio_mod_t rx_mod);
   bool Si446x_receiveNoLock(const radio_unit_t radio,
                             radio_freq_t rx_frequency,
                             channel_hz_t rx_step,
                             radio_ch_t chan,
                             radio_squelch_t rssi,
-                            mod_t mod);
+                            radio_mod_t mod);
   void Si446x_lockRadio(const radio_mode_t mode);
   void Si446x_unlockRadio(const radio_mode_t mode);
   void Si446x_lockRadioByCamera(void);
diff --git a/tracker/software/source/drivers/usb/debug.c b/tracker/software/source/drivers/usb/debug.c
index 3d46cb0e..4e143281 100644
--- a/tracker/software/source/drivers/usb/debug.c
+++ b/tracker/software/source/drivers/usb/debug.c
@@ -1,15 +1,67 @@
 #include "ch.h"
 #include "hal.h"
 #include "debug.h"
+#include "portab.h"
 
-//mutex_t trace_mtx; // Used internal to synchronize multiple chprintf in debug.h
+mutex_t mtx; // Used internal to synchronize multiple chprintf in debug.h
 
 char error_list[ERROR_LIST_SIZE][ERROR_LIST_LENGTH];
 uint8_t error_counter;
 
+static const SerialConfig debug_config = {
+	115200,
+	0,
+	0,
+	0
+};
+
 #ifdef USB_TRACE_LEVEL
 uint8_t usb_trace_level = USB_TRACE_LEVEL; // Set in makefile UDEFS
 #else
 uint8_t usb_trace_level = 2; // Level: Errors + Warnings
 #endif
 
+
+void debug_init(void) {
+	chMtxObjectInit(&mtx);
+
+	sdStart(&SD3, &debug_config);
+	palSetLineMode(LINE_IO_TXD, PAL_MODE_ALTERNATE(7));
+	palSetLineMode(LINE_IO_RXD, PAL_MODE_ALTERNATE(7));
+}
+
+void debug_print(char *type, char* filename, uint32_t line, char* format, ...)
+{
+	chMtxLock(&mtx);
+
+	uint8_t str[256];
+
+	va_list args;
+	va_start(args, format);
+	chsnprintf((char*)str, sizeof(str), format, args);
+	va_end(args);
+
+
+	if(isConsoleOutputAvailable()) {
+		if(TRACE_TIME) {
+			chprintf((BaseSequentialStream*)&SDU1, "[%8d.%03d]", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000);
+		}
+		chprintf((BaseSequentialStream*)&SDU1, "[%s]", type);
+		if(TRACE_FILE) {
+			chprintf((BaseSequentialStream*)&SDU1, "[%12s %04d]", filename, line);
+		}
+		chprintf((BaseSequentialStream*)&SDU1, " %s\r\n", str);
+	}
+
+	if(TRACE_TIME) {
+		chprintf((BaseSequentialStream*)&SD3, "[%8d.%03d]", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000);
+	}
+	chprintf((BaseSequentialStream*)&SD3, "[%s]", type);
+	if(TRACE_FILE) {
+		chprintf((BaseSequentialStream*)&SD3, "[%12s %04d]", filename, line);
+	}
+	chprintf((BaseSequentialStream*)&SD3, " %s\r\n", str);
+
+	chMtxUnlock(&mtx);
+}
+
diff --git a/tracker/software/source/drivers/usb/debug.h b/tracker/software/source/drivers/usb/debug.h
index 86965230..ed4bbeca 100644
--- a/tracker/software/source/drivers/usb/debug.h
+++ b/tracker/software/source/drivers/usb/debug.h
@@ -17,40 +17,15 @@
 
 extern char error_list[ERROR_LIST_SIZE][ERROR_LIST_LENGTH];
 extern uint8_t error_counter;
-extern mutex_t trace_mtx;
-extern const SerialConfig uart_config;
 extern uint8_t usb_trace_level;
 
-// Initializer for serial debug and LEDs
-/*
-#define DEBUG_INIT() { \
-	chMtxObjectInit(&trace_mtx); \
-}
-*/
-
-#define TRACE_BASE(format, type, args...) { \
-	if(isConsoleOutputAvailable()) { \
-		if(TRACE_TIME) { \
-			chprintf((BaseSequentialStream*)&SDU1, "[%8d.%03d]", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000); \
-		} \
-		chprintf((BaseSequentialStream*)&SDU1, "[%s]", type); \
-		if(TRACE_FILE) { \
-			chprintf((BaseSequentialStream*)&SDU1, "[%12s %04d]", __FILENAME__, __LINE__); \
-		} \
-		chprintf((BaseSequentialStream*)&SDU1, " "); \
-		chprintf((BaseSequentialStream*)&SDU1, (format), ##args); \
-		chprintf((BaseSequentialStream*)&SDU1, "\r\n"); \
-		chThdSleep(TIME_MS2I(10)); \
-	} \
-}
-
-#define TRACE_DEBUG(format, args...) if(usb_trace_level > 4) { TRACE_BASE(format, "DEBUG", ##args) }
-#define TRACE_INFO(format, args...)  if(usb_trace_level > 3) { TRACE_BASE(format, "     ", ##args) }
-#define TRACE_MON(format, args...)  if(usb_trace_level > 2) { TRACE_BASE(format, "     ", ##args) }
-#define TRACE_WARN(format, args...)  if(usb_trace_level > 1) { TRACE_BASE(format, "WARN ", ##args) }
+#define TRACE_DEBUG(format, args...) if(usb_trace_level > 4) { debug_print("DEBUG", __FILENAME__, __LINE__, format, ##args); }
+#define TRACE_INFO(format, args...)  if(usb_trace_level > 3) { debug_print("     ", __FILENAME__, __LINE__, format, ##args); }
+#define TRACE_MON(format, args...)  if(usb_trace_level > 2) { debug_print("     ", __FILENAME__, __LINE__, format, ##args); }
+#define TRACE_WARN(format, args...)  if(usb_trace_level > 1) { debug_print("WARN ", __FILENAME__, __LINE__, format, ##args); }
 #define TRACE_ERROR(format, args...) { \
 	if(usb_trace_level > 0) { \
-		TRACE_BASE(format, "ERROR", ##args); \
+		debug_print("ERROR", __FILENAME__, __LINE__, format, ##args); \
 	} \
 	\
 	uint8_t strcnt = chsnprintf(error_list[error_counter], ERROR_LIST_LENGTH, "[%8d.%03d] ", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000); \
@@ -68,28 +43,6 @@ extern uint8_t usb_trace_level;
 #define TRACE_TAB "              "
 #endif
 
-/*
-#define TRACE_BIN(data, len) { \
-	chMtxLock(&trace_mtx); \
-	chprintf((BaseSequentialStream*)&SD3, "[%8d.%03d][DEBUG] ", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000); \
-	chprintf((BaseSequentialStream*)&SD3, "     > Binary data (%d bits)\r\n", (len)); \
-	for(uint32_t i=0; i<((len)+7)/8; i+=8) \
-		chprintf((BaseSequentialStream*)&SD3, "%s 0x%03x ... 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\r\n", \
-		TRACE_TAB, i, (data)[i], (data)[i+1], (data)[i+2], (data)[i+3], (data)[i+4], (data)[i+5], (data)[i+6], (data)[i+7]); \
-	chMtxUnlock(&trace_mtx); \
-}
-
-#define TRACE_BIN_CHAR(data, len) { \
-	chMtxLock(&trace_mtx); \
-	chprintf((BaseSequentialStream*)&SD3, "[%8d.%03d][DEBUG] ", chVTGetSystemTime()/CH_CFG_ST_FREQUENCY, (chVTGetSystemTime()*1000/CH_CFG_ST_FREQUENCY)%1000); \
-	chprintf((BaseSequentialStream*)&SD3, "     > Binary data (%d bits)\r\n", (len)); \
-	for(uint32_t i=0; i<((len)+7)/8; i+=8) \
-		chprintf((BaseSequentialStream*)&SD3, "%s %c%c%c%c%c%c%c%c\r\n", \
-		TRACE_TAB, i, (data)[i], (data)[i+1], (data)[i+2], (data)[i+3], (data)[i+4], (data)[i+5], (data)[i+6], (data)[i+7]); \
-	chMtxUnlock(&trace_mtx); \
-}
-*/
-
 
 /*
 #if USE_CCM_FOR_PKT_POOL == TRUE
@@ -110,5 +63,8 @@ static inline heap_header_t *pktSystemCheck(void) {
 }
 #endif
 
+void debug_init(void);
+void debug_print(char *type, char* filename, uint32_t line, char* format, ...);
+
 #endif /* __TRACE_H__ */
 
diff --git a/tracker/software/source/packet/managers/pktradio.c b/tracker/software/source/packet/managers/pktradio.c
index 0c05e976..85f1825e 100644
--- a/tracker/software/source/packet/managers/pktradio.c
+++ b/tracker/software/source/packet/managers/pktradio.c
@@ -1053,7 +1053,7 @@ bool pktLLDradioResumeReceive(const radio_unit_t radio) {
   channel_hz_t step = handler->radio_rx_config.step_hz;
   radio_ch_t chan = handler->radio_rx_config.channel;
   radio_squelch_t rssi = handler->radio_rx_config.squelch;
-  mod_t mod = handler->radio_rx_config.type;
+  radio_mod_t mod = handler->radio_rx_config.type;
   bool result = Si4464_enableReceive(radio, freq, step, chan, rssi, mod);
   return result;
 }
@@ -1185,4 +1185,45 @@ uint8_t pktLLDradioReadCCA(const radio_unit_t radio) {
   return Si446x_readCCA(radio);
 }
 
+/**
+ *
+ */
+void pktLLDradioConfigIndicators(const radio_unit_t radio) {
+  (void)radio;
+}
+
+/**
+ *
+ */
+void pktLLDradioDeconfigIndicators(const radio_unit_t radio) {
+  (void)radio;
+}
+
+/**
+ *
+ */
+void pktLLDradioSetIndicator(const radio_unit_t radio,
+                             radio_indicator_t ind) {
+  (void)radio;
+  (void)ind;
+}
+
+/**
+ *
+ */
+void pktLLDradioClearIndicator(const radio_unit_t radio,
+                               radio_indicator_t ind) {
+  (void)radio;
+  (void)ind;
+}
+
+/**
+ *
+ */
+void pktLLDradioToggleIndicator(const radio_unit_t radio,
+                                radio_indicator_t ind) {
+  (void)radio;
+  (void)ind;
+}
+
 /** @} */
diff --git a/tracker/software/source/packet/managers/pktradio.h b/tracker/software/source/packet/managers/pktradio.h
index a0c9af6c..5e1b8f38 100644
--- a/tracker/software/source/packet/managers/pktradio.h
+++ b/tracker/software/source/packet/managers/pktradio.h
@@ -38,6 +38,13 @@
 /* Module data structures and types.                                         */
 /*===========================================================================*/
 
+typedef enum radioIndicators {
+  PKT_INDICATOR_DECODE,
+  PKT_INDICATOR_SQUELCH,
+  PKT_INDICATOR_FIFO,
+  PKT_INDICATOR_OVERFLOW
+} radio_indicator_t;
+
 #include "pkttypes.h"
 
 /**
@@ -61,27 +68,27 @@ typedef enum radioCommand {
 typedef struct radioTask radio_task_object_t;
 typedef struct packetHandlerData packet_svc_t;
 typedef struct radioConfig radio_config_t;
-typedef struct radioSettings radio_settings_t;
-typedef struct radioAction radio_action_t;
+//typedef struct radioSettings radio_settings_t;
+//typedef struct radioAction radio_action_t;
 
 /**
- * @brief           Radio task notification callback type.
+ * @brief   Radio task notification callback type.
  *
- * @param[in] rcob  pointer to a @p radio task object
+ * @param[in] task_object  pointer to a @p radio task object
  */
 typedef void (*radio_task_cb_t)(radio_task_object_t *task_object);
 
 #include "ax25_pad.h"
 
-struct radioSettings {
-  mod_t                     type;
+typedef struct radioSettings {
+  radio_mod_t                     type;
   radio_freq_t              base_frequency;
   channel_hz_t              step_hz;
   radio_ch_t                channel;
   radio_squelch_t           squelch;
-};
+} radio_settings_t;
 
-struct radioAction {
+typedef struct radioAction {
   radio_command_t           command;
   radio_task_cb_t           callback;
   msg_t                     result;
@@ -89,12 +96,12 @@ struct radioAction {
   char                      tx_thd_name[16];
   packet_svc_t              *handler;
   packet_t                  packet_out;
-};
+} radio_action_t;
 
-struct radioTaskx {
+/*struct radioTaskx {
   radio_settings_t          settings;
   radio_action_t            action;
-};
+};*/
 
 /**
  * @brief       Radio task object.
@@ -104,7 +111,7 @@ struct radioTask {
   /* For safety keep clear - where pool stores its free link. */
   struct pool_header        link;
   radio_command_t           command;
-  mod_t                     type;
+  radio_mod_t               type;
   radio_freq_t              base_frequency;
   channel_hz_t              step_hz;
   radio_ch_t                channel;
@@ -120,10 +127,30 @@ struct radioTask {
 };
 
 /*===========================================================================*/
-/* External declarations.                                                    */
+/* Module macros.                                                            */
 /*===========================================================================*/
 
-//extern const ICUConfig pwm_icucfg;
+/**
+ * @brief   Alias of pktStopDecoder for convenience.
+ *
+ * @param[in] radio radio unit ID
+ *
+ * @api
+ */
+#define pktPauseDecoding(radio) pktStopDecoder(radio)
+
+/**
+ * @brief   Alias for convenience of pktStartDecoder.
+ *
+ * @param[in] radio radio unit ID
+ *
+ * @api
+ */
+#define pktResumeDecoding(radio) pktStartDecoder(radio)
+
+/*===========================================================================*/
+/* External declarations.                                                    */
+/*===========================================================================*/
 
 #ifdef __cplusplus
 extern "C" {
@@ -181,6 +208,14 @@ extern "C" {
             	 	                        size_t size);
   const radio_config_t	*pktGetRadioData(radio_unit_t radio);
   uint8_t           pktLLDradioReadCCA(const radio_unit_t radio);
+  void              pktLLDradioConfigIndicators(const radio_unit_t radio);
+  void              pktLLDradioDeconfigIndicators(const radio_unit_t radio);
+  void              pktLLDradioSetIndicator(const radio_unit_t radio,
+                               radio_indicator_t ind);
+  void              pktLLDradioClearIndicator(const radio_unit_t radio,
+                                 radio_indicator_t ind);
+  void              pktLLDradioToggleIndicator(const radio_unit_t radio,
+                                  radio_indicator_t ind);
 #ifdef __cplusplus
 }
 #endif
@@ -189,24 +224,6 @@ extern "C" {
 /* Module inline functions.                                                  */
 /*===========================================================================*/
 
-/**
- * @brief   Alias of pktStopDecoder for convenience.
- *
- * @param[in] radio radio unit ID
- *
- * @api
- */
-#define pktPauseDecoding(radio) pktStopDecoder(radio)
-
-/**
- * @brief   Alias for convenience of pktStartDecoder.
- *
- * @param[in] radio radio unit ID
- *
- * @api
- */
-#define pktResumeDecoding(radio) pktStartDecoder(radio)
-
 #endif /* PKT_MANAGERS_PKTRADIO_H_ */
 
 /** @} */
diff --git a/tracker/software/source/packet/managers/pktservice.h b/tracker/software/source/packet/managers/pktservice.h
index 6db264e2..5649db45 100644
--- a/tracker/software/source/packet/managers/pktservice.h
+++ b/tracker/software/source/packet/managers/pktservice.h
@@ -53,7 +53,7 @@ typedef enum HDLCFrameStates {
 #include "types.h"
 
 /* Link level encoding type. */
-typedef mod_t encoding_type_t;
+typedef radio_mod_t encoding_type_t;
 
 #include "pktradio.h"
 
diff --git a/tracker/software/source/packet/protocols/aprs/aprs.h b/tracker/software/source/packet/protocols/aprs/aprs.h
index 86b0aa44..3356054e 100644
--- a/tracker/software/source/packet/protocols/aprs/aprs.h
+++ b/tracker/software/source/packet/protocols/aprs/aprs.h
@@ -69,7 +69,7 @@ typedef struct APRSIdentity {
   /* Radio parameters. */
   radio_freq_t      freq;
   radio_pwr_t       pwr;
-  mod_t             mod;
+  radio_mod_t             mod;
   radio_squelch_t   cca;
 } aprs_identity_t;
 
diff --git a/tracker/software/source/threads/rxtx/radio.c b/tracker/software/source/threads/rxtx/radio.c
index 071e406b..08e84315 100644
--- a/tracker/software/source/threads/rxtx/radio.c
+++ b/tracker/software/source/threads/rxtx/radio.c
@@ -104,7 +104,7 @@ void start_aprs_threads(radio_unit_t radio, radio_freq_t base_freq,
  */
 bool transmitOnRadio(packet_t pp, const radio_freq_t base_freq,
                      const channel_hz_t step, radio_ch_t chan,
-                     const radio_pwr_t pwr, const mod_t mod,
+                     const radio_pwr_t pwr, const radio_mod_t mod,
                      const radio_squelch_t cca) {
   /* Select a radio by frequency. */
   radio_unit_t radio = pktSelectRadioForFrequency(base_freq,
diff --git a/tracker/software/source/threads/rxtx/radio.h b/tracker/software/source/threads/rxtx/radio.h
index 5de1c86e..7906e6cf 100644
--- a/tracker/software/source/threads/rxtx/radio.h
+++ b/tracker/software/source/threads/rxtx/radio.h
@@ -1,34 +1,34 @@
-#ifndef __RADIO_H__
-#define __RADIO_H__
-
-#include "ch.h"
-#include "hal.h"
-#include "config.h"
-#include "ax25_pad.h"
-#include "pktconf.h"
-
-// APRS region frequencies
-#define APRS_FREQ_OTHER				144800000
-#define APRS_FREQ_AMERICA			144390000
-#define APRS_FREQ_CHINA				144640000
-#define APRS_FREQ_JAPAN				144660000
-#define APRS_FREQ_SOUTHKOREA		144620000
-#define APRS_FREQ_SOUTHEASTASIA		144390000
-#define APRS_FREQ_AUSTRALIA			145175000
-#define APRS_FREQ_NEWZEALAND		144575000
-#define APRS_FREQ_ARGENTINA			144930000
-#define APRS_FREQ_BRAZIL			145575000
-
-void start_aprs_threads(radio_unit_t radio, radio_freq_t freq, channel_hz_t step,
-                     radio_ch_t chan, radio_squelch_t rssi);
-bool transmitOnRadio(packet_t pp, radio_freq_t freq, channel_hz_t step,
-                     radio_ch_t chan, radio_pwr_t pwr, mod_t mod,
-                     radio_squelch_t rssi);
-
-inline const char *getModulation(uint8_t key) {
-    const char *val[] = {"NONE", "AFSK", "2FSK"};
-    return val[key];
-};
-
-#endif /* __RADIO_H__ */
-
+#ifndef __RADIO_H__
+#define __RADIO_H__
+
+#include "ch.h"
+#include "hal.h"
+#include "config.h"
+#include "ax25_pad.h"
+#include "pktconf.h"
+
+// APRS region frequencies
+#define APRS_FREQ_OTHER				144800000
+#define APRS_FREQ_AMERICA			144390000
+#define APRS_FREQ_CHINA				144640000
+#define APRS_FREQ_JAPAN				144660000
+#define APRS_FREQ_SOUTHKOREA		144620000
+#define APRS_FREQ_SOUTHEASTASIA		144390000
+#define APRS_FREQ_AUSTRALIA			145175000
+#define APRS_FREQ_NEWZEALAND		144575000
+#define APRS_FREQ_ARGENTINA			144930000
+#define APRS_FREQ_BRAZIL			145575000
+
+void start_aprs_threads(radio_unit_t radio, radio_freq_t freq, channel_hz_t step,
+                     radio_ch_t chan, radio_squelch_t rssi);
+bool transmitOnRadio(packet_t pp, radio_freq_t freq, channel_hz_t step,
+                     radio_ch_t chan, radio_pwr_t pwr, radio_mod_t mod,
+                     radio_squelch_t rssi);
+
+inline const char *getModulation(uint8_t key) {
+    const char *val[] = {"NONE", "AFSK", "2FSK"};
+    return val[key];
+};
+
+#endif /* __RADIO_H__ */
+
diff --git a/tracker/software/source/threads/threads.c b/tracker/software/source/threads/threads.c
index 16463b05..e660a31c 100644
--- a/tracker/software/source/threads/threads.c
+++ b/tracker/software/source/threads/threads.c
@@ -24,21 +24,8 @@ void start_essential_threads(void)
 }
 
 void start_user_threads(void) {
-	conf_t *conf_flash = (conf_t*)0x08060000;
-	/* Check if a user update has been made to configuration in flash. */
-	if(conf_flash->magic != CONFIG_MAGIC_UPDATED) {
-	    if(conf_flash->magic != CONFIG_MAGIC_DEFAULT
-	    || memcmp(&conf_flash, &conf_flash_default, sizeof(conf_t)) != 0) {
-        /* No configuration found in flash memory or default config has changed. */
-          flashSectorBegin(flashSectorAt((uint32_t)conf_flash));
-          flashErase((uint32_t)conf_flash, 0x20000);
-          flashWrite((uint32_t)conf_flash, (char*)&conf_flash_default, sizeof(conf_t));
-          flashSectorEnd(flashSectorAt((uint32_t)conf_flash));
-      }
-	}
-
 	// Copy 
-	memcpy(&conf_sram, conf_flash, sizeof(conf_t));
+	memcpy(&conf_sram, &conf_flash_default, sizeof(conf_t));
 
 	/* TODO: Implement scheduler that will run threads based on schedule. */
 	if(conf_sram.pos_pri.beacon.active)