diff --git a/barebones/Makefile b/blink/Makefile
similarity index 93%
rename from barebones/Makefile
rename to blink/Makefile
index 3f68c644f4c2c6697cd684611c0429b0e2437ffd..e38c49b49748f97a3f00922b5aa9185e19a452da 100644
--- a/barebones/Makefile
+++ b/blink/Makefile
@@ -1,4 +1,4 @@
-TARGET:=barebones
+TARGET:=blink
 
 all : flash
 
@@ -22,7 +22,7 @@ LDFLAGS:=-T $(EVT)/ch32v003.ld -Wl,--gc-sections
 
 SYSTEM_C:=$(EVT)/startup_ch32v00x.S $(EVT)/embedlibc.c
 
-$(TARGET).elf : barebones.c $(SYSTEM_C)
+$(TARGET).elf : $(TARGET).c $(SYSTEM_C)
 	$(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS)
 
 $(TARGET).bin : $(TARGET).elf
diff --git a/blink/blink.c b/blink/blink.c
new file mode 100644
index 0000000000000000000000000000000000000000..22d54e504a04ad597c5761b1e36ea466034e632d
--- /dev/null
+++ b/blink/blink.c
@@ -0,0 +1,46 @@
+// Could be defined here, or in the processor defines.
+#define SYSTEM_CORE_CLOCK 48000000
+
+#include "ch32v00x.h"
+#include <stdio.h>
+
+#define APB_CLOCK SYSTEM_CORE_CLOCK
+
+void SystemInit(void)
+{
+	// Values lifted from the EVT.  There is little to no documentation on what this does.
+	RCC->CTLR |= (uint32_t)0x00000001;
+	RCC->CFGR0 &= (uint32_t)0xFCFF0000;
+	RCC->CTLR &= (uint32_t)0xFEF6FFFF;
+	RCC->CTLR &= (uint32_t)0xFFFBFFFF;
+	RCC->CFGR0 &= (uint32_t)0xFFFEFFFF;
+	RCC->INTR = 0x009F0000;
+
+	// From SetSysClockTo_48MHZ_HSI
+	// This is some dark stuff.  But, I copy-pasted it and it seems towork.
+	FLASH->ACTLR = (FLASH->ACTLR & ((uint32_t)~FLASH_ACTLR_LATENCY)) | FLASH_ACTLR_LATENCY_1; 	// Flash 0 wait state
+	RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; 														// HCLK = SYSCLK = APB1
+	RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_PLLSRC)) ) | (uint32_t)(RCC_PLLSRC_HSI_Mul2); 	// PLL configuration: PLLCLK = HSI * 2 = 48 MHz
+	RCC->CTLR |= RCC_PLLON; 																	// Enable PLL
+	while((RCC->CTLR & RCC_PLLRDY) == 0);														// Wait till PLL is ready
+	RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_SW))) | (uint32_t)RCC_SW_PLL;					// Select PLL as system clock source
+	while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08);									// Wait till PLL is used as system clock source
+}
+
+int main()
+{
+	// Enable GPIOD.
+	RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;
+
+	// GPIO D0 Push-Pull, 10MHz Output
+	GPIOD->CFGLR &= ~(0xf<<(4*0));
+	GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0);
+
+	while(1)
+	{
+		GPIOD->BSHR = 1;	 // Turn on GPIOD0
+		Delay_Ms( 100 );
+		GPIOD->BSHR = 1<<16; // Turn off GPIOD0
+		Delay_Ms( 100 );
+	}
+}
diff --git a/fulldemo/Makefile b/fulldemo/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..5f1406e859a92fbee59c63590738ae19516f7d8e
--- /dev/null
+++ b/fulldemo/Makefile
@@ -0,0 +1,41 @@
+TARGET:=fulldemo
+
+all : flash
+
+PREFIX:=riscv64-unknown-elf
+
+GPIO_Toggle:=EXAM/GPIO/GPIO_Toggle/User
+
+EVT:=../ch32v003evt
+
+CFLAGS:= \
+	-g -Os -flto -ffunction-sections \
+	-static-libgcc -lgcc \
+	-march=rv32ec \
+	-mabi=ilp32e \
+	-I/usr/include/newlib \
+	-I$(EVT) \
+	-nostdlib \
+	-I.
+
+LDFLAGS:=-T $(EVT)/ch32v003.ld -Wl,--gc-sections
+
+SYSTEM_C:=$(EVT)/startup_ch32v00x.S $(EVT)/embedlibc.c
+
+$(TARGET).elf : $(TARGET).c $(SYSTEM_C)
+	$(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS)
+
+$(TARGET).bin : $(TARGET).elf
+	$(PREFIX)-size $^
+	$(PREFIX)-objdump -S $^ > $(TARGET).lst
+	$(PREFIX)-objdump -t $^ > $(TARGET).map
+	$(PREFIX)-objcopy -O binary $< $(TARGET).bin
+	$(PREFIX)-objcopy -O ihex $< $(TARGET).hex
+
+flash : $(TARGET).bin
+	make -C ../minichlink all
+	../minichlink/minichlink -w $< -r
+
+clean :
+	rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
+
diff --git a/barebones/barebones.c b/fulldemo/fulldemo.c
similarity index 95%
rename from barebones/barebones.c
rename to fulldemo/fulldemo.c
index f73159450ffd90d6f94b24de1ff3c05435998310..534e97793a13d1153754865ad41aab018be16fef 100644
--- a/barebones/barebones.c
+++ b/fulldemo/fulldemo.c
@@ -20,28 +20,6 @@ int _write(int fd, char *buf, int size)
     return size;
 }
 
