diff --git a/src/plugins/e-acsl/gcc_test.sh b/src/plugins/e-acsl/gcc_test.sh
index 44e68c2ae9a041fa8d80bdb5933b7591940d5be1..537be69e917113cc86da38e874c4309d1bb6d639 100755
--- a/src/plugins/e-acsl/gcc_test.sh
+++ b/src/plugins/e-acsl/gcc_test.sh
@@ -1,2 +1,8 @@
 #!/bin/sh
 gcc -std=c99 -pedantic -Wall -Wno-long-long -Wno-attributes -Wno-unused-but-set-variable -fno-builtin $2 -o ./tests/e-acsl-runtime/result/gen_$1.out ./share/e-acsl/e_acsl.c ./share/e-acsl/memory_model/e_acsl_bittree.c ./share/e-acsl/memory_model/e_acsl_mmodel.c ./tests/e-acsl-runtime/result/gen_$1.c -lgmp && ./tests/e-acsl-runtime/result/gen_$1.out
+
+gcc -std=c99 -pedantic -Wall -Wno-long-long -Wno-attributes -Wno-unused-but-set-variable -fno-builtin $2 -o ./tests/e-acsl-runtime/result/gen_$1.out ./share/e-acsl/e_acsl.c ./share/e-acsl/memory_model/e_acsl_list.c ./share/e-acsl/memory_model/e_acsl_mmodel.c ./tests/e-acsl-runtime/result/gen_$1.c -lgmp && ./tests/e-acsl-runtime/result/gen_$1.out
+
+gcc -std=c99 -pedantic -Wall -Wno-long-long -Wno-attributes -Wno-unused-but-set-variable -fno-builtin $2 -o ./tests/e-acsl-runtime/result/gen_$1.out ./share/e-acsl/e_acsl.c ./share/e-acsl/memory_model/e_acsl_splay_tree.c ./share/e-acsl/memory_model/e_acsl_mmodel.c ./tests/e-acsl-runtime/result/gen_$1.c -lgmp && ./tests/e-acsl-runtime/result/gen_$1.out
+
+gcc -std=c99 -pedantic -Wall -Wno-long-long -Wno-attributes -Wno-unused-but-set-variable -fno-builtin $2 -o ./tests/e-acsl-runtime/result/gen_$1.out ./share/e-acsl/e_acsl.c ./share/e-acsl/memory_model/e_acsl_tree.c ./share/e-acsl/memory_model/e_acsl_mmodel.c ./tests/e-acsl-runtime/result/gen_$1.c -lgmp && ./tests/e-acsl-runtime/result/gen_$1.out
diff --git a/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_list.c b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_list.c
new file mode 100644
index 0000000000000000000000000000000000000000..0a92ae1f278ce7841358340c237fe9958c08b70e
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_list.c
@@ -0,0 +1,132 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2013                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         alternatives)                                                  */
+/*                                                                        */
+/*  you can redistribute it and/or modify it under the terms of the GNU   */
+/*  Lesser General Public License as published by the Free Software       */
+/*  Foundation, version 2.1.                                              */
+/*                                                                        */
+/*  It is distributed in the hope that it will be useful,                 */
+/*  but WITHOUT ANY WARRANTY; without even the implied warranty of        */
+/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         */
+/*  GNU Lesser General Public License for more details.                   */
+/*                                                                        */
+/*  See the GNU Lesser General Public License version 2.1                 */
+/*  for more details (enclosed in the file licenses/LGPLv2.1).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_mmodel_api.h"
+#include "e_acsl_mmodel.h"
+#include "stdio.h"
+
+struct _node {
+  struct _block * value;
+  struct _node * next;
+};
+
+struct _node * __list = NULL;
+
+
+void __remove_element(struct _block* ptr) {
+  struct _node * tmp1 = __list, * tmp2;
+  if(tmp1 == NULL) return;
+  tmp2 = tmp1->next;
+  
+  /* first element */
+  if(tmp1->value->ptr == ptr->ptr) {
+    __list = tmp1->next;
+    free(tmp1);
+  }
+  
+  for(; tmp2 != NULL && tmp2->value->ptr < ptr->ptr;) {
+    tmp1 = tmp2;
+    tmp2 = tmp2->next;
+  }
+  if(tmp2 == NULL) return;
+  if(tmp2->value->ptr == ptr->ptr) {
+    tmp1->next = tmp2->next;
+    free(tmp2);
+  }
+}
+
+
+void __add_element(struct _block* ptr) {
+  struct _node * tmp1 = __list, * tmp2, * new;
+  new = malloc(sizeof(struct _node));
+  if(new == NULL) return;
+  new->value = ptr;
+  new->next = NULL;
+
+  if(__list == NULL) {
+    __list = new;
+    return;
+  }
+  if(__list->value->ptr >= ptr->ptr) {
+    new->next = __list;
+    __list = new;
+    return;
+  }
+  tmp2 = tmp1->next;
+
+  for(; tmp2 != NULL && tmp2->value->ptr < ptr->ptr;) {
+    tmp1 = tmp2;
+    tmp2 = tmp2->next;
+  }
+
+  tmp1->next = new;
+  new->next = tmp2;
+}
+
+
+struct _block* __get_exact(void* ptr) {
+  struct _node * tmp = __list;
+  for(; tmp != NULL;) {
+    if(tmp->value->ptr == (size_t)ptr)
+      return tmp->value;
+    if(tmp->value->ptr > (size_t)ptr)
+      break;
+    tmp = tmp->next;
+  }
+  return NULL;
+}
+
+
+struct _block* __get_cont(void* ptr) {
+  struct _node * tmp = __list;
+  for(; tmp != NULL; tmp = tmp->next) {
+    if(tmp->value->ptr <= (size_t)ptr
+       && (size_t)ptr < tmp->value->ptr + tmp->value->size)
+      return tmp->value;
+    else if(tmp->value->ptr > (size_t)ptr)
+      break;
+  }
+  return NULL;
+}
+
+
+void __clean_struct() {
+  struct _node * next;
+  for(; __list != NULL ;) {
+    __clean_block(__list->value);
+    next = __list->next;
+    free(__list);
+    __list = next;
+  }
+}
+
+
+void __debug_struct() {
+  struct _node * tmp = __list;
+  printf("\t\t\t------------DEBUG\n");
+  for(; tmp != NULL; tmp = tmp->next) {
+    printf("\t\t\t");
+    __print_block(tmp->value);
+  }
+  printf("\t\t\t-----------------\n");
+}
+
diff --git a/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_splay_tree.c b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_splay_tree.c
new file mode 100644
index 0000000000000000000000000000000000000000..8b485fccd7a79d3272c11bf45db54f9983885cf9
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_splay_tree.c
@@ -0,0 +1,196 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2013                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         alternatives)                                                  */
+/*                                                                        */
+/*  you can redistribute it and/or modify it under the terms of the GNU   */
+/*  Lesser General Public License as published by the Free Software       */
+/*  Foundation, version 2.1.                                              */
+/*                                                                        */
+/*  It is distributed in the hope that it will be useful,                 */
+/*  but WITHOUT ANY WARRANTY; without even the implied warranty of        */
+/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         */
+/*  GNU Lesser General Public License for more details.                   */
+/*                                                                        */
+/*  See the GNU Lesser General Public License version 2.1                 */
+/*  for more details (enclosed in the file licenses/LGPLv2.1).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_mmodel_api.h"
+#include "e_acsl_mmodel.h"
+#include "stdio.h"
+
+struct _node {
+  struct _block * value;
+  struct _node * left, * right, * parent;
+};
+
+struct _node * __root = NULL;
+
+void left_rotate(struct _node * x) {
+  struct _node* y = x->right;
+  x->right = y->left;
+  if( y->left ) y->left->parent = x;
+  y->parent = x->parent;
+  if( !x->parent ) __root = y;
+  else if( x == x->parent->left ) x->parent->left = y;
+  else x->parent->right = y;
+  y->left = x;
+  x->parent = y;
+}
+
+void right_rotate(struct _node *x ) {
+  struct _node *y = x->left;
+  x->left = y->right;
+  if( y->right ) y->right->parent = x;
+  y->parent = x->parent;
+  if( !x->parent ) __root = y;
+  else if( x == x->parent->left ) x->parent->left = y;
+  else x->parent->right = y;
+  y->right = x;
+  x->parent = y;
+}
+
+void splay(struct _node *x ) {
+  while( x->parent ) {
+    if( !x->parent->parent ) {
+      if( x->parent->left == x ) right_rotate( x->parent );
+      else left_rotate( x->parent );
+    }
+    else if( x->parent->left == x && x->parent->parent->left == x->parent ) {
+      right_rotate( x->parent->parent );
+      right_rotate( x->parent );
+    }
+    else if( x->parent->right == x && x->parent->parent->right == x->parent ) {
+      left_rotate( x->parent->parent );
+      left_rotate( x->parent );
+    }
+    else if( x->parent->left == x && x->parent->parent->right == x->parent ) {
+      right_rotate( x->parent );
+      left_rotate( x->parent );
+    }
+    else {
+      left_rotate( x->parent );
+      right_rotate( x->parent );
+    }
+  }
+}
+ 
+struct _node* subtree_minimum(struct _node *u ) {
+  while( u->left ) u = u->left;
+  return u;
+}
+ 
+struct _node* subtree_maximum(struct _node *u ) {
+  while( u->right ) u = u->right;
+  return u;
+}
+
+void replace(struct _node *u, struct _node *v ) {
+  if( !u->parent ) __root = v;
+  else if( u == u->parent->left ) u->parent->left = v;
+  else u->parent->right = v;
+  if( v ) v->parent = u->parent;
+}
+
+void __remove_element(struct _block* ptr) {
+  struct _node * z = __root;
+  while(z != NULL) {
+    if(z->value->ptr > ptr->ptr) z = z->left;
+    else if(z->value->ptr < ptr->ptr) z = z->right;
+    else break;
+  }
+  if( !z ) return;
+  splay( z );
+
+  if( !z->left ) replace( z, z->right );
+  else if( !z->right ) replace( z, z->left );
+  else {
+    struct _node *y = subtree_minimum( z->right );
+    if( y->parent != z ) {
+      replace( y, y->right );
+      y->right = z->right;
+      y->right->parent = y;
+    }
+    replace( z, y );
+    y->left = z->left;
+    y->left->parent = y;
+  }
+}
+
+
+void __add_element(struct _block* ptr) {
+  struct _node *z = __root, *p = NULL;
+  while( z ) {
+    p = z;
+    if(z->value->ptr > ptr->ptr) z = z->left;
+    else if(z->value->ptr < ptr->ptr) z = z->right;
+    else return;
+  }
+  z = malloc(sizeof(struct _node));
+  z->left = z->right = NULL;
+  z->value = ptr;
+  z->parent = p;
+  if( !p ) __root = z;
+  else if(p->value->ptr < z->value->ptr) p->right = z;
+  else p->left = z;
+  splay( z );
+}
+
+
+struct _block* __get_exact(void* ptr) {
+  struct _node * tmp = __root;
+  while(tmp != NULL) {
+    if(tmp->value->ptr > (size_t)ptr) tmp = tmp->left;
+    else if(tmp->value->ptr < (size_t)ptr) tmp = tmp->right;
+    else return tmp->value;
+  }
+  return NULL;
+}
+
+
+struct _block* _get_cont_rec(struct _node * node, void* ptr) {
+  if(node == NULL) return NULL;
+  else if(node->value->ptr > (size_t)ptr) return _get_cont_rec(node->left, ptr);
+  else if(node->value->ptr+node->value->size > (size_t)ptr) return node->value;
+  else return _get_cont_rec(node->right, ptr);
+}
+
+
+struct _block* __get_cont(void* ptr) {
+  return _get_cont_rec(__root, ptr);
+}
+
+
+void __clean_rec(struct _node * ptr) {
+  if(ptr == NULL) return;
+  __clean_block(ptr->value);
+  __clean_rec(ptr->left);
+  __clean_rec(ptr->right);
+  free(ptr);
+  ptr = NULL;
+}
+
+void __clean_struct() {
+  __clean_rec(__root);
+}
+
+
+void __debug_rec(struct _node * ptr) {
+  if(ptr == NULL) return;
+  __debug_rec(ptr->left);
+  printf("\t\t\t");
+  __print_block(ptr->value);
+  __debug_rec(ptr->right);
+}
+
+void __debug_struct() {
+  printf("\t\t\t------------DEBUG\n");
+  __debug_rec(__root);
+  printf("\t\t\t-----------------\n");
+}
+
diff --git a/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_tree.c b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_tree.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c66e508520f1757f43b4feb45796b2c39ce7751
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_tree.c
@@ -0,0 +1,151 @@
+/**************************************************************************/
+/*                                                                        */
+/*  This file is part of the Frama-C's E-ACSL plug-in.                    */
+/*                                                                        */
+/*  Copyright (C) 2012-2013                                               */
+/*    CEA (Commissariat à l'énergie atomique et aux énergies              */
+/*         alternatives)                                                  */
+/*                                                                        */
+/*  you can redistribute it and/or modify it under the terms of the GNU   */
+/*  Lesser General Public License as published by the Free Software       */
+/*  Foundation, version 2.1.                                              */
+/*                                                                        */
+/*  It is distributed in the hope that it will be useful,                 */
+/*  but WITHOUT ANY WARRANTY; without even the implied warranty of        */
+/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         */
+/*  GNU Lesser General Public License for more details.                   */
+/*                                                                        */
+/*  See the GNU Lesser General Public License version 2.1                 */
+/*  for more details (enclosed in the file licenses/LGPLv2.1).            */
+/*                                                                        */
+/**************************************************************************/
+
+#include "e_acsl_mmodel_api.h"
+#include "e_acsl_mmodel.h"
+#include "stdio.h"
+
+struct _node {
+  struct _block * value;
+  struct _node * left, * right;
+};
+
+struct _node * __root = NULL;
+
+void __remove_element(struct _block* ptr) {
+  struct _node * tmp = __root, * father = NULL;
+
+  while(tmp != NULL) {
+    if(tmp->value->ptr > ptr->ptr) { father = tmp; tmp = tmp->left; }
+    else if(tmp->value->ptr < ptr->ptr) { father = tmp; tmp = tmp->right; }
+    else break;
+  }
+  if(tmp == NULL) return;
+
+  if(tmp->left == NULL) {
+    if(__root == tmp) __root = tmp->right;
+    else {
+      if(father->left == tmp) father->left = tmp->right;
+      else father->right = tmp->right;
+    }
+    free(tmp);
+  }
+  else if(tmp->right == NULL) {
+    if(__root == tmp) __root = tmp->left;
+    else {
+      if(father->left == tmp) father->left = tmp->left;
+      else father->right = tmp->left;
+    }
+    free(tmp);
+  }
+  else { /* two children */
+    struct _node * cursor = tmp->right;
+    father = tmp;
+    while(cursor->left != NULL) { father = cursor; cursor = cursor->left; }
+    tmp->value = cursor->value;
+    if(father->left == cursor) father->left = cursor->right;
+    else father->right = cursor->right;
+    free(cursor);
+  }
+}
+
+
+void __add_element(struct _block* ptr) {
+  enum {LEFT, RIGHT} pos;
+  struct _node * new, * tmp = __root, * father = NULL;
+  new = malloc(sizeof(struct _node));
+  if(new == NULL) return;
+  new->value = ptr;
+  new->left = new->right = NULL;
+  
+  if(__root == NULL) {
+    __root = new;
+    return;
+  }
+  while(tmp != NULL) {
+    father = tmp;
+    if(tmp->value->ptr >= ptr->ptr) {
+      tmp = tmp->left;
+      pos = LEFT;
+    }
+    else {
+      tmp = tmp->right;
+      pos = RIGHT;
+    }
+  }
+  if(pos == LEFT) father->left = new;
+  else father->right = new;
+}
+
+
+struct _block* __get_exact(void* ptr) {
+  struct _node * tmp = __root;
+  while(tmp != NULL) {
+    if(tmp->value->ptr > (size_t)ptr) tmp = tmp->left;
+    else if(tmp->value->ptr < (size_t)ptr) tmp = tmp->right;
+    else return tmp->value;
+  }
+  return NULL;
+}
+
+
+struct _block* _get_cont_rec(struct _node * node, void* ptr) {
+  if(node == NULL) return NULL;
+  else if(node->value->ptr > (size_t)ptr) return _get_cont_rec(node->left, ptr);
+  else if(node->value->ptr+node->value->size > (size_t)ptr) return node->value;
+  else return _get_cont_rec(node->right, ptr);
+}
+
+
+struct _block* __get_cont(void* ptr) {
+  return _get_cont_rec(__root, ptr);
+}
+
+
+void __clean_rec(struct _node * ptr) {
+  if(ptr == NULL) return;
+  __clean_block(ptr->value);
+  __clean_rec(ptr->left);
+  __clean_rec(ptr->right);
+  free(ptr);
+  ptr = NULL;
+}
+
+void __clean_struct() {
+  __clean_rec(__root);
+}
+
+
+void __debug_rec(struct _node * ptr) {
+  if(ptr == NULL) return;
+  __debug_rec(ptr->left);
+  printf("\t\t\t");
+  __print_block(ptr->value);
+  __debug_rec(ptr->right);
+}
+
+void __debug_struct() {
+  printf("\t\t\t------------DEBUG\n");
+  __debug_rec(__root);
+  printf("\t\t\t-----------------\n");
+}
+