diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject
index 478607546..921b03ba1 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject
@@ -41,7 +41,7 @@
 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply" useByScannerDiscovery="false" value="true" valueType="boolean"/>
 							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.ilp32" valueType="enumerated"/>
 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1851994667" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
-							<builder buildPath="${workspace_loc:/miv-rv32im-freertos-port-test}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1748717066" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
+							<builder buildPath="${workspace_loc:/miv-rv32im-freertos-port-test}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1748717066" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
 							<tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1205277158" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1853992692" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.1786331150" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>
@@ -49,6 +49,7 @@
 							<tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">
 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1818715770" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/full_demo/common_demo_tasks/include}&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32}&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/drivers/CoreGPIO}&quot;"/>
@@ -60,7 +61,7 @@
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/riscv_hal}&quot;"/>
 								</option>
 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.43291576" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
-									<listOptionValue builtIn="false" value="MSCC_STDIO_THRU_CORE_UART_APB"/>
+									<listOptionValue builtIn="false" value="NOT_MSCC_STDIO_THRU_CORE_UART_APB"/>
 								</option>
 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1901773760" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>
 							</tool>
@@ -121,5 +122,9 @@
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
-	<storageModule moduleId="refreshScope"/>
+	<storageModule moduleId="refreshScope" versionNumber="2">
+		<configuration configurationName="Debug">
+			<resource resourceType="PROJECT" workspacePath="/RTOSDemo"/>
+		</configuration>
+	</storageModule>
 </cproject>
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project
index d89cebcba..241c90a8d 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project
@@ -29,6 +29,51 @@
 			<type>2</type>
 			<locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>
 		</link>
+		<link>
+			<name>full_demo/common_demo_tasks</name>
+			<type>2</type>
+			<locationURI>virtual:/virtual</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/EventGroupsDemo.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/EventGroupsDemo.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/GenQTest.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/GenQTest.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/TaskNotify.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TaskNotify.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/TimerDemo.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TimerDemo.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/blocktim.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/blocktim.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/dynamic.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/dynamic.c</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/include</name>
+			<type>2</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>
+		</link>
+		<link>
+			<name>full_demo/common_demo_tasks/recmutex.c</name>
+			<type>1</type>
+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/recmutex.c</locationURI>
+		</link>
 	</linkedResources>
 	<filteredResources>
 		<filter>
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml
index 55a4eb27b..64e732cd8 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml
@@ -5,7 +5,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1033716199933845767" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-69680586271774334" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h
index 389ddafa1..d4520e4f5 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h
@@ -71,6 +71,8 @@
 #ifndef FREERTOS_CONFIG_H
 #define FREERTOS_CONFIG_H
 
+#include "hw_platform.h"
+#include "riscv_plic.h"
 
 /*-----------------------------------------------------------
  * Application specific definitions.
@@ -84,23 +86,19 @@
  * See http://www.freertos.org/a00110.html.
  *----------------------------------------------------------*/
 
-#include <stdint.h>
-#include <string.h>
-#include "riscv_plic.h"
-#include "hw_platform.h"
-
+#define configCLINT_BASE_ADDRESS		PRCI_BASE
 #define configUSE_PREEMPTION			1
 #define configUSE_IDLE_HOOK				0
-#define configUSE_TICK_HOOK				0
-#define configCPU_CLOCK_HZ			( ( unsigned long ) ( SYS_CLK_FREQ / 100UL ) ) /*_RB_ Seems to be a factor of 100 between machine timer frequency and CPU frequency. */
-#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
-#define configMAX_PRIORITIES		( 5 )
-#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 1024 )
-#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 100 * 1024 ) )
+#define configUSE_TICK_HOOK				1
+#define configCPU_CLOCK_HZ				( ( unsigned long ) ( SYS_CLK_FREQ / 100 ) ) /*_RB_ Seems to be a factor of 100 between machine timer frequency and CPU frequency. */
+#define configTICK_RATE_HZ				( ( TickType_t ) 1000 )
+#define configMAX_PRIORITIES			( 5 )
+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 140 ) /* Can be as low as 60 but some of the demo tasks that use tis constant require it to be higher. */
+#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 100 * 1024 ) )
 #define configMAX_TASK_NAME_LEN			( 16 )
-#define configUSE_TRACE_FACILITY		1
+#define configUSE_TRACE_FACILITY		0
 #define configUSE_16_BIT_TICKS			0
-#define configIDLE_SHOULD_YIELD			1
+#define configIDLE_SHOULD_YIELD			0
 #define configUSE_MUTEXES				1
 #define configQUEUE_REGISTRY_SIZE		8
 #define configCHECK_FOR_STACK_OVERFLOW	2
