diff --git a/examples/thread_test.c b/examples/thread_test.c
index 8ee63e0a9f6adb2cf590b1dbaf369bc885b3a4b5..15cebb9bb5510fc97b55c4c4892341fd78a0ab5e 100644
--- a/examples/thread_test.c
+++ b/examples/thread_test.c
@@ -13,7 +13,7 @@
 
   void runner(int type, void* data)
   {
-    printf("%i\n", qsched_get_tid(&s));
+    printf("%i\n", qsched_get_tid());
   }
 
 
diff --git a/src/fqsched.F90 b/src/fqsched.F90
index 22822d33e912ab4def6258534288276bd9904267..6a705d537103d0392e78d7768a6c7393ed8074aa 100644
--- a/src/fqsched.F90
+++ b/src/fqsched.F90
@@ -25,10 +25,9 @@ Module quicksched
 
   Interface
     
-    Integer(Kind=C_INT) Function qsched_get_tid(s) BIND(C)
+    Integer(Kind=C_INT) Function qsched_get_tid() BIND(C)
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
-      Type(C_PTR), VALUE :: s
     End Function
 
     Type(C_PTR) Function f_qsched_create() BIND(C)
diff --git a/src/qsched.c b/src/qsched.c
index 5fb406afcb3949bd6f39887c26a95cb52915c985..30c9111bcbc235c6b540ad2e888fdf6a9e2bf28d 100644
--- a/src/qsched.c
+++ b/src/qsched.c
@@ -50,6 +50,9 @@
 char *qsched_timer_names[ qsched_timer_count ] = 
     { "queue" , "qlock" , "lock" , "gettask" , "done" , "prepare" };
     
+#if defined( HAVE_PTHREAD )
+pthread_key_t qsched_pointer;
+#endif
     
 /**
  * @brief Change the owner of a resource.
@@ -412,6 +415,7 @@ void *qsched_pthread_run ( void *in ) {
   struct task *t;
  #if defined ( HAVE_PTHREAD )
   pthread_setspecific(s->thread_id_key, &r->tid);
+  pthread_setspecific(qsched_pointer, r->s);
  #endif
   /* Main loop. */
   while ( 1 ) {
@@ -529,8 +533,12 @@ void qsched_run ( struct qsched *s , int nr_threads , qsched_funtype fun ) {
         
     }
 
-int qsched_get_tid(struct qsched *s) {
-  if( !HAVE_OPENMP || s->flags & (qsched_flag_yield | qsched_flag_pthread ) )
+int qsched_get_tid() {
+  struct qsched *s = NULL;
+  #if defined( HAVE_PTHREAD )
+  s = (struct qsched *)pthread_getspecific(qsched_pointer);
+  #endif
+  if( s != NULL )
     return *(int*)pthread_getspecific(s->thread_id_key);
   else
     return omp_get_thread_num();
@@ -1557,6 +1565,7 @@ void qsched_free ( struct qsched *s ) {
         s->runners_count = 0;
       }
       pthread_key_delete(s->thread_id_key);
+      pthread_key_delete(qsched_pointer);
     #endif
         
     /* Clear the flags. */
@@ -1646,6 +1655,7 @@ void qsched_init ( struct qsched *s , int nr_queues , int flags ) {
             error( "Failed to lock barrier mutex." );
       }
       pthread_key_create(&s->thread_id_key, NULL);
+      pthread_key_create(&qsched_pointer, NULL);
     #endif
     
     /* Clear the timers. */
diff --git a/src/qsched.h b/src/qsched.h
index b92c67d81d5378204345c8b3b224241965de2c63..47bf8e700dbd87e8b82a0453fa19c80a2092e0ab 100644
--- a/src/qsched.h
+++ b/src/qsched.h
@@ -212,7 +212,7 @@ 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 );
-int qsched_get_tid(struct qsched *s);
+int qsched_get_tid();
 
 struct qsched * f_qsched_create();
 void f_qsched_destroy( struct qsched *s);