diff --git a/Makefile.am b/Makefile.am
index 09288605fdb7ff0e34ddac06a4d0e0177bfb725b..b9643821fb8fbcf778f9f323923b65ac8e1c5338 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -19,4 +19,4 @@
 ACLOCAL_AMFLAGS = -I m4
 
 # Show the way...
-SUBDIRS = src examples doc
+SUBDIRS = src examples fortran_examples doc
diff --git a/configure.ac b/configure.ac
index 3ec22c1ed0a4ff137b9eb966f43620c06295a097..3896778f0ed8c90b412995fa48fe912220af5af3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,6 +34,7 @@ AM_CONFIG_HEADER(config.h)
 AX_CHECK_ENABLE_DEBUG
 AC_PROG_CC
 AM_PROG_CC_C_O
+AC_PROG_FC
 
 # Enable POSIX and platform extension preprocessor macros.
 AC_USE_SYSTEM_EXTENSIONS
diff --git a/fortran_examples/Makefile.am b/fortran_examples/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..755b49cf45a91d7344afa4489d5ddd6d9565080f
--- /dev/null
+++ b/fortran_examples/Makefile.am
@@ -0,0 +1,13 @@
+
+
+# Add the source directory and debug to CFLAGS
+AM_FFLAGS = -I../src -DCPU_TPS=2.67e9 -DTIMERS
+
+# Set-up the library
+bin_PROGRAMS = test 
+
+# Sources for test
+test_SOURCES = test.F90
+test_FFLAGS = $(AM_FFLAGS)
+test_LDADD =  ../src/.libs/libquicksched.a
+
diff --git a/fortran_examples/build.sh b/fortran_examples/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9f7e6c006441afa857e7def529936957d2f50873
--- /dev/null
+++ b/fortran_examples/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+gfortran test.F90 ../src/.libs/libquicksched.a -I../src/ -fopenmp
diff --git a/fortran_examples/matrix.mod b/fortran_examples/matrix.mod
new file mode 100644
index 0000000000000000000000000000000000000000..8943c118452403f800c753d2ea49e27e5f4086dd
--- /dev/null
+++ b/fortran_examples/matrix.mod
@@ -0,0 +1,298 @@
+GFORTRAN module version '10' created from test.F90
+MD5:fa9f6d31a9b7402e8af180ad7d74e632 -- If you edit this, you'll get what you deserve.
+
+(() () () () () () () () () () () () () () () () () () () () () () () ()
+() () ())
+
+()
+
+(('c_funptr' '__iso_c_binding' 2) ('c_ptr' '__iso_c_binding' 3))
+
+()
+
+()
+
+()
+
+(2 'C_funptr' '__iso_c_binding' '' 1 ((DERIVED UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_BIND_C IS_C_INTEROP IS_ISO_C) (
+DERIVED 2 0 1 1 UNKNOWN ()) 0 0 () () 0 ((4 '__c_funptr_c_address' (
+INTEGER 8 0 1 0 INTEGER ()) () (UNKNOWN-FL UNKNOWN-INTENT UNKNOWN-PROC
+UNKNOWN UNKNOWN 0 0) UNKNOWN-ACCESS ())) UNKNOWN-ACCESS () () 2 44 0)
+3 'C_ptr' '__iso_c_binding' '' 1 ((DERIVED UNKNOWN-INTENT UNKNOWN-PROC
+UNKNOWN UNKNOWN 0 0 IS_BIND_C IS_C_INTEROP IS_ISO_C) (DERIVED 3 0 1 1
+UNKNOWN ()) 0 0 () () 0 ((5 '__c_ptr_c_address' (INTEGER 8 0 1 0 INTEGER
+()) () (UNKNOWN-FL UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0)
+UNKNOWN-ACCESS ())) UNKNOWN-ACCESS () () 2 42 0)
+6 '__iso_c_binding' '__iso_c_binding' '' 1 ((MODULE UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 INTRINSIC) (UNKNOWN 0 0 0 0 UNKNOWN ())
+0 0 () () 0 () () () 2 0)
+7 'c_alert' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U00000007') () 0 () () ()
+2 35)
+8 'c_associated' '__iso_c_binding' '__iso_c_binding_c_associated' 1 ((
+PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL UNKNOWN 0 0 FUNCTION
+ALWAYS_EXPLICIT IS_ISO_C) (LOGICAL 4 0 0 0 LOGICAL ()) 9 0 (10 11) () 8
+() () () 2 47)
+12 'c_backspace' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U00000008') () 0 () () ()
+2 36)
+13 'c_bool' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+LOGICAL ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0 ()
+() () 2 32)
+14 'c_carriage_return' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U0000000d') () 0 () () ()
+2 39)
+15 'c_char' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+CHARACTER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0
+() () () 2 33)
+16 'c_double' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+REAL ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 () ()
+() 2 25)
+17 'c_double_complex' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+COMPLEX ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 29)
+18 'c_f_pointer' '__iso_c_binding' '__iso_c_binding_c_f_pointer' 1 ((
+PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE
+ALWAYS_EXPLICIT IS_ISO_C) (UNKNOWN 0 0 0 0 UNKNOWN ()) 19 0 (20 21 22) ()
+0 () () () 2 46)
+23 'c_f_procpointer' '__iso_c_binding' '__iso_c_binding_c_f_procpointer'
+1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE
+IS_ISO_C) (UNKNOWN 0 0 0 0 UNKNOWN ()) 24 0 (25 26) () 0 () () () 2 50)
+27 'c_float' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+REAL ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '4') () 0 () ()
+() 2 24)
+28 'c_float128' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+REAL ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '16') () 0 () ()
+() 2 27)
+29 'c_float128_complex' '__iso_c_binding' '' 1 ((PARAMETER
+UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (
+INTEGER 4 0 1 1 COMPLEX ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ())
+0 '16') () 0 () () () 2 31)
+30 'c_float_complex' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+COMPLEX ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '4') () 0 ()
+() () 2 28)
+31 'c_form_feed' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U0000000c') () 0 () () ()
+2 37)
+32 'c_funloc' '__iso_c_binding' '__iso_c_binding_c_funloc' 1 ((
+PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 EXTERNAL
+FUNCTION PURE IS_ISO_C) (DERIVED 2 0 0 0 DERIVED ()) 0 0 () () 32 () ()
+() 2 49)
+33 'c_funptr' '__iso_c_binding' '' 1 ((PROCEDURE UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 FUNCTION GENERIC) (UNKNOWN 0 0 0 0
+UNKNOWN ()) 0 0 () () 0 () () () 2 44)
+34 'c_horizontal_tab' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U00000009') () 0 () () ()
+2 40)
+35 'c_int' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '4') () 0 ()
+() () 2 0)
+36 'c_int128_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '16') () 0 ()
+() () 2 13)
+37 'c_int16_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '2') () 0 ()
+() () 2 10)
+38 'c_int32_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '4') () 0 ()
+() () 2 11)
+39 'c_int64_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 12)
+40 'c_int8_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0 ()
+() () 2 9)
+41 'c_int_fast128_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '16') () 0 ()
+() () 2 23)
+42 'c_int_fast16_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 20)
+43 'c_int_fast32_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 21)
+44 'c_int_fast64_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 22)
+45 'c_int_fast8_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0 ()
+() () 2 19)
+46 'c_int_least128_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '16') () 0 ()
+() () 2 18)
+47 'c_int_least16_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '2') () 0 ()
+() () 2 15)
+48 'c_int_least32_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '4') () 0 ()
+() () 2 16)
+49 'c_int_least64_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 17)
+50 'c_int_least8_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0 ()
+() () 2 14)
+51 'c_intmax_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 4)
+52 'c_intptr_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 5)
+53 'c_loc' '__iso_c_binding' '__iso_c_binding_c_loc' 1 ((PROCEDURE
+UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 EXTERNAL FUNCTION PURE
+IS_ISO_C) (DERIVED 3 0 0 0 DERIVED ()) 0 0 () () 53 () () () 2 48)
+54 'c_long' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 2)
+55 'c_long_double' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+REAL ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '10') () 0 () ()
+() 2 26)
+56 'c_long_double_complex' '__iso_c_binding' '' 1 ((PARAMETER
+UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (
+INTEGER 4 0 1 1 COMPLEX ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ())
+0 '10') () 0 () () () 2 30)
+57 'c_long_long' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 3)
+58 'c_new_line' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U0000000a') () 0 () () ()
+2 38)
+59 'c_null_char' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U00000000') () 0 () () ()
+2 34)
+60 'c_null_funptr' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_BIND_C IS_C_INTEROP IS_ISO_C) (
+DERIVED 2 0 1 1 UNKNOWN ()) 0 0 () (STRUCTURE (DERIVED 2 0 0 0 DERIVED ())
+0 (((NULL (UNKNOWN 0 0 0 1 UNKNOWN ()) 0) ())) ()) () 0 () () () 2 45)
+61 'c_null_ptr' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_BIND_C IS_C_INTEROP IS_ISO_C) (
+DERIVED 3 0 1 1 UNKNOWN ()) 0 0 () (STRUCTURE (DERIVED 3 0 0 0 DERIVED ())
+0 (((NULL (UNKNOWN 0 0 0 1 UNKNOWN ()) 0) ())) ()) () 0 () () () 2 43)
+62 'c_ptr' '__iso_c_binding' '' 1 ((PROCEDURE UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 FUNCTION GENERIC) (UNKNOWN 0 0 0 0
+UNKNOWN ()) 0 0 () () 0 () () () 2 42)
+63 'c_ptrdiff_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 6)
+64 'c_short' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '2') () 0 ()
+() () 2 1)
+65 'c_signed_char' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '1') () 0 ()
+() () 2 8)
+66 'c_size_t' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (INTEGER 4 0 1 1
+INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 1 1 UNKNOWN ()) 0 '8') () 0 ()
+() () 2 7)
+67 'c_sizeof' '__iso_c_binding' '' 1 ((PROCEDURE UNKNOWN-INTENT
+UNKNOWN-PROC DECL UNKNOWN 0 0 INTRINSIC FUNCTION) (INTEGER 8 0 0 0
+INTEGER ()) 68 0 (69) () 0 () () () 2 48)
+70 'c_vertical_tab' '__iso_c_binding' '' 1 ((PARAMETER UNKNOWN-INTENT
+UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 IS_C_INTEROP IS_ISO_C) (CHARACTER 1 0 1
+1 CHARACTER ((CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1'))) 0 0 () (
+CONSTANT (CHARACTER 1 0 1 1 UNKNOWN (())) 0 1 '\U0000000b') () 0 () () ()
+2 41)
+71 'hello' 'matrix' '' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL
+UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 0 UNKNOWN ()) 72 0 (73) () 0 () ()
+() 0 0)
+74 'matrix' 'matrix' '' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0) (UNKNOWN 0 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0)
+75 'runner' 'matrix' '' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL
+UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 0 UNKNOWN ()) 76 0 (77 78) () 0 ()
+() () 0 0)
+10 'C_ptr_1' '__iso_c_binding' '' 9 ((DERIVED IN UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 VALUE DUMMY) (DERIVED 3 0 0 0 DERIVED ()) 0 0 () () 0 () ()
+() 0 0 0)
+11 'C_ptr_2' '__iso_c_binding' '' 9 ((DERIVED IN UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 OPTIONAL VALUE DUMMY) (DERIVED 3 0 0 0 DERIVED ()) 0 0 () ()
+0 () () () 0 0 0)
+20 'Cptr' '__iso_c_binding' '' 19 ((DERIVED IN UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 VALUE DUMMY) (DERIVED 3 0 0 0 DERIVED ()) 0 0 () () 0 () ()
+() 0 0 0)
+21 'fptr' '__iso_c_binding' '' 19 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC
+UNKNOWN UNKNOWN 0 0 POINTER DUMMY) (VOID 0 0 0 0 VOID ()) 0 0 () () 0 ()
+() () 0 0)
+22 'shape' '__iso_c_binding' '' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 DIMENSION OPTIONAL DUMMY) (VOID 4 0 0 0 VOID ()) 0 0 () (1 0
+ASSUMED_SHAPE (CONSTANT (INTEGER 4 0 0 0 INTEGER ()) 0 '1') ()) 0 () ()
+() 0 0)
+25 'Cptr' '__iso_c_binding' '' 24 ((DERIVED IN UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 VALUE DUMMY) (DERIVED 2 0 0 0 DERIVED ()) 0 0 () () 0 () ()
+() 0 0 0)
+26 'fptr' '__iso_c_binding' '' 24 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC
+UNKNOWN UNKNOWN 0 0 DUMMY PROC_POINTER) (VOID 0 0 0 0 VOID ()) 0 0 () ()
+0 () () () 0 0)
+69 'x' '' '' 68 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) (
+UNKNOWN 0 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0)
+73 'task_num' '' '' 72 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
+DUMMY) (INTEGER 4 0 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
+77 'typ' '' '' 76 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN
+0 0 VALUE DUMMY) (INTEGER 4 0 1 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
+78 'data' '' '' 76 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
+UNKNOWN 0 0 VALUE DUMMY) (DERIVED 3 0 0 0 DERIVED ()) 0 0 () () 0 () ()
+() 0 0)
+)
+
+('C_funptr' 0 2 'C_ptr' 0 3 '__iso_c_binding' 0 6 'c_alert' 0 7
+'c_associated' 0 8 'c_backspace' 0 12 'c_bool' 0 13 'c_carriage_return'
+0 14 'c_char' 0 15 'c_double' 0 16 'c_double_complex' 0 17 'c_f_pointer'
+0 18 'c_f_procpointer' 0 23 'c_float' 0 27 'c_float128' 0 28
+'c_float128_complex' 0 29 'c_float_complex' 0 30 'c_form_feed' 0 31
+'c_funloc' 0 32 'c_funptr' 0 33 'c_horizontal_tab' 0 34 'c_int' 0 35
+'c_int128_t' 0 36 'c_int16_t' 0 37 'c_int32_t' 0 38 'c_int64_t' 0 39
+'c_int8_t' 0 40 'c_int_fast128_t' 0 41 'c_int_fast16_t' 0 42
+'c_int_fast32_t' 0 43 'c_int_fast64_t' 0 44 'c_int_fast8_t' 0 45
+'c_int_least128_t' 0 46 'c_int_least16_t' 0 47 'c_int_least32_t' 0 48
+'c_int_least64_t' 0 49 'c_int_least8_t' 0 50 'c_intmax_t' 0 51
+'c_intptr_t' 0 52 'c_loc' 0 53 'c_long' 0 54 'c_long_double' 0 55
+'c_long_double_complex' 0 56 'c_long_long' 0 57 'c_new_line' 0 58
+'c_null_char' 0 59 'c_null_funptr' 0 60 'c_null_ptr' 0 61 'c_ptr' 0 62
+'c_ptrdiff_t' 0 63 'c_short' 0 64 'c_signed_char' 0 65 'c_size_t' 0 66
+'c_sizeof' 0 67 'c_vertical_tab' 0 70 'hello' 0 71 'matrix' 0 74 'runner'
+0 75)
diff --git a/fortran_examples/test.F90 b/fortran_examples/test.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e8d0182359fcbcc8cb77248d45ddbd4912025468
--- /dev/null
+++ b/fortran_examples/test.F90
@@ -0,0 +1,57 @@
+Module matrix
+Use, Intrinsic :: ISO_C_BINDING
+Implicit None
+
+Contains
+
+Subroutine hello(task_num)
+Integer, Intent(In) :: task_num
+
+print *, task_num
+End Subroutine
+
+Subroutine runner(typ, data)
+Integer(Kind=C_INT), VALUE :: typ
+Type(C_PTR), VALUE :: data
+Integer, Pointer :: c(:)
+
+call c_f_pointer(data, c, [1])
+
+if(typ == 1) then
+  call hello(Int(c(1)) )
+else
+  print *, "Unknown task type"
+end if
+
+End Subroutine
+
+End Module matrix
+
+
+Program task_universe
+Use, Intrinsic :: ISO_C_BINDING
+Use :: quicksched
+Use :: matrix
+Implicit None
+
+Type(C_PTR) :: sched
+Integer :: i,j
+Integer(Kind=C_INT), Dimension(10), Target :: datas 
+Type(C_FUNPTR) :: fun
+Integer(Kind=C_INT), Parameter :: nr_threads=2
+
+fun = C_FUNLOC(runner)
+sched = f_qsched_create()
+
+call qsched_init(sched, nr_threads, 0)
+
+do i = 1, 100
+  datas(1) = Int(i, C_INT)
+  j = qsched_addtask(sched, 1, 0, C_LOC(datas(1)), INT(sizeof(j)*1, C_INT), 1)
+  if(j >= 2 .and. mod(j,2) == 0)  call qsched_addunlock(sched, INT(j, C_INT), INT(j-2, C_INT))
+end do
+
+
+  Call qsched_run(sched, nr_threads, fun)
+call f_qsched_destroy(sched)
+End Program
diff --git a/src/Makefile.am b/src/Makefile.am
index aded79764b0145d6f8207d3612de346caaf6fb5b..b7192048b10e15a1e40560cb1a629095d821ff5a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,7 +26,7 @@ GIT_CMD = @GIT_CMD@
 
 # Build the libquicksched library
 lib_LTLIBRARIES = libquicksched.la