@@ -115,10 +113,10 @@
 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
 
 /* Software timer definitions. */
-#define configUSE_TIMERS				0
-#define configTIMER_TASK_PRIORITY		( 2 )
-#define configTIMER_QUEUE_LENGTH		2
-#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE )
+#define configUSE_TIMERS				1
+#define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )
+#define configTIMER_QUEUE_LENGTH		7
+#define configTIMER_TASK_STACK_DEPTH	( 120 )
 
 /* Task priorities.  Allow these to be overridden. */
 #ifndef uartPRIMARY_PRIORITY
@@ -135,16 +133,10 @@ to exclude the API function. */
 #define INCLUDE_vTaskDelayUntil			1
 #define INCLUDE_vTaskDelay				1
 #define INCLUDE_eTaskGetState			1
+#define INCLUDE_xTimerPendFunctionCall	1
 
 /* Normal assert() semantics without relying on the provision of an assert.h
 header file. */
-#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
-
-/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
-standard names - or at least those used in the unmodified vector table. */
-#define vPortSVCHandler SVCall_Handler
-#define xPortPendSVHandler PendSV_Handler
-#define vPortSysTickHandler SysTick_Handler
+#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); }
 
-extern void vApplicationMallocFailedHook();
 #endif /* FREERTOS_CONFIG_H */
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S
new file mode 100644
index 000000000..702454f5d
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S
@@ -0,0 +1,260 @@
+/*
+ * FreeRTOS Kernel V10.1.1
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+
+	.extern ulRegTest1LoopCounter
+	.extern ulRegTest2LoopCounter
+
+	.global vRegTest1Implementation
+	.global vRegTest2Implementation
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The register check tasks are described in the comments at the top of
+ * main_full.c.
+ */
+
+vRegTest1Implementation:
+
+	/* Fill the core registers with known values. */
+	li x5, 0x5
+	li x6, 0x6
+	li x7, 0x7
+	li x8, 0x8
+	li x9, 0x9
+	li x10, 0xa
+	li x11, 0xb
+	li x12, 0xc
+	li x13, 0xd
+	li x14, 0xe
+	li x15, 0xf
+	li x16, 0x10
+	li x17, 0x11
+	li x18, 0x12
+	li x19, 0x13
+	li x20, 0x14
+	li x21, 0x15
+	li x22, 0x16
+	li x23, 0x17
+	li x24, 0x18
+	li x25, 0x19
+	li x26, 0x1a
+	li x27, 0x1b
+	li x28, 0x1c
+	li x29, 0x1d
+	li x30, 0x1e
+
+reg1_loop:
+
+	/* Check each register still contains the expected known value.
+	vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation
+	uses x5 as the temporary. */
+	li x31, 0x5
+	bne x31, x5, reg1_error_loop
+	li x31, 0x6
+	bne x31, x6, reg1_error_loop
+	li x31, 0x7
+	bne x31, x7, reg1_error_loop
+	li x31, 0x8
+	bne x31, x8, reg1_error_loop
+	li x31, 0x9
+	bne x31, x9, reg1_error_loop
+	li x31, 0xa
+	bne x31, x10, reg1_error_loop
+	li x31, 0xb
+	bne x31, x11, reg1_error_loop
+	li x31, 0xc
+	bne x31, x12, reg1_error_loop
+	li x31, 0xd
+	bne x31, x13, reg1_error_loop
+	li x31, 0xe
+	bne x31, x14, reg1_error_loop
+	li x31, 0xf
+	bne x31, x15, reg1_error_loop
+	li x31, 0x10
+	bne x31, x16, reg1_error_loop
+	li x31, 0x11
+	bne x31, x17, reg1_error_loop
+	li x31, 0x12
+	bne x31, x18, reg1_error_loop
+	li x31, 0x13
+	bne x31, x19, reg1_error_loop
+	li x31, 0x14
+	bne x31, x20, reg1_error_loop
+	li x31, 0x15
+	bne x31, x21, reg1_error_loop
+	li x31, 0x16
+	bne x31, x22, reg1_error_loop
+	li x31, 0x17
+	bne x31, x23, reg1_error_loop
+	li x31, 0x18
+	bne x31, x24, reg1_error_loop
+	li x31, 0x19
+	bne x31, x25, reg1_error_loop
+	li x31, 0x1a
+	bne x31, x26, reg1_error_loop
+	li x31, 0x1b
+	bne x31, x27, reg1_error_loop
+	li x31, 0x1c
+	bne x31, x28, reg1_error_loop
+	li x31, 0x1d
+	bne x31, x29, reg1_error_loop
+	li x31, 0x1e
+	bne x31, x30, reg1_error_loop
+
+	/* Everything passed, increment the loop counter. */
+	lw x31, ulRegTest1LoopCounterConst
+	lw x30, 0(x31)
+	addi x30, x30, 1
+	sw x30, 0(x31)
+
+	/* Restore clobbered register reading for next loop. */
+	li x30, 0x1e
+
+	/* Yield to increase code coverage. */
+	ecall
+
+	/* Start again. */
+	jal reg1_loop
+
+reg1_error_loop:
+	/* Jump here if a register contains an uxpected value.  This stops the loop
+	counter being incremented so the check task knows an error was found. */
+	jal reg1_error_loop
+
+ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter
+
+/*-----------------------------------------------------------*/
+
+vRegTest2Implementation:
+
+	/* Fill the core registers with known values. */
+	li x6, 0x61
+	li x7, 0x71
+	li x8, 0x81
+	li x9, 0x91
+	li x10, 0xa1
+	li x11, 0xb1
+	li x12, 0xc1
+	li x13, 0xd1
+	li x14, 0xe1
+	li x15, 0xf1
+	li x16, 0x20
+	li x17, 0x21
+	li x18, 0x22
+	li x19, 0x23
+	li x20, 0x24
+	li x21, 0x25
+	li x22, 0x26
+	li x23, 0x27
+	li x24, 0x28
+	li x25, 0x29
+	li x26, 0x2a
+	li x27, 0x2b
+	li x28, 0x2c
+	li x29, 0x2d
+	li x30, 0x2e
+	li x31, 0x2f
+
+Reg2_loop:
+
+	/* Check each register still contains the expected known value.
+	vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation
+	uses x31 as the temporary. */
+	li x5, 0x61
+	bne x5, x6, reg2_error_loop
+	li x5, 0x71
+	bne x5, x7, reg2_error_loop
+	li x5, 0x81
+	bne x5, x8, reg2_error_loop
+	li x5, 0x91
+	bne x5, x9, reg2_error_loop
+	li x5, 0xa1
+	bne x5, x10, reg2_error_loop
+	li x5, 0xb1
+	bne x5, x11, reg2_error_loop
+	li x5, 0xc1
+	bne x5, x12, reg2_error_loop
+	li x5, 0xd1
+	bne x5, x13, reg2_error_loop
+	li x5, 0xe1
+	bne x5, x14, reg2_error_loop
+	li x5, 0xf1
+	bne x5, x15, reg2_error_loop
+	li x5, 0x20
+	bne x5, x16, reg2_error_loop
+	li x5, 0x21
+	bne x5, x17, reg2_error_loop
+	li x5, 0x22
+	bne x5, x18, reg2_error_loop
+	li x5, 0x23
+	bne x5, x19, reg2_error_loop
+	li x5, 0x24
+	bne x5, x20, reg2_error_loop
+	li x5, 0x25
+	bne x5, x21, reg2_error_loop
+	li x5, 0x26
+	bne x5, x22, reg2_error_loop
+	li x5, 0x27
+	bne x5, x23, reg2_error_loop
+	li x5, 0x28
+	bne x5, x24, reg2_error_loop
+	li x5, 0x29
+	bne x5, x25, reg2_error_loop
+	li x5, 0x2a
+	bne x5, x26, reg2_error_loop
+	li x5, 0x2b
+	bne x5, x27, reg2_error_loop
+	li x5, 0x2c
+	bne x5, x28, reg2_error_loop
+	li x5, 0x2d
+	bne x5, x29, reg2_error_loop
+	li x5, 0x2e
+	bne x5, x30, reg2_error_loop
+	li x5, 0x2f
+	bne x5, x31, reg2_error_loop
+
+	/* Everything passed, increment the loop counter. */
+	lw x5, ulRegTest2LoopCounterConst
+	lw x6, 0(x5)
+	addi x6, x6, 1
+	sw x6, 0(x5)
+
+	/* Restore clobbered register reading for next loop. */
+	li x6, 0x61
+
+	/* Start again. */
+	jal Reg2_loop
+
+reg2_error_loop:
+	/* Jump here if a register contains an uxpected value.  This stops the loop
+	counter being incremented so the check task knows an error was found. */
+	jal reg2_error_loop
+
+ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter
+
+
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c
new file mode 100644
index 000000000..8bbad7c19
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c
@@ -0,0 +1,322 @@
+/*
+ * FreeRTOS Kernel V10.1.1
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+
+/******************************************************************************
+ * NOTE 1:  This project provides two demo applications.  A simple blinky style
+ * project, and a more comprehensive test and demo application.  The
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select
+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
+ * in main.c.  This file implements the comprehensive test and demo version.
+ *
+ * NOTE 2:  This file only contains the source code that is specific to the
+ * full demo.  Generic functions, such FreeRTOS hook functions, and functions
+ * required to configure the hardware, are defined in main.c.
+ *
+ ******************************************************************************
+ *
+ * main_full() creates all the demo application tasks and software timers, then
+ * starts the scheduler.  The web documentation provides more details of the
+ * standard demo application tasks, which provide no particular functionality,
+ * but do provide a good example of how to use the FreeRTOS API.
+ *
+ * In addition to the standard demo tasks, the following tasks and tests are
+ * defined and/or created within this file:
+ *
+ * "Reg test" tasks - These fill both the core registers with known values, then
+ * check that each register maintains its expected value for the lifetime of the
+ * task.  Each task uses a different set of values.  The reg test tasks execute
+ * with a very low priority, so get preempted very frequently.  A register
+ * containing an unexpected value is indicative of an error in the context
+ * switching mechanism.
+ *
+ * "Check" task - The check executes every three seconds.  It checks that all
+ * the standard demo tasks, and the register check tasks, are not only still
+ * executing, but are executing without reporting any errors.  If the check task
+ * discovers that a task has either stalled, or reported an error, then it
+ * prints an error message to the UART, otherwise it prints "Pass.".
+ */
+
+/* Standard includes. */
+#include <stdio.h>
+#include <string.h>
+
+/* Kernel includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "timers.h"
+#include "semphr.h"
+
+/* Standard demo application includes. */
+#include "dynamic.h"
+#include "blocktim.h"
+#include "GenQTest.h"
+#include "recmutex.h"
+#include "TimerDemo.h"
+#include "EventGroupsDemo.h"
+#include "TaskNotify.h"
+
+/* Priorities for the demo application tasks. */
+#define mainCHECK_TASK_PRIORITY				( configMAX_PRIORITIES - 1 )
+
+/* The period of the check task, in ms, converted to ticks using the
+pdMS_TO_TICKS() macro.  mainNO_ERROR_CHECK_TASK_PERIOD is used if no errors have
+been found, mainERROR_CHECK_TASK_PERIOD is used if an error has been found. */
+#define mainNO_ERROR_CHECK_TASK_PERIOD		pdMS_TO_TICKS( 3000UL )
+#define mainERROR_CHECK_TASK_PERIOD		pdMS_TO_TICKS( 500UL )
+
+/* Parameters that are passed into the register check tasks solely for the
+purpose of ensuring parameters are passed into tasks correctly. */
+#define mainREG_TEST_TASK_1_PARAMETER		( ( void * ) 0x12345678 )
+#define mainREG_TEST_TASK_2_PARAMETER		( ( void * ) 0x87654321 )
+
+/* The base period used by the timer test tasks. */
+#define mainTIMER_TEST_PERIOD				( 50 )
+
+/* The size of the stack allocated to the check task (as described in the
+comments at the top of this file. */
+#define mainCHECK_TASK_STACK_SIZE_WORDS 100
+
+/* Size of the stacks to allocated for the register check tasks. */
+#define mainREG_TEST_STACK_SIZE_WORDS 60
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Called by main() to run the full demo (as opposed to the blinky demo) when
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
+ */
+void main_full( void );
+
+/*
+ * The check task, as described at the top of this file.
+ */
+static void prvCheckTask( void *pvParameters );
+
+/*
+ * Register check tasks as described at the top of this file.  The nature of
+ * these files necessitates that they are written in an assembly file, but the
+ * entry points are kept in the C file for the convenience of checking the task
+ * parameter.
+ */
+static void prvRegTestTaskEntry1( void *pvParameters );
+extern void vRegTest1Implementation( void );
+static void prvRegTestTaskEntry2( void *pvParameters );
+extern void vRegTest2Implementation( void );
+
+/*
+ * Tick hook used by the full demo, which includes code that interacts with
+ * some of the tests.
+ */
+void vFullDemoTickHook( void );
+
+/*-----------------------------------------------------------*/
+
+/* The following two variables are used to communicate the status of the
+register check tasks to the check task.  If the variables keep incrementing,
+then the register check tasks have not discovered any errors.  If a variable
+stops incrementing, then an error has been found. */
+volatile uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
+
+/*-----------------------------------------------------------*/
+
+void main_full( void )
+{
+	/* Start all the other standard demo/test tasks.  They have no particular
+	functionality, but do demonstrate how to use the FreeRTOS API and test the
+	kernel port. */
+	vStartDynamicPriorityTasks();
+	vCreateBlockTimeTasks();
+//	vStartGenericQueueTasks( tskIDLE_PRIORITY );
+//	vStartRecursiveMutexTasks();
+//	vStartTimerDemoTask( mainTIMER_TEST_PERIOD );
+//	vStartEventGroupTasks();
+//	vStartTaskNotifyTask();
+
+	/* Create the register check tasks, as described at the top of this	file.
+	Use xTaskCreateStatic() to create a task using only statically allocated
+	memory. */
+//	xTaskCreate( prvRegTestTaskEntry1, 			/* The function that implements the task. */
+//				 "Reg1", 						/* The name of the task. */
+//				 mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */
+//				 mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */
+//				 tskIDLE_PRIORITY, 				/* Priority of the task. */
+//				 NULL );						/* Can be used to pass out a handle to the created task. */
+//	xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );
+
+	/* Create the task that performs the 'check' functionality,	as described at
+	the top of this file. */
+	xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );
+
+	/* Start the scheduler. */
+	vTaskStartScheduler();
+
+	/* If all is well, the scheduler will now be running, and the following
+	line will never be reached.  If the following line does execute, then
+	there was insufficient FreeRTOS heap memory available for the Idle and/or
+	timer tasks to be created.  See the memory management section on the
+	FreeRTOS web site for more details on the FreeRTOS heap
+	http://www.freertos.org/a00111.html. */
+	for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+static void prvCheckTask( void *pvParameters )
+{
+TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;
+TickType_t xLastExecutionTime;
+static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
+char * const pcPassMessage = "Pass.\r\n";
+char * pcStatusMessage = pcPassMessage;
+extern void vSendString( const char * const pcString );
+extern void vToggleLED( void );
+
+	/* Just to stop compiler warnings. */
+	( void ) pvParameters;
+
+	/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
+	works correctly. */
+	xLastExecutionTime = xTaskGetTickCount();
+
+	/* Cycle for ever, delaying then checking all the other tasks are still
+	operating without error.  The onboard LED is toggled on each iteration.
+	If an error is detected then the delay period is decreased from
+	mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the
+	effect of increasing the rate at which the onboard LED toggles, and in so
+	doing gives visual feedback of the system status. */
+	for( ;; )
+	{
+		/* Delay until it is time to execute again. */
+		vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );
+
+		/* Check all the demo tasks (other than the flash tasks) to ensure
+		that they are all still running, and that none have detected an error. */
+		if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
+		{
+			pcStatusMessage = "ERROR: Dynamic priority demo/tests.\r\n";
+		}
+
+		if ( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
+		{
+			pcStatusMessage = "ERROR: Block time demo/tests.\r\n";
+		}
+
+		if ( xAreGenericQueueTasksStillRunning() != pdTRUE )
+		{
+//			pcStatusMessage = "ERROR: Generic queue demo/tests.\r\n";
+		}
+
+		if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
+		{
+//			pcStatusMessage = "ERROR: Recursive mutex demo/tests.\r\n";
+		}
+
+		if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) != pdPASS )
+		{
+//			pcStatusMessage = "ERROR: Timer demo/tests.\r\n";
+		}
+
+		if( xAreEventGroupTasksStillRunning() != pdPASS )
+		{
+//			pcStatusMessage = "ERROR: Event group demo/tests.\r\n";
+		}
+
+		if( xAreTaskNotificationTasksStillRunning() != pdPASS )
+		{
+//			pcStatusMessage = "ERROR: Task notification demo/tests.\r\n";
+		}
+
+		/* Check that the register test 1 task is still running. */
+		if( ulLastRegTest1Value == ulRegTest1LoopCounter )
+		{
+//			pcStatusMessage = "ERROR: Register test 1.\r\n";
+		}
+		ulLastRegTest1Value = ulRegTest1LoopCounter;
+
+		/* Check that the register test 2 task is still running. */
+		if( ulLastRegTest2Value == ulRegTest2LoopCounter )
+		{
+//			pcStatusMessage = "ERROR: Register test 2.\r\n";
+		}
+		ulLastRegTest2Value = ulRegTest2LoopCounter;
+
+		/* Write the status message to the UART. */
+//		vSendString( pcStatusMessage );
+		vToggleLED();
+
+		/* If an error has been found then increase the LED toggle rate by
+		increasing the cycle frequency. */
+		if( pcStatusMessage != pcPassMessage )
+		{
+			xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;
+		}
+	}
+}
+/*-----------------------------------------------------------*/
+
+static void prvRegTestTaskEntry1( void *pvParameters )
+{
+	/* Although the regtest task is written in assembler, its entry point is
+	written in C for convenience of checking the task parameter is being passed
+	in correctly. */
+	if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )
+	{
+		/* Start the part of the test that is written in assembler. */
+		vRegTest1Implementation();
+	}
+
+	/* The following line will only execute if the task parameter is found to
+	be incorrect.  The check task will detect that the regtest loop counter is
+	not being incremented and flag an error. */
+	vTaskDelete( NULL );
+}
+/*-----------------------------------------------------------*/
+
+static void prvRegTestTaskEntry2( void *pvParameters )
+{
+	/* Although the regtest task is written in assembler, its entry point is
+	written in C for convenience of checking the task parameter is being passed
+	in correctly. */
+	if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )
+	{
+		/* Start the part of the test that is written in assembler. */
+		vRegTest2Implementation();
+	}
+
+	/* The following line will only execute if the task parameter is found to
+	be incorrect.  The check task will detect that the regtest loop counter is
+	not being incremented and flag an error. */
+	vTaskDelete( NULL );
+}
+/*-----------------------------------------------------------*/
+
+void vFullDemoTickHook( void )
+{
+	/* Called from vApplicationTickHook() when the project is configured to
+	build the full demo. */
+//	vTimerPeriodicISRTests();
+//	vPeriodicEventGroupsProcessing();
+}
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h
index c6d2aa4be..b56f10311 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h
@@ -34,7 +34,7 @@
  * This is the only clock brought over from the Mi-V Soft processor Libero design.
  */
 #ifndef SYS_CLK_FREQ
