diff --git a/configure.ac b/configure.ac
index 3ec22c1ed0a4ff137b9eb966f43620c06295a097..08930b81c40d78f6f3b66b11f75242afe2a5b4df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -99,6 +99,17 @@ if test "$enable_san" = "yes"; then
    fi
 fi
 
+AC_ARG_ENABLE([task-timers],
+   [AS_HELP_STRING([--enable-task-timers],
+      [Enables task timer output and collection of extra data to enable it])].
+    [enable_tts]="$enableval$"],
+    [enable_tts]="no"]
+)
+
+if test "$enable_tts" = "yes"; then
+  AC_DEFINE(WITH_TASK_TIMERS,1,[Define if Task Timer recording is enabled])
+fi
+
 # Autoconf stuff
 AC_PROG_INSTALL
 AC_PROG_MAKE_SET
diff --git a/src/qsched.c b/src/qsched.c
index f6ce8b26349b91fc1f64afcab843266a5b0dc274..b21a8306d5593590060e129f827a31d213055bba 100644
--- a/src/qsched.c
+++ b/src/qsched.c
@@ -608,6 +608,9 @@ void qsched_done ( struct qsched *s , struct task *t ) {
     
     /* Set the task stats. */
     t->toc = getticks();
+    #ifdef WITH_TASK_TIMERS
+    t->tid = qsched_get_tid();
+    #endif
     if (!(s->flags & qsched_flag_norecost))
         t->cost = t->toc - t->tic;
 
@@ -1646,3 +1649,26 @@ void qsched_init ( struct qsched *s , int nr_queues , int flags ) {
     lock_init( &s->lock );
 
     }
+
+
+
+void qsched_dump_task_timers( struct qsched *s, char *filename ){
+#ifdef WITH_TASK_TIMERS
+FILE *task_file;
+
+task_file = fopen(filename, "w");
+
+for(int i = 0; i < s->nr_tasks; i++)
+{
+    struct task *t = s->tasks[i];
+    
+    fprintf("%i %i %lli %lli\n", t->type, t->tid, t->tic, t->toc);
+
+}
+
+
+fclose(task_file);
+#else
+error("Quicksched wasn't compiled with task timers enabled\n");
+#endif
+}
diff --git a/src/qsched.h b/src/qsched.h
index b9ee503cc4e1d5afd08179c7a56eaed516dcb2c1..df9b00a0b57847d607fe81eb35e82a621346eead 100644
--- a/src/qsched.h
+++ b/src/qsched.h
@@ -211,3 +211,4 @@ void qsched_reset ( struct qsched *s );
 void qsched_addtask_dynamic ( struct qsched *s , int type , unsigned int flags , void *data , int data_size , int cost , qsched_res_t *locks , int nr_locks , qsched_res_t *uses , int nr_uses );
 void qsched_ensure ( struct qsched *s , int nr_tasks , int nr_res , int nr_deps , int nr_locks , int nr_uses , int size_data );
 void qsched_res_own ( struct qsched *s , qsched_res_t res , int owner );
+void qsched_dump_task_timers( struct qsched *s, char *filename );
diff --git a/src/task.h b/src/task.h
index c9c57d6436fe659352133ce38b79fc63c719da7e..d12229081ea84fc16a4786e425ceca8f1ff22182 100644
--- a/src/task.h
+++ b/src/task.h
@@ -57,4 +57,9 @@ struct task {
     /* Task weight for queue selection. */
     int cost, weight; 
 
+    #ifdef WITH_TASK_TIMERS
+    int tid;
+
+    #endif
+
     };