-libquicksched_la_SOURCES = qsched.c queue.c
+libquicksched_la_SOURCES = qsched.c queue.c fqsched.F90
 
 # List required headers
 include_HEADERS = atomic.h lock.h queue.h qsched.h task.h res.h error.h
diff --git a/src/qsched.F90 b/src/fqsched.F90
similarity index 82%
rename from src/qsched.F90
rename to src/fqsched.F90
index 5f6198ff4e5c7af07b86efbeda785489a62f24eb..b9db2cb9117a49b088b4d8a233542f4e91214db1 100644
--- a/src/qsched.F90
+++ b/src/fqsched.F90
@@ -6,12 +6,25 @@ Module quicksched
     
     !!TODO May need a qsched_get_qsched to get a pointer?
 
+    Type(C_PTR) Function f_qsched_create() BIND(C)
+      Use, Intrinsic :: ISO_C_BINDING
+      Implicit None
+
+    End Function
+
+    Subroutine f_qsched_destroy(s) BIND(C)
+      Use, Intrinsic :: ISO_C_BINDING
+      Implicit None
+          
+      Type(C_PTR), VALUE :: s
+    End Subroutine
+
     Subroutine qsched_init(s, nr_queues, flags) BIND(C)
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
 
 
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: nr_queues
       Integer(Kind=C_INT), Intent(In), VALUE :: flags
     End Subroutine