-#define SYS_CLK_FREQ                    50000000UL
+#define SYS_CLK_FREQ                    70000000UL
 #endif
 
 /***************************************************************************//**
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c
index c1582b7cb..be526c213 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c
@@ -1,93 +1,129 @@
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-#include "timers.h"
-
-#include "hw_platform.h"
-#include "riscv_hal.h"
-#include "hal.h"
-#include "core_gpio.h"
-#include "core_timer.h"
-#include "core_uart_apb.h"
-
-const char * g_hello_msg = "\r\nFreeRTOS Example\r\n";
-
-
 /*
- * Notes:
- * + Program the device using the flash project in
- *   MS-RISC-V\M2GL025-Creative-Board\Programming_The_Target_Device\PROC_SUBSYSTEM_MIV_RV32IMA_BaseDesign.
- *   See https://github.com/RISCV-on-Microsemi-FPGA/M2GL025-Creative-Board.
- * + Above referenced image sets the clock to 50MHz. *
- * + Debug configuration is critical.
+ * FreeRTOS Kernel V10.1.1
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
  */
 
+/* FreeRTOS kernel includes. */
+#include <FreeRTOS.h>
+#include <task.h>
 
-/* A block time of zero simply means "don't block". */
-#define mainDONT_BLOCK						( 0UL )
+/* Microsemi includes. */
+#include "core_uart_apb.h"
+#include "core_gpio.h"
 
 /******************************************************************************
- * CoreUARTapb instance data.
- *****************************************************************************/
-UART_instance_t g_uart;
-/*-----------------------------------------------------------*/
+ * This project provides two demo applications.  A simple blinky style project,
+ * and a more comprehensive test and demo application.  The
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to
+ * select between the two.  The simply blinky demo is implemented and described
+ * in main_blinky.c.  The more comprehensive test and demo application is
+ * implemented and described in main_full.c.
+ *
+ * This file implements the code that is not demo specific, including the
+ * hardware setup and standard FreeRTOS hook functions.
+ *
+ * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
+ * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
+ * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!
+ *
+ */
 