-static inline void ConfigureDebugUART()
-{
-	// Configure UART for debugging.
-
-	// Push-Pull, 10MHz Output, GPIO D5, with AutoFunction
-	GPIOD->CFGLR &= ~(0xf<<(4*5));
-	GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*5);
-	
-	// 115200, 8n1.  Note if you don't specify a mode, UART remains off even when UE_Set.
-	USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx;
-	USART1->CTLR2 = USART_StopBits_1;
-	USART1->CTLR3 = USART_HardwareFlowControl_None;
-
-	#define UART_BAUD_RATE 115200
-	#define OVER8DIV 4
-	#define INTEGER_DIVIDER (((25 * (APB_CLOCK)) / (OVER8DIV * (UART_BAUD_RATE))))
-	#define FRACTIONAL_DIVIDER ((INTEGER_DIVIDER)%100)
-	USART1->BRR = ((INTEGER_DIVIDER / 100) << 4) | ((((FRACTIONAL_DIVIDER * (OVER8DIV*2)) + 50)/100)&7);
-	USART1->CTLR1 |= CTLR1_UE_Set;
-
-}
-
 void SystemInit(void)
 {
 	// Values lifted from the EVT.  There is little to no documentation on what this does.
@@ -61,14 +39,33 @@ void SystemInit(void)
 	while((RCC->CTLR & RCC_PLLRDY) == 0);														// Wait till PLL is ready
 	RCC->CFGR0 = ( RCC->CFGR0 & ((uint32_t)~(RCC_SW))) | (uint32_t)RCC_SW_PLL;					// Select PLL as system clock source
 	while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08);									// Wait till PLL is used as system clock source
-}
 
-int main()
-{
+	// Once clock is up and running, we can enable the UART for other debugging.
+
 	// Enable GPIOD and UART.
 	RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1;
+
+	// Push-Pull, 10MHz Output, GPIO D5, with AutoFunction
+	GPIOD->CFGLR &= ~(0xf<<(4*5));
+	GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*5);
 	
-	ConfigureDebugUART();
+	// 115200, 8n1.  Note if you don't specify a mode, UART remains off even when UE_Set.
+	USART1->CTLR1 = USART_WordLength_8b | USART_Parity_No | USART_Mode_Tx;
+	USART1->CTLR2 = USART_StopBits_1;
+	USART1->CTLR3 = USART_HardwareFlowControl_None;
+
+	#define UART_BAUD_RATE 115200
+	#define OVER8DIV 4
+	#define INTEGER_DIVIDER (((25 * (APB_CLOCK)) / (OVER8DIV * (UART_BAUD_RATE))))
+	#define FRACTIONAL_DIVIDER ((INTEGER_DIVIDER)%100)
+	USART1->BRR = ((INTEGER_DIVIDER / 100) << 4) | ((((FRACTIONAL_DIVIDER * (OVER8DIV*2)) + 50)/100)&7);
+	USART1->CTLR1 |= CTLR1_UE_Set;
+}
+
+int main()
+{
+	// Enable GPIOD.
+	RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;
 
 	// GPIO D0 Push-Pull, 10MHz Output
 	GPIOD->CFGLR &= ~(0xf<<(4*0));