diff --git a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c b/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
index 199cbde0cec2f98c7ab41aa6dbb86ee0fe01189f..e9fec5e0c3b60c1e21e80d0a79017a10d3ac61fd 100644
--- a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
+++ b/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
@@ -249,6 +249,7 @@ static void* bittree_store_block(void* ptr, size_t size) {
   tmp->is_readonly = false;
   tmp->freeable = false;
   bt_insert(tmp);
+  printf("Store block: %a %d\n", ptr, size);
   return tmp;
 }
 
@@ -259,6 +260,7 @@ static void bittree_delete_block(void* ptr) {
   DASSERT(tmp != NULL);
   bt_clean_block_init(tmp);
   bt_remove(tmp);
+  printf("Delete block: %a %d\n", ptr, tmp->size);
   native_free(tmp);
 }
 /* }}} */
@@ -320,7 +322,7 @@ static int bittree_posix_memalign(void **memptr, size_t alignment, size_t size)
    *  - size and alignment are greater than zero
    *  - alignment is a power of 2 and a multiple of sizeof(void*) */
   if (!size || !alignment || !powof2(alignment) || alignment%sizeof(void*))
-    return NULL;
+    return -1;
 
   /* Make sure that the first argument to posix memalign is indeed allocated */
   vassert(valid(memptr, sizeof(void*)),
@@ -408,6 +410,7 @@ static void bittree_free(void* ptr) {
     return;
   tmp = bt_lookup(ptr);
   DASSERT(tmp != NULL);
+  printf("Free block: %a %d\n", ptr, tmp->size);
   native_free(ptr);
   bt_clean_block_init(tmp);
   __e_acsl_heap_size -= tmp->size;
@@ -467,6 +470,8 @@ strong_alias(bittree_malloc,	malloc)
 strong_alias(bittree_calloc, calloc)
 strong_alias(bittree_realloc, realloc)
 strong_alias(bittree_free, free)
+strong_alias(bittree_posix_memalign, posix_memalign)
+strong_alias(bittree_aligned_alloc, aligned_alloc)
 strong_alias(bittree_delete_block, __e_acsl_delete_block)
 strong_alias(bittree_store_block, __e_acsl_store_block)
 strong_alias(offset, __e_acsl_offset)
diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/memalign.c b/src/plugins/e-acsl/tests/e-acsl-runtime/memalign.c
new file mode 100644
index 0000000000000000000000000000000000000000..f88e16873420998d41e04aa21655e3ae9524e8c3
--- /dev/null
+++ b/src/plugins/e-acsl/tests/e-acsl-runtime/memalign.c
@@ -0,0 +1,41 @@
+/* run.config
+   COMMENT: Check aligned heap memory allocation
+*/
+
+#include <stdlib.h>
+
+int posix_memalign(void **memptr, size_t alignment, size_t size);
+void *aligned_alloc(size_t alignment, size_t size);
+
+int main(int argc, const char **argv) {
+  char **memptr = malloc(sizeof(void*));
+  int res2 = posix_memalign((void**)memptr, 256, 15);
+
+  char *p = *memptr;
+  /*@assert \valid(p); */
+  /*@assert \block_length(p) == 15; */
+  /*@assert \freeable(p); */
+  free(p);
+  /*@assert ! \valid(p); */
+
+  char *a;
+  a = aligned_alloc(256, 12);
+  /*@assert a == \null; */
+
+  a = aligned_alloc(255, 512);
+  /*@assert a == \null; */
+
+  a = aligned_alloc(0, 512);
+  /*@assert a == \null; */
+
+  a = aligned_alloc(256, 512);
+  /*@assert a != \null; */
+  /*@assert \valid(a); */
+  /*@assert \block_length(a) == 512; */
+  /*@assert \freeable(a); */
+
+  free(a);
+  /*@assert ! \valid(a); */
+
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_memalign.c b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_memalign.c
new file mode 100644
index 0000000000000000000000000000000000000000..e07c52b758badeeadade797bac128254980b00dc
--- /dev/null
+++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_memalign.c
@@ -0,0 +1,137 @@
+/* Generated by Frama-C */
+int main(int argc, char const **argv)
+{
+  int __retres;
+  char **memptr;
+  int res2;
+  char *p;
+  char *a;
+  __e_acsl_memory_init(& argc,(char ***)(& argv),8UL);
+  __e_acsl_store_block((void *)(& a),8UL);
+  __e_acsl_store_block((void *)(& p),8UL);
+  __e_acsl_store_block((void *)(& memptr),8UL);
+  __e_acsl_full_init((void *)(& memptr));
+  memptr = (char **)malloc(sizeof(void *));
+  res2 = posix_memalign((void **)memptr,(unsigned long)256,(unsigned long)15);
+  __e_acsl_full_init((void *)(& p));
+  /*@ assert Value: mem_access: \valid_read(memptr); */
+  p = *memptr;
+  /*@ assert \valid(p); */
+  {
+    int __gen_e_acsl_initialized;
+    int __gen_e_acsl_and;
+    __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p),
+                                                    sizeof(char *));
+    if (__gen_e_acsl_initialized) {
+      int __gen_e_acsl_valid;
+      __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(char));
+      __gen_e_acsl_and = __gen_e_acsl_valid;
+    }
+    else __gen_e_acsl_and = 0;
+    __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main",
+                    (char *)"\\valid(p)",15);
+  }
+  /*@ assert \block_length(p) ≡ 15; */
+  {
+    unsigned long __gen_e_acsl_block_length;
+    __gen_e_acsl_block_length = __e_acsl_block_length((void *)p);
+    __e_acsl_assert(__gen_e_acsl_block_length == 15,(char *)"Assertion",
+                    (char *)"main",(char *)"\\block_length(p) == 15",16);
+  }
+  /*@ assert \freeable(p); */
+  {
+    int __gen_e_acsl_freeable;
+    __gen_e_acsl_freeable = __e_acsl_freeable((void *)p);
+    __e_acsl_assert(__gen_e_acsl_freeable,(char *)"Assertion",(char *)"main",
+                    (char *)"\\freeable(p)",17);
+  }
+  free((void *)p);
+  /*@ assert ¬\valid(p); */
+  {
+    int __gen_e_acsl_initialized_2;
+    int __gen_e_acsl_and_2;
+    __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& p),
+                                                      sizeof(char *));
+    if (__gen_e_acsl_initialized_2) {
+      int __gen_e_acsl_valid_2;
+      __gen_e_acsl_valid_2 = __e_acsl_valid((void *)p,sizeof(char));
+      __gen_e_acsl_and_2 = __gen_e_acsl_valid_2;
+    }
+    else __gen_e_acsl_and_2 = 0;
+    __e_acsl_assert(! __gen_e_acsl_and_2,(char *)"Assertion",(char *)"main",
+                    (char *)"!\\valid(p)",19);
+  }
+  __e_acsl_full_init((void *)(& a));
+  a = (char *)aligned_alloc((unsigned long)256,(unsigned long)12);
+  /*@ assert a ≡ \null; */
+  __e_acsl_assert(a == (void *)0,(char *)"Assertion",(char *)"main",
+                  (char *)"a == \\null",23);
+  __e_acsl_full_init((void *)(& a));
+  a = (char *)aligned_alloc((unsigned long)255,(unsigned long)512);
+  /*@ assert a ≡ \null; */
+  __e_acsl_assert(a == (void *)0,(char *)"Assertion",(char *)"main",
+                  (char *)"a == \\null",26);
+  __e_acsl_full_init((void *)(& a));
+  a = (char *)aligned_alloc((unsigned long)0,(unsigned long)512);
+  /*@ assert a ≡ \null; */
+  __e_acsl_assert(a == (void *)0,(char *)"Assertion",(char *)"main",
+                  (char *)"a == \\null",29);
+  __e_acsl_full_init((void *)(& a));
+  a = (char *)aligned_alloc((unsigned long)256,(unsigned long)512);
+  /*@ assert a ≢ \null; */
+  __e_acsl_assert(a != (void *)0,(char *)"Assertion",(char *)"main",
+                  (char *)"a != \\null",32);
+  /*@ assert \valid(a); */
+  {
+    int __gen_e_acsl_initialized_3;
+    int __gen_e_acsl_and_3;
+    __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& a),
+                                                      sizeof(char *));
+    if (__gen_e_acsl_initialized_3) {
+      int __gen_e_acsl_valid_3;
+      __gen_e_acsl_valid_3 = __e_acsl_valid((void *)a,sizeof(char));
+      __gen_e_acsl_and_3 = __gen_e_acsl_valid_3;
+    }
+    else __gen_e_acsl_and_3 = 0;
+    __e_acsl_assert(__gen_e_acsl_and_3,(char *)"Assertion",(char *)"main",
+                    (char *)"\\valid(a)",33);
+  }
+  /*@ assert \block_length(a) ≡ 512; */
+  {
+    unsigned long __gen_e_acsl_block_length_2;
+    __gen_e_acsl_block_length_2 = __e_acsl_block_length((void *)a);
+    __e_acsl_assert(__gen_e_acsl_block_length_2 == 512,(char *)"Assertion",
+                    (char *)"main",(char *)"\\block_length(a) == 512",34);
+  }
+  /*@ assert \freeable(a); */
+  {
+    int __gen_e_acsl_freeable_2;
+    __gen_e_acsl_freeable_2 = __e_acsl_freeable((void *)a);
+    __e_acsl_assert(__gen_e_acsl_freeable_2,(char *)"Assertion",
+                    (char *)"main",(char *)"\\freeable(a)",35);
+  }
+  free((void *)a);
+  /*@ assert ¬\valid(a); */
+  {
+    int __gen_e_acsl_initialized_4;
+    int __gen_e_acsl_and_4;
+    __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& a),
+                                                      sizeof(char *));
+    if (__gen_e_acsl_initialized_4) {
+      int __gen_e_acsl_valid_4;
+      __gen_e_acsl_valid_4 = __e_acsl_valid((void *)a,sizeof(char));
+      __gen_e_acsl_and_4 = __gen_e_acsl_valid_4;
+    }
+    else __gen_e_acsl_and_4 = 0;
+    __e_acsl_assert(! __gen_e_acsl_and_4,(char *)"Assertion",(char *)"main",
+                    (char *)"!\\valid(a)",38);
+  }
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& a));
+  __e_acsl_delete_block((void *)(& p));
+  __e_acsl_delete_block((void *)(& memptr));
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/memalign.err.oracle b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/memalign.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/memalign.res.oracle b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/memalign.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..48ed44b405da8727e629464d8dc8762c5640be83
--- /dev/null
+++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/memalign.res.oracle
@@ -0,0 +1,18 @@
+[e-acsl] beginning translation.
+FRAMAC_SHARE/libc/stdlib.h:147:[kernel] warning: No code nor implicit assigns clause for function calloc, generating default assigns from the prototype
+[e-acsl] translation done in project "e-acsl".
+tests/e-acsl-runtime/memalign.c:12:[kernel] warning: Neither code nor specification for function posix_memalign, generating default assigns from the prototype
+tests/e-acsl-runtime/memalign.c:14:[value] warning: out of bounds read. assert \valid_read(memptr);
+tests/e-acsl-runtime/memalign.c:15:[value] warning: assertion got status unknown.
+FRAMAC_SHARE/e-acsl/e_acsl.h:43:[value] warning: function __e_acsl_assert: precondition got status unknown.
+tests/e-acsl-runtime/memalign.c:16:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:17:[value] warning: assertion got status unknown.
+FRAMAC_SHARE/libc/stdlib.h:179:[value] warning: function free, behavior deallocation: precondition 'freeable' got status unknown.
+tests/e-acsl-runtime/memalign.c:19:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:22:[kernel] warning: Neither code nor specification for function aligned_alloc, generating default assigns from the prototype
+tests/e-acsl-runtime/memalign.c:23:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:26:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:29:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:32:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:33:[value] warning: assertion got status unknown.
+tests/e-acsl-runtime/memalign.c:34:[value] warning: assertion got status invalid (stopping propagation).