-static void vUartTestTask1( void *pvParameters );
-static void vUartTestTask2( void *pvParameters );
+/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,
+or 0 to run the more comprehensive test and demo application. */
+#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY	0
 
 /*
- * FreeRTOS hook for when malloc fails, enable in FreeRTOSConfig.
+ * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
+ * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
  */
+#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
+	extern void main_blinky( void );
+#else
+	extern void main_full( void );
+#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */
+
+/* Prototypes for the standard FreeRTOS callback/hook functions implemented
+within this file.  See https://www.freertos.org/a00016.html */
 void vApplicationMallocFailedHook( void );
-
-/*
- * FreeRTOS hook for when FreeRtos is idling, enable in FreeRTOSConfig.
- */
 void vApplicationIdleHook( void );
-
-/*
- * FreeRTOS hook for when a stack overflow occurs, enable in FreeRTOSConfig.
- */
 void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
+void vApplicationTickHook( void );
+
+/* Prepare haredware to run the demo. */
+static void prvSetupHardware( void );
 
-/*_RB_
-gpio_instance_t g_gpio0;
-gpio_instance_t g_gpio1;
-timer_instance_t g_timer0;
-timer_instance_t g_timer1;
+/* Send a messaage to the UART initialised in prvSetupHardware. */
+void vSendString( const char * const pcString );
 