@@ -20,7 +33,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: owner 
       Integer(Kind=C_INT), Intent(In), VALUE :: parent
     End Function
@@ -29,7 +42,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: t 
       Integer(Kind=C_INT), Intent(In), VALUE :: res
     End Subroutine
@@ -38,7 +51,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: ta 
       Integer(Kind=C_INT), Intent(In), VALUE :: tb
 
@@ -48,10 +61,10 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
     
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: types
       Integer(Kind=C_INT), Intent(In), VALUE :: flags !TODO Careful with unsigned
-      Type(C_PTR), Intent(In), VALUE :: data
+      Type(C_PTR), VALUE :: data
       Integer(Kind=C_INT), Intent(In), VALUE :: data_size
       IntegeR(Kind=C_INT), Intent(In), VALUE :: cost
 
@@ -61,7 +74,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: t 
       Integer(Kind=C_INT), Intent(In), VALUE :: res
     End Subroutine
@@ -70,7 +83,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
 
     End Subroutine
   
@@ -78,7 +91,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: nr_threads
       Type(C_FUNPTR), INTENT(In), VALUE :: fun 
     End Subroutine
@@ -87,7 +100,7 @@ Module quicksched
       Use, Intrinsic :: ISO_C_BINDING
       Implicit None
      
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
 
     End Subroutine
 
