diff --git a/__init__.py b/__init__.py
index 2e73112d01f713578d332ab886259d23b27ff974..83345fbc33b8c5ebffbdd4f9301558b5462b8fd7 100644
--- a/__init__.py
+++ b/__init__.py
@@ -20,9 +20,16 @@ def all_subpackages(pkg_prefix, verbose, what_to_run, parent, prefix=""):
         
         if ".testing" not in modname and not ispkg:
             continue
-        
+ 
         mod = importlib.import_module(modname)
-        
+        try:
+            if os.path.islink(mod.__path__[0] if ispkg else mod.__file__):
+                log.warn("Skipping symbolic link to {}.".format(modname))
+            # might be better to check if it is in the path first ...
+                continue
+        except Exception as e:
+            import pdb;pdb.set_trace()
+            pass
         for what in what_to_run:
             if not hasattr(mod, what): continue
 
@@ -108,8 +115,10 @@ def run_module(verbose, modname, mod, do_that):
         print(title)
         print("#" * len(title))
 
-        try: run_once()
-        except FinishException: pass        
+        try:
+            run_once()
+        except FinishException:
+            pass
     else:
         print("# "+modname)
         GDB_Instance.CSV_header = True
diff --git a/main.py b/__main__.py
similarity index 100%
rename from main.py
rename to __main__.py
diff --git a/mcgdb_testing/Makefile b/mcgdb_testing/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..28a8f03ef83fc11b124916aa4d7c1c4acffeb34f
--- /dev/null
+++ b/mcgdb_testing/Makefile
@@ -0,0 +1,8 @@
+BIN_DIR ?= __binaries__
+
+CFLAGS=-g -O0
+
+benchmark : $(BIN_DIR)/benchmark
+
+$(BIN_DIR)/benchmark : benchmark.c
+	gcc -o $@ $< ${CFLAGS}
diff --git a/mcgdb_testing/benchmark.c b/mcgdb_testing/benchmark.c
new file mode 100644
index 0000000000000000000000000000000000000000..80b9975006d8e3980d9b0f48cd937f8bc8a7f0a4
--- /dev/null
+++ b/mcgdb_testing/benchmark.c
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+/***********/
+// modified by debugging, do not change to macro.
+int repeat = 2;
+
+int it_count = 1000;
+int us_sleep_time = 100;
+
+/***********/
+
+void finish_data_ready(void) {}
+
+void finish(struct timeval x, struct timeval y) {
+  
+  static float it_total;
+  static float ms_busy_time, us_busy_once;
+  static float ms_total_sleep;
+  static float ms_time;
+  {
+    static double x_us, y_us;
+
+    x_us = (double) x.tv_sec*1000000 + (double) x.tv_usec;
+    y_us = (double) y.tv_sec*1000000 + (double) y.tv_usec;
+
+    it_total = repeat * it_count;
+    
+    ms_time = (y_us - x_us)/1000;
+    ms_total_sleep = us_sleep_time*(it_total/1000.0);
+    ms_busy_time = ms_time - ms_total_sleep;
+    us_busy_once = ms_busy_time * 1000 / it_total;
+  }
+
+  finish_data_ready();
+  
+  printf("Repeat: %d; Loop: %d; usleep %dus (one) %1.fms (total)\n",
+         repeat, it_count, us_sleep_time, ms_total_sleep);
+  printf("------------------\n");
+  printf("Total time: %1.fms\n", ms_time);
+  printf("Busy time : %1.fms\n", ms_busy_time);
+  printf("Busy once : %1.fus\n", us_busy_once);
+}
+
+void action(int it) {
+  usleep(us_sleep_time);
+}
+
+void benchmark(void) {
+  static int i;
+  
+  for (i = 0; i < it_count; ++i) {
+    action(i);
+  }
+}
+
+int main(int argc, char** argv) {
+    struct timeval before , after;
+    int i;
+    
+    benchmark(); // warm-up
+    
+    gettimeofday(&before , NULL);
+    
+    for (i = 0; i < repeat; ++i) {
+      benchmark();
+    }
+
+    gettimeofday(&after , NULL);
+
+    finish(before, after);
+    
+    return EXIT_SUCCESS;
+}
diff --git a/mcgdb_testing/mc_gdb.py b/mcgdb_testing/mc_gdb.py
new file mode 100644
index 0000000000000000000000000000000000000000..cc751334c943bef7d0ad89c9429598d186c5532a
--- /dev/null
+++ b/mcgdb_testing/mc_gdb.py
@@ -0,0 +1,39 @@
+native_gdb = None
+gdb = None
+
+TEST_FINISH_BP = """python
+class TestFctBP(mcgdb.capture.FunctionBreakpoint):
+  do_finish = False
+
+  def __init__(self):
+    mcgdb.capture.FunctionBreakpoint.__init__(self, "action")
+
+  def prepare_before (self):
+    return (False, TestFctBP.do_finish, {})
+
+  def prepare_after(self, data):
+    return False
+TestFctBP()
+end
+"""
+
+def function_breakpoint():
+    gdb.execute(TEST_FINISH_BP)
+    native_gdb.run("Function Breakpoint")
+    
+def finish_breakpoint():
+    gdb.execute(TEST_FINISH_BP)
+    gdb.execute("python TestFctBP.do_finish = True")
+
+    native_gdb.run("Finish Breakpoint")
+
+def prepare(_gdb):
+    gdb.execute("py import mcgdb")
+    
+def benchmark(_gdb):
+    global native_gdb, gdb
+    from . import native_gdb
+    gdb = _gdb
+    what = [function_breakpoint, finish_breakpoint]
+
+    native_gdb.benchmark(_gdb, what, no_mcgdb=False)
diff --git a/mcgdb_testing/native_gdb.py b/mcgdb_testing/native_gdb.py
new file mode 100644
index 0000000000000000000000000000000000000000..56c5e9765f0974b264c1e924b302c9446d20a099
--- /dev/null
+++ b/mcgdb_testing/native_gdb.py
@@ -0,0 +1,75 @@
+from gdb_tester import *
+
+gdb = None
+
+def run(what, run="run"):
+    gdb.set_title(what)
+    gdb.execute("break finish_data_ready")
+    gdb.execute(run)
+    gdb.execute("up")
+
+    gdb.save_value("us_busy_once", "%1.f", "us")
+
+def nominal_time():
+    run("Nominal time")
+
+def gdb_watchpoint():
+    gdb.execute("break benchmark")
+    gdb.execute("run")
+    gdb.execute("print &i")
+    gdb.execute("watch *$1")
+    gdb.execute("""command
+silent
+continue
+end""")
+    gdb.execute("py [b for b in gdb.breakpoints() if b.location == 'benchmark'][0].delete()")
+    
+    run("HW Watchpoint command", run="continue")
+    
+def gdb_breakpoint():
+    gdb.execute("break action")
+    gdb.execute("""command
+silent
+continue
+end""")
+    run("Breakpoint command")
+
+PARAMETERS = [
+    'int(gdb.parse_and_eval("it"))',
+    'int(gdb.newest_frame().older().read_var("i"))'
+    ]
+def gdb_py_breakpoint_parameter(params_choice):
+    params = [par for i, par in enumerate(PARAMETERS) if params_choice & (1 << i)]
+            
+    def to_run():
+        gdb.execute("""python
+class TestBP(gdb.Breakpoint):
+  def __init__(self):
+    gdb.Breakpoint.__init__(self, "action")
+    self.silent=True
+
+  def stop(self):
+    {params}
+    return False
+
+TestBP()
+end
+""".format(params="\n    ".join(params)))
+        run("Py BP param {:02b}".format(params_choice)[2:])
+        
+    return to_run
+        
+def benchmark(_gdb, what=None, no_mcgdb=True):
+    global gdb
+    gdb = _gdb
+    
+    if what is None:
+        what = [nominal_time, gdb_breakpoint, gdb_watchpoint] + \
+                list(map(lambda x: gdb_py_breakpoint_parameter(x), (0b0, 0b1, 0b10, 0b11)))
+    
+    gdb.start(CSource("benchmark.c"), no_mcgdb)
+    for prepare_and_run in what:
+        prepare_and_run()
+        gdb.reset(hard=(not no_mcgdb))
+        
+    gdb.quit()
diff --git a/openmp_testing/Makefile b/openmp_testing/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..92f635962ed9efebbd10a0012438c168c64b30c8
--- /dev/null
+++ b/openmp_testing/Makefile
@@ -0,0 +1,53 @@
+BIN_DIR ?= __binaries__
+CFLAGS=-g -O0 
+
+GOMP ?= yes
+
+LLVM ?= no
+MY_CLANG_DIR = /home/kevin/travail/sample/LLVM/llvm/Debug+Asserts/bin
+
+OMPSS ?= no
+MY_OMPSS_DIR = ~/travail/tools/ompss-install/bin
+OMPSS_TMP_DBG_DIR = $(BIN_DIR)/.tmp/
+
+ifeq ($(LLVM),yes)
+	CFLAGS += -fopenmp 
+	CC = ${MY_CLANG_DIR}/clang
+
+# -- -- --
+	IMPLEM_CHECK= $(BIN_DIR)/.is_llvm
+	IMPLEM_NCHECK= $(BIN_DIR)/.is_gcc IMPLEM_CHECK= $(BIN_DIR)/.is_ompss
+endif
+
+ifeq ($(GOMP),yes)
+	CFLAGS += -fdump-tree-optimized -fopenmp 
+	CC = gcc
+# -- -- --
+	IMPLEM_CHECK= $(BIN_DIR)/.is_gcc
+	IMPLEM_NCHECK= $(BIN_DIR)/.is_llvm IMPLEM_CHECK= $(BIN_DIR)/.is_ompss
+endif
+
+ifeq ($(OMPSS),yes)
+	CFLAGS += --debug --keep-files --output-dir=${OMPSS_TMP_DBG_DIR} --keep-files
+	CC = ${MY_OMPSS_DIR}/mcc
+# -- -- --
+	IMPLEM_CHECK= $(BIN_DIR)/.is_ompss
+	IMPLEM_NCHECK= $(BIN_DIR)/.is_llvm $(BIN_DIR)/.is_gcc
+endif
+
+.SUFFIXES: # disable implicit rules
+
+parallel-demo : $(BIN_DIR)/parallel-demo
+
+$(BIN_DIR)/parallel-demo : parallel-demo.c $(IMPLEM_CHECK)
+	@mkdir -p ${OMPSS_TMP_DBG_DIR}
+	${CC} -o $@ $< ${CFLAGS}
+	@rm $(IMPLEM_NCHECK) -f
+
+$(IMPLEM_CHECK) : 
+	@touch $(IMPLEM_CHECK)
+
+benchmark : $(BIN_DIR)/benchmark
+
+$(BIN_DIR)/benchmark : benchmark.c
+	gcc -o $@ $< -fopenmp ${CFLAGS}
diff --git a/openmp_testing/__binaries__/.is_gcc b/openmp_testing/__binaries__/.is_gcc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c b/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c
new file mode 100644
index 0000000000000000000000000000000000000000..25aabb75548e92b0b9c7dec40d8cf55ae7d20e95
--- /dev/null
+++ b/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c
@@ -0,0 +1,674 @@
+struct _IO_FILE_plus;
+extern struct _IO_FILE_plus _IO_2_1_stdin_;
+extern struct _IO_FILE_plus _IO_2_1_stdout_;
+extern struct _IO_FILE_plus _IO_2_1_stderr_;
+struct _IO_FILE;
+extern struct _IO_FILE *stdin;
+extern struct _IO_FILE *stdout;
+extern struct _IO_FILE *stderr;
+extern int sys_nerr;
+extern const char *const sys_errlist[];
+extern int printf(const char *__restrict __format, ...);
+struct  mcc_struct_anon_15
+{
+  void (*outline)(void *);
+};
+typedef struct mcc_struct_anon_15 nanos_smp_args_t;
+struct  nanos_args_3_t
+{
+};
+static void smp_ol_main_3(struct nanos_args_3_t *const args);
+struct  mcc_struct_anon_11
+{
+  _Bool mandatory_creation:1;
+  _Bool tied:1;
+  _Bool clear_chunk:1;
+  _Bool reserved0:1;
+  _Bool reserved1:1;
+  _Bool reserved2:1;
+  _Bool reserved3:1;
+  _Bool reserved4:1;
+};
+typedef struct mcc_struct_anon_11 nanos_wd_props_t;
+typedef unsigned long int size_t;
+struct  nanos_const_wd_definition_tag
+{
+  nanos_wd_props_t props;
+  size_t data_alignment;
+  size_t num_copies;
+  size_t num_devices;
+  size_t num_dimensions;
+  const char *description;
+};
+typedef struct nanos_const_wd_definition_tag nanos_const_wd_definition_t;
+struct  mcc_struct_anon_14
+{
+  void *(*factory)(void *);
+  void *arg;
+};
+typedef struct mcc_struct_anon_14 nanos_device_t;
+struct  nanos_const_wd_definition_1
+{
+  nanos_const_wd_definition_t base;
+  nanos_device_t devices[1L];
+};
+extern void *nanos_smp_factory(void *args);
+extern int nanos_omp_get_num_threads_next_parallel(int threads_requested);
+typedef void *nanos_team_t;
+typedef void *nanos_thread_t;
+enum mcc_enum_anon_5
+{
+  NANOS_OK = 0,
+  NANOS_UNKNOWN_ERR = 1,
+  NANOS_UNIMPLEMENTED = 2,
+  NANOS_ENOMEM = 3,
+  NANOS_INVALID_PARAM = 4,
+  NANOS_INVALID_REQUEST = 5
+};
+typedef enum mcc_enum_anon_5 nanos_err_t;
+struct mcc_struct_anon_18;
+typedef struct mcc_struct_anon_18 nanos_constraint_t;
+typedef void *nanos_sched_t;
+extern nanos_err_t nanos_create_team(nanos_team_t *team, nanos_sched_t sg, unsigned int *nthreads, nanos_constraint_t *constraints, _Bool reuse, nanos_thread_t *info, nanos_const_wd_definition_t *const_data);
+extern void nanos_handle_error(nanos_err_t err);
+struct  mcc_struct_anon_12
+{
+  _Bool is_final:1;
+  _Bool is_recover:1;
+  _Bool is_implicit:1;
+  _Bool reserved3:1;
+  _Bool reserved4:1;
+  _Bool reserved5:1;
+  _Bool reserved6:1;
+  _Bool reserved7:1;
+};
+typedef struct mcc_struct_anon_12 nanos_wd_dyn_flags_t;
+struct  mcc_struct_anon_13
+{
+  nanos_wd_dyn_flags_t flags;
+  nanos_thread_t tie_to;
+  int priority;
+};
+typedef struct mcc_struct_anon_13 nanos_wd_dyn_props_t;
+typedef void *nanos_wd_t;
+struct mcc_struct_anon_4;
+typedef struct mcc_struct_anon_4 nanos_copy_data_internal_t;
+typedef nanos_copy_data_internal_t nanos_copy_data_t;
+struct mcc_struct_anon_0;
+typedef struct mcc_struct_anon_0 nanos_region_dimension_internal_t;
+typedef void *nanos_wg_t;
+extern nanos_err_t nanos_create_wd_compact(nanos_wd_t *wd, nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, size_t data_size, void **data, nanos_wg_t wg, nanos_copy_data_t **copies, nanos_region_dimension_internal_t **dimensions);
+extern nanos_wd_t nanos_current_wd(void);
+struct mcc_struct_anon_2;
+typedef struct mcc_struct_anon_2 nanos_data_access_internal_t;
+typedef nanos_data_access_internal_t nanos_data_access_t;
+extern nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_data_accesses, nanos_data_access_t *data_accesses, nanos_team_t team);
+typedef void (*nanos_translate_args_t)(void *, nanos_wd_t);
+extern nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, size_t data_size, void *data, size_t num_data_accesses, nanos_data_access_t *data_accesses, nanos_copy_data_t *copies, nanos_region_dimension_internal_t *dimensions, nanos_translate_args_t translate_args);
+struct  mcc_struct_anon_1
+{
+  _Bool input:1;
+  _Bool output:1;
+  _Bool can_rename:1;
+  _Bool concurrent:1;
+  _Bool commutative:1;
+};
+typedef struct mcc_struct_anon_1 nanos_access_type_internal_t;
+typedef long int ptrdiff_t;
+struct  mcc_struct_anon_2
+{
+  void *address;
+  nanos_access_type_internal_t flags;
+  short int dimension_count;
+  const nanos_region_dimension_internal_t *dimensions;
+  ptrdiff_t offset;
+};
+extern nanos_err_t nanos_end_team(nanos_team_t team);
+int main()
+{
+  printf("@Base: Let\'s attack the death start !\n");
+  printf("@Base: Releash all the starfighters.\n");
+  {
+    nanos_err_t nanos_err;
+    nanos_wd_dyn_props_t dyn_props;
+    unsigned int nth_i;
+    struct nanos_args_3_t imm_args;
+    nanos_data_access_t dependences[1L];
+    static nanos_smp_args_t smp_ol_main_3_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_3_t *))&smp_ol_main_3};
+    static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 1, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_3_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_3_args}}};
+    unsigned int nanos_num_threads = nanos_omp_get_num_threads_next_parallel(0);
+    nanos_team_t nanos_team = (void *)0;
+    nanos_thread_t nanos_team_threads[nanos_num_threads];
+    nanos_err = nanos_create_team(&nanos_team, (void *)0, &nanos_num_threads, (nanos_constraint_t *)0, 1, nanos_team_threads, &nanos_wd_const_data.base);
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+    dyn_props.tie_to = (void *)0;
+    dyn_props.priority = 0;
+    dyn_props.flags.is_final = 0;
+    dyn_props.flags.is_implicit = 1;
+    for (nth_i = 1; nth_i < nanos_num_threads; nth_i = nth_i + 1)
+      {
+        dyn_props.tie_to = nanos_team_threads[nth_i];
+        struct nanos_args_3_t *ol_args = 0;
+        nanos_wd_t nanos_wd_ = (void *)0;
+        nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &dyn_props, sizeof(struct nanos_args_3_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+        ;
+        nanos_err = nanos_submit(nanos_wd_, 0, (nanos_data_access_t *)0, (void *)0);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+    dyn_props.tie_to = nanos_team_threads[0];
+    ;
+    nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &dyn_props, sizeof(struct nanos_args_3_t), &imm_args, 0, dependences, (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, nanos_wd_t))0);
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+    nanos_err = nanos_end_team(nanos_team);
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+  }
+  printf("@Base: Everybody\'s back to safety, great job!\n");
+}
+static void smp_ol_main_0_unpacked(int id)
+{
+  {
+    {
+      printf("@%d I cover your backs!\n", id);
+    }
+  }
+}
+struct  nanos_args_0_t
+{
+  int id;
+};
+static void smp_ol_main_0(struct nanos_args_0_t *const args)
+{
+  {
+    smp_ol_main_0_unpacked((*args).id);
+  }
+}
+static void smp_ol_main_1_unpacked(int id)
+{
+  {
+    {
+      printf("@%d I cover your backs as well!\n", id);
+    }
+  }
+}
+struct  nanos_args_1_t
+{
+  int id;
+};
+static void smp_ol_main_1(struct nanos_args_1_t *const args)
+{
+  {
+    smp_ol_main_1_unpacked((*args).id);
+  }
+}
+struct nanos_ws_desc;
+typedef struct nanos_ws_desc nanos_ws_desc_t;
+extern nanos_err_t nanos_omp_set_implicit(nanos_wd_t uwd);
+typedef void *nanos_ws_item_t;
+extern nanos_err_t nanos_worksharing_next_item(nanos_ws_desc_t *wsd, nanos_ws_item_t *wsi);
+struct  mcc_struct_anon_10
+{
+  int lower;
+  int upper;
+  _Bool execute:1;
+  _Bool last:1;
+};
+typedef struct mcc_struct_anon_10 nanos_ws_item_loop_t;
+extern nanos_err_t nanos_omp_barrier(void);
+static void smp_ol_main_2_unpacked(nanos_ws_desc_t *wsd_1, int *const id)
+{
+  int nanos_omp_index_0;
+  {
+    {
+      nanos_err_t nanos_err;
+      nanos_err = nanos_omp_set_implicit(nanos_current_wd());
+      if (nanos_err != NANOS_OK)
+        {
+          nanos_handle_error(nanos_err);
+        }
+    }
+    {
+      nanos_err_t nanos_err;
+      nanos_ws_item_loop_t nanos_item_loop;
+      nanos_err = nanos_worksharing_next_item(wsd_1, (void **)&nanos_item_loop);
+      if (nanos_err != NANOS_OK)
+        {
+          nanos_handle_error(nanos_err);
+        }
+      while (nanos_item_loop.execute)
+        {
+          for (nanos_omp_index_0 = nanos_item_loop.lower; nanos_omp_index_0 <= nanos_item_loop.upper; nanos_omp_index_0 += 1)
+            {
+              {
+                switch (nanos_omp_index_0)
+                    {
+                      case 0 :
+                      {
+                        printf("@%d I attack the energy field!\n", (*id));
+                      }
+                      break;
+                      case 1 :
+                      {
+                        printf("@%d I attack the generator!\n", (*id));
+                      }
+                      break;
+                      case 2 :
+                      {
+                        printf("@%d I follow the rabits!\n", (*id));
+                      }
+                      break;
+                    }
+              }
+            }
+          ;
+          nanos_err = nanos_worksharing_next_item(wsd_1, (void **)&nanos_item_loop);
+        }
+    }
+    {
+      nanos_err_t nanos_err;
+      nanos_err = nanos_omp_barrier();
+      if (nanos_err != NANOS_OK)
+        {
+          nanos_handle_error(nanos_err);
+        }
+    }
+  }
+}
+struct  nanos_args_2_t
+{
+  nanos_ws_desc_t *wsd_1;
+  int *id;
+};
+static void smp_ol_main_2(struct nanos_args_2_t *const args)
+{
+  {
+    smp_ol_main_2_unpacked((*args).wsd_1, (*args).id);
+  }
+}
+extern nanos_err_t nanos_enter_team(void);
+extern int omp_get_thread_num(void);
+extern nanos_err_t nanos_omp_single(_Bool *);
+struct nanos_lock_t;
+typedef struct nanos_lock_t nanos_lock_t;
+extern nanos_err_t nanos_set_lock(nanos_lock_t *lock);
+enum mcc_enum_anon_4
+{
+  NANOS_LOCK_FREE = 0,
+  NANOS_LOCK_BUSY = 1
+};
+typedef enum mcc_enum_anon_4 nanos_lock_state_t;
+struct  nanos_lock_t
+{
+  volatile nanos_lock_state_t state_;
+};
+__attribute__((common)) nanos_lock_t nanos_default_critical_lock;
+extern nanos_err_t nanos_unset_lock(nanos_lock_t *lock);
+extern nanos_err_t nanos_in_final(_Bool *result);
+typedef void *nanos_ws_t;
+enum nanos_omp_sched_t
+{
+  nanos_omp_sched_static = 1,
+  nanos_omp_sched_dynamic = 2,
+  nanos_omp_sched_guided = 3,
+  nanos_omp_sched_auto = 4
+};
+typedef enum nanos_omp_sched_t nanos_omp_sched_t;
+extern nanos_ws_t nanos_omp_find_worksharing(nanos_omp_sched_t kind);
+struct  mcc_struct_anon_9
+{
+  int lower_bound;
+  int upper_bound;
+  int loop_step;
+  int chunk_size;
+};
+typedef struct mcc_struct_anon_9 nanos_ws_info_loop_t;
+typedef void *nanos_ws_info_t;
+extern nanos_err_t nanos_worksharing_create(nanos_ws_desc_t **wsd, nanos_ws_t ws, nanos_ws_info_t *info, _Bool *b);
+extern nanos_err_t nanos_team_get_num_supporting_threads(int *n);
+extern nanos_err_t nanos_malloc(void **p, size_t size, const char *file, int line);
+typedef void *nanos_ws_data_t;
+struct  nanos_ws_desc
+{
+  volatile nanos_ws_t ws;
+  nanos_ws_data_t data;
+  struct nanos_ws_desc *next;
+  nanos_thread_t *threads;
+  int nths;
+};
+extern nanos_err_t nanos_team_get_supporting_threads(int *n, nanos_thread_t *list_of_threads);
+typedef void *nanos_slicer_t;
+extern nanos_slicer_t nanos_find_slicer(const char *slicer);
+extern nanos_err_t nanos_create_sliced_wd(nanos_wd_t *uwd, size_t num_devices, nanos_device_t *devices, size_t outline_data_size, int outline_data_align, void **outline_data, nanos_wg_t uwg, nanos_slicer_t slicer, nanos_wd_props_t *props, nanos_wd_dyn_props_t *dyn_props, size_t num_copies, nanos_copy_data_t **copies, size_t num_dimensions, nanos_region_dimension_internal_t **dimensions);
+extern nanos_err_t nanos_free(void *p);
+extern int nanos_omp_get_thread_num(void);
+extern nanos_err_t nanos_leave_team(void);
+static void smp_ol_main_3_unpacked(void)
+{
+  {
+    nanos_err_t nanos_err;
+    nanos_err = nanos_omp_set_implicit(nanos_current_wd());
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+    nanos_err = nanos_enter_team();
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+    {
+      int id = omp_get_thread_num() + 1;
+      printf("@%d On the way to the combat zone.\n", id);
+      {
+        _Bool single_guard;
+        nanos_err_t nanos_err = nanos_omp_single(&single_guard);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+        if (single_guard)
+          {
+            {
+              printf("@%d I opened a breach in the star,\n", id);
+              printf("@%d but we can only enter one by one.\n", id);
+            }
+          }
+      }
+      {
+        nanos_err_t nanos_err;
+        nanos_err = nanos_omp_barrier();
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+      {
+        nanos_err_t nanos_err;
+        nanos_err = nanos_set_lock(&nanos_default_critical_lock);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+        {
+          printf("@%d I\'m entering the breach\n", id);
+        }
+        nanos_err = nanos_unset_lock(&nanos_default_critical_lock);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+      printf("\n@%d Someone needs to cover us!\n", id);
+      {
+        _Bool single_guard;
+        nanos_err_t nanos_err = nanos_omp_single(&single_guard);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+        if (single_guard)
+          {
+            {
+              printf("@%d I give the orders\n", id);
+              {
+                _Bool mcc_is_in_final;
+                nanos_err_t mcc_err_in_final = nanos_in_final(&mcc_is_in_final);
+                if (mcc_err_in_final != NANOS_OK)
+                  {
+                    nanos_handle_error(mcc_err_in_final);
+                  }
+                if (mcc_is_in_final)
+                  {
+                    {
+                      printf("@%d I cover your backs!\n", id);
+                    }
+                  }
+                else
+                  {
+                    {
+                      nanos_wd_dyn_props_t nanos_wd_dyn_props;
+                      struct nanos_args_0_t *ol_args;
+                      nanos_err_t nanos_err;
+                      struct nanos_args_0_t imm_args;
+                      nanos_data_access_t dependences[1L];
+                      static nanos_smp_args_t smp_ol_main_0_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_0_t *))&smp_ol_main_0};
+                      static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 0, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_0_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_0_args}}};
+                      nanos_wd_dyn_props.tie_to = 0;
+                      nanos_wd_dyn_props.priority = 0;
+                      nanos_wd_dyn_props.flags.is_final = 0;
+                      nanos_wd_dyn_props.flags.is_implicit = 0;
+                      ol_args = (struct nanos_args_0_t *)0;
+                      void *nanos_wd_ = (void *)0;
+                      nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_0_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0);
+                      if (nanos_err != NANOS_OK)
+                        {
+                          nanos_handle_error(nanos_err);
+                        }
+                      if (nanos_wd_ != (void *)0)
+                        {
+                          (*ol_args).id = id;
+                          nanos_err = nanos_submit(nanos_wd_, 0, &dependences[0], (void *)0);
+                          if (nanos_err != NANOS_OK)
+                            {
+                              nanos_handle_error(nanos_err);
+                            }
+                        }
+                      else
+                        {
+                          imm_args.id = id;
+                          nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_0_t), &imm_args, 0, &dependences[0], (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, void *))0);
+                          if (nanos_err != NANOS_OK)
+                            {
+                              nanos_handle_error(nanos_err);
+                            }
+                        }
+                    }
+                  }
+              }
+              {
+                _Bool mcc_is_in_final;
+                nanos_err_t mcc_err_in_final = nanos_in_final(&mcc_is_in_final);
+                if (mcc_err_in_final != NANOS_OK)
+                  {
+                    nanos_handle_error(mcc_err_in_final);
+                  }
+                if (mcc_is_in_final)
+                  {
+                    {
+                      printf("@%d I cover your backs as well!\n", id);
+                    }
+                  }
+                else
+                  {
+                    {
+                      nanos_wd_dyn_props_t nanos_wd_dyn_props;
+                      struct nanos_args_1_t *ol_args;
+                      nanos_err_t nanos_err;
+                      struct nanos_args_1_t imm_args;
+                      nanos_data_access_t dependences[1L];
+                      static nanos_smp_args_t smp_ol_main_1_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_1_t *))&smp_ol_main_1};
+                      static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 0, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_1_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_1_args}}};
+                      nanos_wd_dyn_props.tie_to = 0;
+                      nanos_wd_dyn_props.priority = 0;
+                      nanos_wd_dyn_props.flags.is_final = 0;
+                      nanos_wd_dyn_props.flags.is_implicit = 0;
+                      ol_args = (struct nanos_args_1_t *)0;
+                      void *nanos_wd_ = (void *)0;
+                      nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_1_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0);
+                      if (nanos_err != NANOS_OK)
+                        {
+                          nanos_handle_error(nanos_err);
+                        }
+                      if (nanos_wd_ != (void *)0)
+                        {
+                          (*ol_args).id = id;
+                          nanos_err = nanos_submit(nanos_wd_, 0, &dependences[0], (void *)0);
+                          if (nanos_err != NANOS_OK)
+                            {
+                              nanos_handle_error(nanos_err);
+                            }
+                        }
+                      else
+                        {
+                          imm_args.id = id;
+                          nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_1_t), &imm_args, 0, &dependences[0], (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, void *))0);
+                          if (nanos_err != NANOS_OK)
+                            {
+                              nanos_handle_error(nanos_err);
+                            }
+                        }
+                    }
+                  }
+              }
+            }
+          }
+      }
+      {
+        nanos_err_t nanos_err;
+        nanos_err = nanos_omp_barrier();
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+      {
+        int nanos_chunk;
+        nanos_ws_info_loop_t nanos_setup_info_loop;
+        nanos_err_t nanos_err;
+        nanos_ws_desc_t *wsd_1;
+        _Bool single_guard;
+        struct nanos_args_2_t imm_args;
+        void *current_ws_policy = nanos_omp_find_worksharing(nanos_omp_sched_static);
+        if (current_ws_policy == 0)
+          {
+            nanos_handle_error(NANOS_UNIMPLEMENTED);
+          }
+        nanos_chunk = 1;
+        nanos_setup_info_loop.lower_bound = 0;
+        nanos_setup_info_loop.upper_bound = 2;
+        nanos_setup_info_loop.loop_step = 1;
+        nanos_setup_info_loop.chunk_size = nanos_chunk;
+        nanos_err = nanos_worksharing_create(&wsd_1, current_ws_policy, (void **)&nanos_setup_info_loop, &single_guard);
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+        if (single_guard)
+          {
+            int sup_threads;
+            nanos_err = nanos_team_get_num_supporting_threads(&sup_threads);
+            if (nanos_err != NANOS_OK)
+              {
+                nanos_handle_error(nanos_err);
+              }
+            if (sup_threads > 0)
+              {
+                nanos_wd_dyn_props_t dyn_props;
+                nanos_err = nanos_malloc((void **)&(*wsd_1).threads, sizeof(void *) * sup_threads, "", 0);
+                if (nanos_err != NANOS_OK)
+                  {
+                    nanos_handle_error(nanos_err);
+                  }
+                nanos_err = nanos_team_get_supporting_threads(&(*wsd_1).nths, (*wsd_1).threads);
+                if (nanos_err != NANOS_OK)
+                  {
+                    nanos_handle_error(nanos_err);
+                  }
+                struct nanos_args_2_t *ol_args = (struct nanos_args_2_t *)0;
+                static nanos_smp_args_t smp_ol_main_2_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_2_t *))&smp_ol_main_2};
+                static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 1, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_2_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_2_args}}};
+                void *nanos_wd_ = (void *)0;
+                dyn_props.tie_to = (void *)0;
+                dyn_props.priority = 0;
+                dyn_props.flags.is_final = 0;
+                dyn_props.flags.is_implicit = 0;
+                static void *replicate = (void *)0;
+                if (replicate == (void *)0)
+                  {
+                    replicate = nanos_find_slicer("replicate");
+                  }
+                if (replicate == (void *)0)
+                  {
+                    nanos_handle_error(NANOS_UNIMPLEMENTED);
+                  }
+                nanos_err = nanos_create_sliced_wd(&nanos_wd_, nanos_wd_const_data.base.num_devices, nanos_wd_const_data.devices, (unsigned long int)sizeof(struct nanos_args_2_t), nanos_wd_const_data.base.data_alignment, (void **)&ol_args, (void **)0, replicate, &nanos_wd_const_data.base.props, &dyn_props, 0, (nanos_copy_data_t **)0, 0, (nanos_region_dimension_internal_t **)0);
+                if (nanos_err != NANOS_OK)
+                  {
+                    nanos_handle_error(nanos_err);
+                  }
+                (*ol_args).wsd_1 = wsd_1;
+                (*ol_args).id = &id;
+                nanos_err = nanos_submit(nanos_wd_, 0, (nanos_data_access_t *)0, (void *)0);
+                if (nanos_err != NANOS_OK)
+                  {
+                    nanos_handle_error(nanos_err);
+                  }
+                nanos_err = nanos_free((*wsd_1).threads);
+                if (nanos_err != NANOS_OK)
+                  {
+                    nanos_handle_error(nanos_err);
+                  }
+              }
+          }
+        imm_args.wsd_1 = wsd_1;
+        imm_args.id = &id;
+        smp_ol_main_2(&(imm_args));
+      }
+      {
+        nanos_err_t nanos_err;
+        nanos_err = nanos_omp_barrier();
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+      if (nanos_omp_get_thread_num() == 0)
+        {
+          {
+            printf("@%d Now I attack the inner core...\n", id);
+            printf("@%d ... and destroy it !\n", id);
+          }
+        }
+      {
+        nanos_err_t nanos_err;
+        nanos_err = nanos_omp_barrier();
+        if (nanos_err != NANOS_OK)
+          {
+            nanos_handle_error(nanos_err);
+          }
+      }
+      printf("@%d We\'re done!!!\n", id);
+    }
+    nanos_err = nanos_omp_barrier();
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+    nanos_err = nanos_leave_team();
+    if (nanos_err != NANOS_OK)
+      {
+        nanos_handle_error(nanos_err);
+      }
+  }
+}
+static void smp_ol_main_3(struct nanos_args_3_t *const args)
+{
+  {
+    smp_ol_main_3_unpacked();
+  }
+}
diff --git a/openmp_testing/__binaries__/benchmark b/openmp_testing/__binaries__/benchmark
new file mode 100755
index 0000000000000000000000000000000000000000..a4c12a55c2bb10c9e53e6c90614d4876d140ab10
Binary files /dev/null and b/openmp_testing/__binaries__/benchmark differ
diff --git a/openmp_testing/__binaries__/parallel-demo b/openmp_testing/__binaries__/parallel-demo
new file mode 100755
index 0000000000000000000000000000000000000000..a476143a5c5cc1963a4bc2ecbdf1218b819fe2a8
Binary files /dev/null and b/openmp_testing/__binaries__/parallel-demo differ
diff --git a/openmp_testing/__init__.py b/openmp_testing/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..718e328169ed215d7c0eee75545a82c348dce28c
--- /dev/null
+++ b/openmp_testing/__init__.py
@@ -0,0 +1,4 @@
+LD_PRELOAD = "/home/kevin/travail/Python/mcgdb/openmp/capture/preload/__binaries__/libmcgdb_omp.preload.so"
+
+from . import sequence, stepping
+
diff --git a/openmp_testing/benchmark.c b/openmp_testing/benchmark.c
new file mode 100644
index 0000000000000000000000000000000000000000..395625fac64192959f573afb59e9a5d4753a985e
--- /dev/null
+++ b/openmp_testing/benchmark.c
@@ -0,0 +1,168 @@
+#include <omp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+void do_something(int it);
+
+/***********/
+// modified by debugging, do not change to macro.
+int repeat = 2;
+
+int it_count = 50;
+int us_sleep_time = 0;
+
+int it_total = 0;
+volatile int something;
+void (*what_to_do)(int it) = NULL;
+/***********/
+
+void finish_data_ready(void) {}
+
+void finish(struct timeval x, struct timeval y) {
+  
+  //static float it_total;
+  static float ms_busy_time, us_busy_once;
+  static float ms_total_sleep;
+  static float ms_time;
+  {
+    static double x_us, y_us;
+
+    x_us = (double) x.tv_sec*1000000 + (double) x.tv_usec;
+    y_us = (double) y.tv_sec*1000000 + (double) y.tv_usec;
+
+    //it_total = repeat * it_count;
+    
+    ms_time = (y_us - x_us)/1000;
+    ms_total_sleep = us_sleep_time*(it_total/1000.0);
+    ms_busy_time = ms_time - ms_total_sleep;
+    us_busy_once = ms_busy_time * 1000 / it_total;
+  }
+
+  finish_data_ready();
+  
+  printf("Repeat: %d; Loop: %d; usleep %dus (one) %1.fms (total)\n",
+         repeat, it_count, us_sleep_time, ms_total_sleep);
+  printf("------------------\n");
+  printf("Total time: %1.fms\n", ms_time);
+  printf("Busy time : %1.fms\n", ms_busy_time);
+  printf("Busy once : %1.fus\n", us_busy_once);
+}
+
+void do_something(int it) {
+  something = it;
+#pragma omp atomic
+  it_total++;
+  if (us_sleep_time)
+    usleep(us_sleep_time);
+}
+
+void do_nothing(int it) {
+  something = it;
+}
+
+void do_single(int it) {
+  #pragma omp single
+    {
+      do_nothing(it);
+    }
+}
+
+void do_critical(int it) {
+  #pragma omp critical
+    {
+      do_nothing(it);
+    }
+}
+
+void do_sections(int it) {
+  #pragma omp sections
+    {
+      #pragma omp section
+      {
+        do_nothing(it);
+      }
+      #pragma omp section
+      {
+        do_nothing(it+1);
+      }
+      #pragma omp section
+      {
+        do_nothing(it+2);
+      }
+    }
+}
+
+void do_barrier(int it) {
+  #pragma omp barrier
+  do_nothing(it);
+}
+
+void do_master(int it) {
+  #pragma omp master
+  {
+    do_nothing(it);
+  }
+}
+
+void do_single_task(int it) {
+  #pragma omp single
+    {
+      #pragma omp task
+      {
+        //printf("Task going %d/%d.\n", it, it_count);
+        do_something(it);
+      }
+    }
+}
+
+void benchmark(void (*action)(int)) {
+  #pragma omp parallel
+  {
+    int i;
+    for (i = 0; i < it_count; ++i) {
+      do_something(i);
+      action(i);
+    }
+  }
+}
+
+void run_once(void (*what_to_do)(int)) {
+    struct timeval before , after;
+    int i;
+    
+    benchmark(what_to_do); // warm-up
+    printf("Warmup done.\n");
+    
+    it_total = 0;
+    gettimeofday(&before , NULL);
+    
+    for (i = 0; i < repeat; ++i) {
+      benchmark(what_to_do);
+    }
+
+    gettimeofday(&after , NULL);
+
+    finish(before, after);
+    
+    return;
+}
+
+
+int main(int argc, char** argv) {
+  if (what_to_do == NULL) {
+    void (*WHAT_TO_RUN[])(int) = {do_critical, do_master, do_sections, do_barrier, do_single};
+    char *NAMES[] =              {"Critical",  "Master", "Sections",   "Barrier",  "Single"};
+    
+    int NB_RUNS = sizeof(WHAT_TO_RUN)/sizeof(WHAT_TO_RUN[0]);
+    
+    for (int i = 0; i < NB_RUNS; i++) {
+      printf("\n\n---- <%s> ----\n", NAMES[i]);
+      run_once(WHAT_TO_RUN[i]);
+      printf("---- </%s> ----\n", NAMES[i]);
+    }
+  } else {
+    run_once(what_to_do);
+  }
+}
diff --git a/openmp_testing/benchmark.py b/openmp_testing/benchmark.py
new file mode 100644
index 0000000000000000000000000000000000000000..730e069a05288b3214b659914fda263d476caf8f
--- /dev/null
+++ b/openmp_testing/benchmark.py
@@ -0,0 +1,36 @@
+from gdb_tester import *
+from . import LD_PRELOAD
+gdb = None
+
+def prepare_and_run(what):
+    gdb.set_title(what.replace("do_", "").replace("_", " "))
+    gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD))
+    gdb.execute("set env OMP_NUM_THREADS=2")
+    gdb.execute_many(["autodetect_models", "start"])
+
+    gdb.execute("set what_to_do = {}".format(what))
+    gdb.execute("break finish_data_ready")
+    gdb.execute("continue")
+    gdb.execute("up")
+    
+    gdb.save_value("us_busy_once", "%1.f", "us")
+    
+WHAT_TO_RUN = [
+    "do_critical",
+    "do_master",
+    "do_sections",
+    "do_barrier",
+    "do_single",
+    "do_single_task"
+    ]
+    
+def benchmark(_gdb):
+    global gdb
+    gdb = _gdb
+
+    gdb.start(CSource("benchmark.c"))
+    for what in WHAT_TO_RUN:
+        gdb.reset(hard=True)
+        prepare_and_run(what)
+        
+    gdb.quit()
diff --git a/openmp_testing/count.py b/openmp_testing/count.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c23810b0bfa7bd9b8f124df9adbe1aa2776cad8
--- /dev/null
+++ b/openmp_testing/count.py
@@ -0,0 +1,37 @@
+from gdb_tester import *
+from . import LD_PRELOAD
+
+gdb = None
+
+def prepare_and_run(what):
+    gdb.set_title(what.replace("do_", ""))
+    
+    gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD))
+
+    gdb.execute_many(["autodetect_models", "start"])
+
+    gdb.execute("set what_to_do = {}".format(what))
+    gdb.execute("set repeat = 0")
+    gdb.execute("set it_count = 1")
+
+    gdb.execute("break finish_data_ready")
+    gdb.execute("continue")
+    gdb.execute("python import mcgdb")
+    
+    gdb.save_py_value("str(mcgdb.capture.FunctionBreakpoint.hit_count) + '+' + str( mcgdb.capture.FunctionFinishBreakpoint.hit_count)")
+    
+
+def benchmark(_gdb):
+    global gdb
+    gdb = _gdb
+
+    from . import benchmark
+    
+    gdb.start(CSource("benchmark.c"))
+    for what in benchmark.WHAT_TO_RUN:
+        gdb.reset(hard=True)
+        prepare_and_run(what)
+        
+    gdb.quit()
+
+    raise FinishException()
diff --git a/openmp_testing/no_instrumentation.py b/openmp_testing/no_instrumentation.py
new file mode 100644
index 0000000000000000000000000000000000000000..720821f56ca70f3a6de6e8f75b715fd46f2397a2
--- /dev/null
+++ b/openmp_testing/no_instrumentation.py
@@ -0,0 +1,31 @@
+from gdb_tester import *
+from . import LD_PRELOAD
+gdb = None
+
+def prepare_and_run(what):
+    gdb.set_title(what.replace("do_", ""))
+    gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD))
+
+    gdb.execute("start")
+
+    gdb.execute("set what_to_do = {}".format(what))
+    
+    gdb.execute("break finish_data_ready")
+    gdb.execute("continue")
+    gdb.execute("up")
+    gdb.execute("python import mcgdb")
+    
+    gdb.save_value("us_busy_once", "%1.f", "us")    
+
+def benchmark(_gdb):
+    global gdb
+    gdb = _gdb
+
+    from . import benchmark
+    
+    gdb.start(CSource("benchmark.c"))
+    for what in benchmark.WHAT_TO_RUN:
+        gdb.reset(hard=True)
+        prepare_and_run(what)
+        
+    gdb.quit()
diff --git a/openmp_testing/opm_seq_print.expected b/openmp_testing/opm_seq_print.expected
new file mode 100644
index 0000000000000000000000000000000000000000..e683b521a7f717391a3039fb5b370fe107ed6101
--- /dev/null
+++ b/openmp_testing/opm_seq_print.expected
@@ -0,0 +1,7 @@
+{
+  1; 2; 3; 4;
+  
+  1 -> 1 [leftnote="main"]
+  1 -> 1 [here, label="<dead>"];
+  1 <- 1 [narrow]
+}
\ No newline at end of file
diff --git a/openmp_testing/opm_seq_print_all.expected b/openmp_testing/opm_seq_print_all.expected
new file mode 100644
index 0000000000000000000000000000000000000000..890ec8226055ff97d75631b00fe40f22cd75afee
--- /dev/null
+++ b/openmp_testing/opm_seq_print_all.expected
@@ -0,0 +1,67 @@
+{
+  1; 2; 3; 4;
+  
+  1 -> 1 [leftnote="main"];
+  parallel {
+    1; 3; 4; 2;
+    
+    single {
+      1; 3; 4; 2;
+      
+      4 -> 4 [label="enter"];
+      4 <- 4 [label="exit"];
+      === <Barrier 1> ===
+    };
+    critical {
+      1; 3; 4; 2;
+      
+      3 -> 3 [label="enter"];
+      3 -> 2;
+      2 -> 4;
+      4 -> 1;
+      1 <- 1 [label="finish"]
+    };
+    single {
+      1; 3; 4; 2;
+      
+      3 -> 3 [label="enter"];
+      3 -> 3 [msg, label="Task 1"];
+      3 -> 3 [msg, label="Task 2"];
+      3 <- 3 [label="exit"];
+      === <Barrier 2> ===
+      task {
+        2;
+        
+        2 -> 2 [label="Task 1"];
+        2 <- 2
+      }
+      task {
+        1;
+        
+        1 -> 1 [label="Task 2"];
+        1 <- 1
+      }
+      === </Barrier 2> ===
+    };
+    section {
+      1; 3; 4; 2;
+      
+      1 -> 1 [label="Section #1"];
+      4 -> 4 [label="Section #3"];
+      2 -> 2 [label="Section #2"];
+      4 <- 4;
+      2 <- 2;
+      1 <- 1
+    };
+    === <Barrier 3> ===;
+    task master {
+      1;
+      
+      1 -> 1 [label="Task 3"];
+      1 <- 1
+    };
+    === <Barrier 4> ===
+  }
+  1 -> 1 [here, label="<dead>"];
+  1 <- 1 [narrow]
+}
\ No newline at end of file
diff --git a/openmp_testing/parallel-demo.c b/openmp_testing/parallel-demo.c
new file mode 100644
index 0000000000000000000000000000000000000000..6f3a8a01706b141ba93e0f2578b4bc6f190b113a
--- /dev/null
+++ b/openmp_testing/parallel-demo.c
@@ -0,0 +1,69 @@
+#include <omp.h>
+#include <stdio.h>
+
+int main() {
+  printf("@Base: Let's attack the death start !\n");
+  printf("@Base: Releash all the starfighters.\n");
+#pragma omp parallel
+  {
+    int id = omp_get_thread_num() + 1;
+
+    printf("@%d On the way to the combat zone.\n", id);
+#pragma omp single
+    {
+      printf("@%d I opened a breach in the star,\n", id);
+      printf("@%d but we can only enter one by one.\n", id);
+    }
+
+#pragma omp critical
+    {
+      printf("@%d I'm entering the breach\n", id);
+    }
+
+    /****/
+    
+    printf("\n@%d Someone needs to cover us!\n", id);
+    
+#pragma omp single
+    {
+      printf("@%d I give the orders\n", id);
+
+#pragma omp task
+      {
+        printf("@%d I cover your backs!\n", id);
+      }
+#pragma omp task
+      {
+        printf("@%d I cover your backs as well!\n", id);
+      }
+    }
+
+#pragma omp sections
+    {
+#pragma omp section
+      {
+        printf("@%d I attack the energy field!\n", id);
+      }
+#pragma omp section
+      {
+        printf("@%d I attack the generator!\n", id);
+      }
+#pragma omp section
+      {
+        printf("@%d I follow the rabits!\n", id);
+      }
+    }
+
+#pragma omp barrier
+    
+#pragma omp master
+    {
+      printf("@%d Now I attack the inner core...\n", id);
+      printf("@%d ... and destroy it !\n", id);
+    }
+#pragma omp barrier
+    
+    printf("@%d We're done!!!\n", id);
+  }
+  printf("@Base: Everybody's back to safety, great job!\n");
+}
diff --git a/openmp_testing/sequence.py b/openmp_testing/sequence.py
new file mode 100644
index 0000000000000000000000000000000000000000..7317efd41d71d5c2788719343a3e933c0dc60c1d
--- /dev/null
+++ b/openmp_testing/sequence.py
@@ -0,0 +1,16 @@
+from gdb_tester import *
+
+expected_start = """Enable model GCC OpenMP"""
+expected_print = expected_file("opm_seq_print.expected")
+expected_print_all = expected_file("opm_seq_print_all.expected")
+
+def test(gdb):
+    print("Running :)")
+
+    gdb.start(CSource("parallel-demo.c"))
+    gdb.execute_many(["autodetect_models", "run"])
+    
+    gdb.execute("opm sequence --print", expected_print, may_fail=True)
+    gdb.execute("opm sequence --print --all", expected_print_all, may_fail=True)
+
+    gdb.quit()
diff --git a/openmp_testing/stepping.py b/openmp_testing/stepping.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c4332b7563218d4aaadd5ddde088167db9dcb30
--- /dev/null
+++ b/openmp_testing/stepping.py
@@ -0,0 +1,18 @@
+from gdb_tester import *
+
+from . import LD_PRELOAD
+
+def test(gdb):
+    gdb.start(CSource("parallel-demo.c"))
+    gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD))
+
+    gdb.execute_many(["autodetect_models", "start"])
+    gdb.execute("opm start", "OpenMP parallel zone started")
+    gdb.execute("opm step", "in single zone")
+    gdb.execute("opm all_out", "Out of the single zone")
+    gdb.execute("opm step", "in critical zone")
+    gdb.execute("opm critical next", "in critical zone")
+    gdb.execute("opm critical next", "in critical zone")
+    gdb.execute("opm step out", "outside Critical zone")
+    
+    gdb.quit()