+/*-----------------------------------------------------------*/
+
+/* The UART to which strings are output, and the GPIO used to toggle the LED. */
+static UART_instance_t g_uart;
+static gpio_instance_t g_gpio_out;
 
 /*-----------------------------------------------------------*/
-extern uint32_t SysTick_Config(uint32_t ticks);
-extern void __enable_irq(void);
 
 int main( void )
 {
-    PLIC_init();
-//_RB_    GPIO_init(&g_gpio0, COREGPIO_IN_BASE_ADDR, GPIO_APB_32_BITS_BUS);
-//_RB_    GPIO_init(&g_gpio1, COREGPIO_OUT_BASE_ADDR, GPIO_APB_32_BITS_BUS);
-
-    /**************************************************************************
-    * Initialize CoreUART with its base address, baud value, and line
-    * configuration.
-    *************************************************************************/
-    UART_init(&g_uart, COREUARTAPB0_BASE_ADDR, BAUD_VALUE_115200,
-             (DATA_8_BITS | NO_PARITY) );
+	prvSetupHardware();
 
-    UART_polled_tx_string( &g_uart, (const uint8_t *)"\r\n\r\n		Sample Demonstration of FreeRTOS port for Mi-V processor.\r\n\r\n" );
-    UART_polled_tx_string( &g_uart, (const uint8_t *)"		This project creates  two tasks and runs them at regular intervals.\r\n" );
+	/* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
+	of this file. */
+	#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
+	{
+		main_blinky();
+	}
+	#else
+	{
+		main_full();
+	}
+	#endif
+}
+/*-----------------------------------------------------------*/
 
