diff --git a/nix/plugins-tests.nix b/nix/plugins-tests.nix
index a500d6d0ce11b44a18ed1f1690bd1ae250eb011a..b6a83abadd16fc420eb532347994f0e9646909e9 100644
--- a/nix/plugins-tests.nix
+++ b/nix/plugins-tests.nix
@@ -24,6 +24,7 @@ mk_tests {
       @src/plugins/markdown-report/tests/ptests \
       @src/plugins/nonterm/tests/ptests \
       @src/plugins/report/tests/ptests \
+      @src/plugins/region/tests/ptests \
       @src/plugins/server/tests/ptests \
       @src/plugins/variadic/tests/ptests
   '';
diff --git a/src/plugins/region/store.ml b/src/plugins/region/store.ml
index 7e6121b5da90de713c673d1dd1460820ca7fbb0c..4e964e42b373265fedea995c5665efd92e916e39 100644
--- a/src/plugins/region/store.ml
+++ b/src/plugins/region/store.ml
@@ -32,6 +32,7 @@ type 'a store = 'a Imap.t ref
 let new_store () = ref Imap.empty
 let copy r = ref !r
 let rid = ref 0
+
 let make s v =
   let k = incr rid ; !rid in
   s := Imap.add k v !s ; k
diff --git a/src/plugins/region/tests/ptests_config b/src/plugins/region/tests/ptests_config
new file mode 100644
index 0000000000000000000000000000000000000000..316166170520da8ec5a4067d38647cf887490c58
--- /dev/null
+++ b/src/plugins/region/tests/ptests_config
@@ -0,0 +1 @@
+DEFAULT_SUITES= region
diff --git a/src/plugins/region/tests/region/fb_ADD.i b/src/plugins/region/tests/region/fb_ADD.i
new file mode 100644
index 0000000000000000000000000000000000000000..8ceb168c7af4dbce81e6776ee4fffd4b2c838ae7
--- /dev/null
+++ b/src/plugins/region/tests/region/fb_ADD.i
@@ -0,0 +1,22 @@
+typedef struct N { double v ; int s ; } *SN ;
+typedef struct L { int v ; int s ; } *SL ;
+
+typedef struct Block {
+  SN prm ;
+  SN inp1 ;
+  SN inp2 ;
+  SN inp3 ;
+  SN out1 ;
+  SN out2 ;
+  SN out3 ;
+  SL idx1 ;
+  SL idx2 ;
+  SL idx3 ;
+  SN sum ;
+} FB ;
+
+void job(FB *fb)
+{
+  fb->out1->v = fb->out1->v + fb->out2->v ;
+  fb->out1->s = fb->out1->s | fb->out2->s ;
+}
diff --git a/src/plugins/region/tests/region/fb_SORT.i b/src/plugins/region/tests/region/fb_SORT.i
new file mode 100644
index 0000000000000000000000000000000000000000..4ef65d2cfb6145f4c3266320fbeed7b8c7eb4145
--- /dev/null
+++ b/src/plugins/region/tests/region/fb_SORT.i
@@ -0,0 +1,38 @@
+typedef struct N { double v ; int s ; } *SN ;
+typedef struct L { int v ; int s ; } *SL ;
+
+typedef struct Block {
+  SN prm ;
+  SN inp1 ;
+  SN inp2 ;
+  SN inp3 ;
+  SN out1 ;
+  SN out2 ;
+  SN out3 ;
+  SL idx1 ;
+  SL idx2 ;
+  SL idx3 ;
+  SN sum ;
+} FB ;
+
+void job(FB *fb)
+{
+  SN *inp = &(fb->inp1) ;
+  SN *out = &(fb->out1) ;
+  SL *idx = &(fb->idx1) ;
+
+  for (int i = 0; i < 3; i++) {
+    out[i]->v = inp[i]->v + fb->prm->v ;
+    out[i]->s = 0 ;
+    idx[i]->v = inp[i]->s ;
+    idx[i]->s = 0 ;
+  }
+
+  fb->sum->v =
+    fb->out1->v +
+    fb->out2->v +
+    fb->out3->v ;
+
+  fb->sum->s = 0 ;
+
+}
diff --git a/src/plugins/region/tests/region/garbled.i b/src/plugins/region/tests/region/garbled.i
new file mode 100644
index 0000000000000000000000000000000000000000..6b703ba4245ba130e45827ac182b69f5dd03dfdd
--- /dev/null
+++ b/src/plugins/region/tests/region/garbled.i
@@ -0,0 +1,6 @@
+
+
+float job(int *p,int *q)
+{
+  return *q + *(float*)p + *p ;
+}
diff --git a/src/plugins/region/tests/region/oracle/fb_ADD.res.oracle b/src/plugins/region/tests/region/oracle/fb_ADD.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..84e4fe84a136c3e51118270f99079d75072b4153
--- /dev/null
+++ b/src/plugins/region/tests/region/oracle/fb_ADD.res.oracle
@@ -0,0 +1,13 @@
+[kernel] Parsing fb_ADD.i (no preprocessing)
+[region] Analyzing regions
+[region] Function job:
+  R0001: R-- fb (FB *) 64b (*R0003) ;
+  R0003: --- 704b 256..320 [1]: R0005 320..384 [1]: R0018 ;
+  R0005: R-- (struct N *) 64b (*R0008) ;
+  R0008: --- 128b 0..64 [1]: R000a 64..96 [1]: R0027 ;
+  R000a: RW- (double) 64b ;
+  R0027: RW- (int) 32b ;
+  R0018: R-- (struct N *) 64b (*R001b) ;
+  R001b: --- 128b 0..64 [1]: R001d 64..96 [1]: R003a ;
+  R001d: R-- (double) 64b ;
+  R003a: R-- (int) 32b ;
diff --git a/src/plugins/region/tests/region/oracle/fb_SORT.res.oracle b/src/plugins/region/tests/region/oracle/fb_SORT.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..eec439e3a9f3c953ecd495bca08e0b55e1775ae9
--- /dev/null
+++ b/src/plugins/region/tests/region/oracle/fb_SORT.res.oracle
@@ -0,0 +1,33 @@
+[kernel] Parsing fb_SORT.i (no preprocessing)
+[region] Analyzing regions
+[region] Function job:
+  R0003: R-- fb (FB *) 64b (*R0005) ;
+  R0005: ---
+    704b
+        0..128 [2]: R0007
+        256..320 [1]: R000e
+        320..384 [1]: R0066
+        384..512 [2]: R0015
+        640..704 [1]: R0053 ;
+  R0007: R-- (struct N *) 64b (*R0024) ;
+  R0024: --- 128b 0..64 [1]: R0026 64..96 [1]: R0046 ;
+  R0026: R-- (double) 64b ;
+  R0046: R-- (int) 32b ;
+  R000e: R-- (struct N *) 64b (*R001d) ;
+  R001d: --- 128b 0..64 [1]: R001f 64..96 [1]: R0038 ;
+  R001f: RW- (double) 64b ;
+  R0038: -W- (int) 32b ;
+  R0066: R-- (struct N *) 64b (*R0069) ;
+  R0069: --- 128b 0..64 [1]: R006b ;
+  R006b: R-- (double) 64b ;
+  R0015: R-- (struct N *) (struct L *) 64b (*R003e) ;
+  R003e: --- 64b 0..64 [2]: R0040 ;
+  R0040: RW- (int) (double) 32b ;
+  R0053: R-- (struct N *) 64b (*R0056) ;
+  R0056: --- 128b 0..64 [1]: R0058 64..96 [1]: R007f ;
+  R0058: -W- (double) 64b ;
+  R007f: -W- (int) 32b ;
+  R0001: RW- inp (SN *) 64b (*R0007) ;
+  R000a: RW- out (SN *) 64b (*R000e) ;
+  R0011: RW- idx (SL *) 64b (*R0015) ;
+  R0018: RW- i (int) 32b ;
diff --git a/src/plugins/region/tests/region/oracle/garbled.res.oracle b/src/plugins/region/tests/region/oracle/garbled.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..024e97e7a347465d0c35c9340e432a711cbe9d92
--- /dev/null
+++ b/src/plugins/region/tests/region/oracle/garbled.res.oracle
@@ -0,0 +1,8 @@
+[kernel] Parsing garbled.i (no preprocessing)
+[region] Analyzing regions
+[region] Function job:
+  R0007: R-- p (int *) 64b (*R0009) ;
+  R0009: R-- (int) (float) 32b ;
+  R0002: R-- q (int *) 64b (*R0004) ;
+  R0004: R-- (int) 32b ;
+  R0001: RW- __retres (float) 32b ;
diff --git a/src/plugins/region/tests/region/oracle/swap.res.oracle b/src/plugins/region/tests/region/oracle/swap.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..3117fb686d5ee476901cd95a19ab05fd51194ca0
--- /dev/null
+++ b/src/plugins/region/tests/region/oracle/swap.res.oracle
@@ -0,0 +1,13 @@
+[kernel] Parsing swap.i (no preprocessing)
+[region] Analyzing regions
+[region] Function swap_aliased:
+  R0004: R-- a (int *) 64b (*R0007) ;
+  R0007: RW- R: (int) 32b ;
+  R0001: R-- b (int *) 64b (*R0007) ;
+  R0008: RW- tmp (int) 32b ;
+[region] Function swap_separated:
+  R0013: R-- a (int *) 64b (*R0016) ;
+  R0016: RW- A: (int) 32b ;
+  R0017: R-- b (int *) 64b (*R001a) ;
+  R001a: RW- B: (int) 32b ;
+  R001b: RW- tmp (int) 32b ;
diff --git a/src/plugins/region/tests/region/swap.i b/src/plugins/region/tests/region/swap.i
new file mode 100644
index 0000000000000000000000000000000000000000..04816ea5fd84319d9dad1009e3cbdb643cea9272
--- /dev/null
+++ b/src/plugins/region/tests/region/swap.i
@@ -0,0 +1,29 @@
+/*@
+  requires \valid(a);
+  requires \valid(b);
+  region A: *a, B: *b;
+  ensures *a == \old(*b);
+  ensures *b == \old(*a);
+  assigns *a, *b;
+  */
+void swap_separated(int *a, int *b)
+{
+  int tmp = *a ;
+  *a = *b;
+  *b = tmp ;
+}
+
+/*@
+  requires \valid(a);
+  requires \valid(b);
+  region R: *a, *b;
+  ensures *a == \old(*b);
+  ensures *b == \old(*a);
+  assigns *a, *b;
+  */
+void swap_aliased(int *a, int *b)
+{
+  int tmp = *a ;
+  *a = *b;
+  *b = tmp ;
+}
diff --git a/src/plugins/region/tests/test_config b/src/plugins/region/tests/test_config
new file mode 100644
index 0000000000000000000000000000000000000000..4772d6b36660012dd7b95cfdc8bed12676c83fb1
--- /dev/null
+++ b/src/plugins/region/tests/test_config
@@ -0,0 +1,2 @@
+PLUGIN: region
+OPT: -region