--- a/src/host/lib/mars_task.c
+++ b/src/host/lib/mars_task.c
@@ -61,6 +61,7 @@ int mars_task_initialize(struct mars_con
 
 	int ret;
 	struct mars_task_context *task;
+	struct mars_workload_context *workload;
 	Elf32_Ehdr *ehdr = (Elf32_Ehdr *)elf_image;
 	Elf32_Phdr *phdr = (Elf32_Phdr *)((void *)ehdr + ehdr->e_phoff);
 
@@ -78,10 +79,12 @@ int mars_task_initialize(struct mars_con
 
 	/* begin process to add the task to the workload queue */
 	ret = workload_queue_add_begin(mars->workload_queue, &id->workload_id,
-				MARS_WORKLOAD_TYPE_TASK,
-				(struct mars_workload_context **)&task);
+				MARS_WORKLOAD_TYPE_TASK, &workload);
 	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 
+	/* cast workload context to task context */
+	task = (struct mars_task_context *)workload;
+
 	/* initialize task specific id */
 	memcpy(&task->id, id, sizeof(struct mars_task_id));
 
@@ -129,13 +132,17 @@ int mars_task_finalize(struct mars_task_
 
 	int ret;
 	struct mars_task_context *task;
+	struct mars_workload_context *workload;
 	struct mars_context *mars = (void *)(uintptr_t)id->mars_context_ea;
 
 	/* begin process to remove the task from the workload queue */
-	ret = workload_queue_remove_begin(mars->workload_queue, id->workload_id,
-				(struct mars_workload_context **)&task);
+	ret = workload_queue_remove_begin(mars->workload_queue,
+				id->workload_id, &workload);
 	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 
+	/* cast workload context to task context */
+	task = (struct mars_task_context *)workload;
+
 	/* free the allocated task context area if it has one */
 	if (task->context_save_size)
 		free((void *)(uintptr_t)task->context_save_area);
@@ -158,14 +165,17 @@ int mars_task_schedule(struct mars_task_
 
 	int ret;
 	struct mars_task_context *task;
+	struct mars_workload_context *workload;
 	struct mars_context *mars = (void *)(uintptr_t)id->mars_context_ea;
 
 	/* begin process to schedule the workload in the workload queue */
 	ret = workload_queue_schedule_begin(mars->workload_queue,
-					id->workload_id, priority,
-					(struct mars_workload_context **)&task);
+				id->workload_id, priority, &workload);
 	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 
+	/* cast workload context to task context */
+	task = (struct mars_task_context *)workload;
+
 	/* initialize task specific context variables */
 	task->stack = 0;
 	if (args)
@@ -189,13 +199,17 @@ int mars_task_wait(struct mars_task_id *
 
 	int ret;
 	struct mars_task_context *task;
+	struct mars_workload_context *workload;
 	struct mars_context *mars = (void *)(uintptr_t)id->mars_context_ea;
 
 	/* blocking wait for workload completion */
 	ret = workload_queue_wait(mars->workload_queue, id->workload_id,
-				(struct mars_workload_context **)&task);
+				&workload);
 	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 
+	/* cast workload context to task context */
+	task = (struct mars_task_context *)workload;
+
 	/* exit_code requested so return it to caller */
 	if (exit_code)
 		*exit_code = task->exit_code;
@@ -211,13 +225,17 @@ int mars_task_try_wait(struct mars_task_
 
 	int ret;
 	struct mars_task_context *task;
+	struct mars_workload_context *workload;
 	struct mars_context *mars = (void *)(uintptr_t)id->mars_context_ea;
 
 	/* non-blocking wait for workload completion */
 	ret = workload_queue_try_wait(mars->workload_queue, id->workload_id,
-				(struct mars_workload_context **)&task);
+				&workload);
 	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 
+	/* cast workload context to task context */
+	task = (struct mars_task_context *)workload;
+
 	/* exit_code requested so return it to caller */
 	if (exit_code)
 		*exit_code = task->exit_code;
--- a/src/host/lib/mars_workload_queue.c
+++ b/src/host/lib/mars_workload_queue.c
@@ -41,6 +41,7 @@
 
 #include "mars/mars_workload_queue.h"
 #include "mars/mars_kernel_types.h"
+#include "mars/mars_mutex.h"
 #include "mars/mars_error.h"
 #include "mars/mars_debug.h"
 
--- a/src/mpu/kernel/mars_kernel_task.c
+++ b/src/mpu/kernel/mars_kernel_task.c
@@ -64,6 +64,8 @@ void task_exec(struct mars_task_context 
 
 void task_exit(struct mars_task_context *task)
 {
+	(void)task;
+
 	MARS_ASSERT(task);
 }
 