-    /* Create the two test tasks. */
-	xTaskCreate( vUartTestTask1, "UArt1", 1000, NULL, uartPRIMARY_PRIORITY, NULL );
-//	xTaskCreate( vUartTestTask2, "UArt2", 1000, NULL, uartPRIMARY_PRIORITY, NULL );
+static void prvSetupHardware( void )
+{
+	PLIC_init();
+	UART_init( &g_uart, COREUARTAPB0_BASE_ADDR, BAUD_VALUE_115200, ( DATA_8_BITS | NO_PARITY ) );
+	GPIO_init( &g_gpio_out, COREGPIO_OUT_BASE_ADDR, GPIO_APB_32_BITS_BUS );
+}
+/*-----------------------------------------------------------*/
 
-	/* Start the kernel.  From here on, only tasks and interrupts will run. */
-	vTaskStartScheduler();
+void vToggleLED( void )
+{
+static uint32_t ulLEDState = 0;
 
-	/* Exit FreeRTOS */
-	return 0;
+	GPIO_set_outputs( &g_gpio_out, ulLEDState );
+	ulLEDState = !ulLEDState;
 }
+/*-----------------------------------------------------------*/
 
+void vSendString( const char * const pcString )
+{
+	UART_polled_tx_string( &g_uart, pcString );
+}
 /*-----------------------------------------------------------*/
 
 void vApplicationMallocFailedHook( void )