@@ -97,7 +110,7 @@ Module quicksched
       Use, Intrinsic:: ISO_C_BINDING
       Implicit None
 
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: nr_tasks
       Integer(Kind=C_INT), Intent(In), VALUE :: nr_res
       Integer(Kind=C_INT), Intent(In), VALUE :: nr_deps
@@ -111,7 +124,7 @@ Module quicksched
       Use, Intrinsic:: ISO_C_BINDING
       Implicit None
 
-      Type(C_PTR), Intent(InOut), VALUE :: s
+      Type(C_PTR), VALUE :: s
       Integer(Kind=C_INT), Intent(In), VALUE :: res
       Integer(Kind=C_INT), Intent(In), VALUE :: owner
 
diff --git a/src/qsched.c b/src/qsched.c
index f6ce8b26349b91fc1f64afcab843266a5b0dc274..45e0dac9f483ad82967c7a07773e623cd95436c7 100644
--- a/src/qsched.c
+++ b/src/qsched.c
@@ -1646,3 +1646,16 @@ void qsched_init ( struct qsched *s , int nr_queues , int flags ) {
     lock_init( &s->lock );
 
     }
+
+
+struct qsched * f_qsched_create()
+{
+    struct qsched *s;
+    s = (struct qsched *) malloc(sizeof(struct qsched));
+    return s;
+}
+void f_qsched_destroy( struct qsched *s)
+{
+    free(s);
+}
+
diff --git a/src/qsched.h b/src/qsched.h
index b9ee503cc4e1d5afd08179c7a56eaed516dcb2c1..fa424b41f8e6d2c20893aea11ecf083e2597880f 100644
--- a/src/qsched.h
+++ b/src/qsched.h
@@ -211,3 +211,6 @@ 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 );
+
+struct qsched * f_qsched_create();
+void f_qsched_destroy( struct qsched *s);