@@ -103,6 +139,7 @@ void vApplicationMallocFailedHook( void )
 	to query the size of free heap space that remains (although it does not
 	provide information on how the remaining heap might be fragmented). */
 	taskDISABLE_INTERRUPTS();
+	__asm volatile( "ebreak" );
 	for( ;; );
 }
 /*-----------------------------------------------------------*/
@@ -130,31 +167,18 @@ void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
 	configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook
 	function is called if a stack overflow is detected. */
 	taskDISABLE_INTERRUPTS();
+	__asm volatile( "ebreak" );
 	for( ;; );
 }
 /*-----------------------------------------------------------*/
 
-static void vUartTestTask1( void *pvParameters )
+void vApplicationTickHook( void )
 {
-	( void ) pvParameters;
-
-	for( ;; )
-	{
-		UART_polled_tx_string( &g_uart, (const uint8_t *)"Task - 1\r\n" );
-	    vTaskDelay( pdMS_TO_TICKS( 100 ) );
-	}
-}
-
-
-/*-----------------------------------------------------------*/
-
-static void vUartTestTask2( void *pvParameters )
-{
-	( void ) pvParameters;
-
-	for( ;; )
+	/* The tests in the full demo expect some interaction with interrupts. */
+	#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 )
 	{
-//		UART_polled_tx_string( &g_uart, (const uint8_t *)"Task - 2\r\n" );
-	    vTaskDelay(5);
+		extern void vFullDemoTickHook( void );
+		vFullDemoTickHook();
 	}
+	#endif
 }
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/entry.S b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/entry.S
index 6e3ef92a7..1a657feb4 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/entry.S
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/entry.S
@@ -24,6 +24,7 @@
 #endif
 
   .section      .text.entry
+  .extern vPortTrapHandler
   .globl _start
 
 _start:
@@ -33,10 +34,10 @@ nmi_vector:
   j nmi_vector
 
 trap_vector:
-  j trap_entry
+  j vPortTrapHandler
 
 handle_reset:
-  la t0, trap_entry
+  la t0, vPortTrapHandler
   csrw mtvec, t0
   csrwi mstatus, 0
   csrwi mie, 0
@@ -71,7 +72,7 @@ handle_reset:
   # perform the rest of initialization in C
   j _init
 
-
+#if 0
 trap_entry:
   addi sp, sp, -32*REGBYTES
 
@@ -155,6 +156,7 @@ trap_entry:
 
   addi sp, sp, 32*REGBYTES
   mret
+#endif /* 0 */
 
 #endif
 
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-igloo2.ld b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-igloo2.ld
index 11d069715..99d1c10dd 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-igloo2.ld
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-igloo2.ld
@@ -132,6 +132,7 @@ SECTIONS
     __stack_bottom = .;
     . += STACK_SIZE;
     __stack_top = .;
+    _sp = .;
   } > ram
 }
 
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-ram.ld b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-ram.ld
index d63709e68..47b77075f 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-ram.ld
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/microsemi-riscv-ram.ld
@@ -132,6 +132,7 @@ SECTIONS
     __stack_bottom = .;
     . += STACK_SIZE;
     __stack_top = .;
+    _sp = .;
   } > ram
 }
 
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_hal.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_hal.c
index f7be82c09..1bf02d6f0 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_hal.c
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_hal.c
@@ -1,3 +1,4 @@
+#if 0
 /*******************************************************************************
  * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.
  *
@@ -63,6 +64,7 @@ uint8_t External_31_IRQHandler(void);
  *
  */
 extern void Software_IRQHandler(void);
+extern void Timer_IRQHandle( void );
 
 /*------------------------------------------------------------------------------
  * Increment value for the mtimecmp register in order to achieve a system tick
@@ -115,15 +117,17 @@ uint32_t SysTick_Config(uint32_t ticks)
 /*------------------------------------------------------------------------------
  * RISC-V interrupt handler for machine timer interrupts.
  */
+volatile uint32_t ulTimerInterrupts = 0;
+extern void Timer_IRQHandler( void );
 static void handle_m_timer_interrupt(void)
 {
-    clear_csr(mie, MIP_MTIP);
+//    clear_csr(mie, MIP_MTIP);
 
-    SysTick_Handler();
+    Timer_IRQHandler();
 
-    PRCI->MTIMECMP[read_csr(mhartid)] = PRCI->MTIME + g_systick_increment;
+//    PRCI->MTIMECMP[read_csr(mhartid)] = PRCI->MTIME + g_systick_increment;
 
-    set_csr(mie, MIP_MTIP);
+//    set_csr(mie, MIP_MTIP);
 }
 
 /*------------------------------------------------------------------------------
@@ -194,8 +198,20 @@ static void handle_m_soft_interrupt(void)
 /*------------------------------------------------------------------------------
  * Trap/Interrupt handler
  */
+#define ENV_CALL_FROM_M_MODE 11
+extern void vTaskSwitchContext( void );
+
 uintptr_t handle_trap(uintptr_t mcause, uintptr_t mepc)
 {
+	/*_RB_*/
+	if( mcause == ENV_CALL_FROM_M_MODE )
+	{
+		vTaskSwitchContext();
+
+		/* Ensure not to return to the instruction that generated the exception. */
+		mepc += 4;
+	} else
+	/*end _RB_*/
     if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_EXT))
     {
         handle_m_ext_interrupt();
@@ -249,3 +265,4 @@ uintptr_t handle_trap(uintptr_t mcause, uintptr_t mepc)
 #ifdef __cplusplus
 }
 #endif
+#endif
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_plic.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_plic.h
index 2d0951891..b306c5bf0 100644
--- a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_plic.h
+++ b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/riscv_hal/riscv_plic.h
@@ -143,7 +143,7 @@ static inline void PLIC_init(void)
     PLIC->TARGET[hart_id].PRIORITY_THRESHOLD = 0;
 
     /* Enable machine external interrupts. */
-    set_csr(mie, MIP_MEIP);
+//    set_csr(mie, MIP_MEIP);
 }
 
 /*==============================================================================