diff --git a/tests/rules-data/match/postcond2/cclmatch-none.ccl b/tests/rules-data/match/postcond2/cclmatch-none.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..594b8220a2e47015de18115cfe49527c1ab1024d
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch-none.ccl
@@ -0,0 +1,11 @@
+apply(
+  match(
+    is("A")
+  ),
+  cond(
+    annsub(M, "B")
+  ),
+  actions(
+    mark(M, "C")
+  )
+)
diff --git a/tests/rules-data/match/postcond2/cclmatch-none.out.xml b/tests/rules-data/match/postcond2/cclmatch-none.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7b48741fe5a6070eb919fa18884500f8d394eb62
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch-none.out.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/postcond2/cclmatch.xml b/tests/rules-data/match/postcond2/cclmatch.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7b48741fe5a6070eb919fa18884500f8d394eb62
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/postcond2/cclmatch2.ccl b/tests/rules-data/match/postcond2/cclmatch2.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..75f7fb464df2ee63d1c6be79a18a70c328384343
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch2.ccl
@@ -0,0 +1,11 @@
+apply(
+  match(
+    is("B")
+  ),
+  cond(
+    annsub(M, "A")
+  ),
+  actions(
+    mark(M, "C")
+  )
+)
diff --git a/tests/rules-data/match/postcond2/cclmatch2.out.ccl b/tests/rules-data/match/postcond2/cclmatch2.out.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..999ba97a0576fedffb3716ab06f5f2fcd4205b71
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch2.out.ccl
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+    <ann chan="C" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+    <ann chan="C" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">2</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">2</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+    <ann chan="C" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+    <ann chan="C">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/postcond2/cclmatch3.ccl b/tests/rules-data/match/postcond2/cclmatch3.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..d9c9f33d9d44fdba0310c03668c9be576b2e2756
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch3.ccl
@@ -0,0 +1,5 @@
+apply(
+  match(repeat(equal(class[0], adj))),
+  cond(ann(M, "B")),
+  actions(mark(M,"C"))
+)
diff --git a/tests/rules-data/match/postcond2/cclmatch3.out.xml b/tests/rules-data/match/postcond2/cclmatch3.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c45a8fc1dff12873863dbcd5c9b34c3404950b5d
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch3.out.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+    <ann chan="C" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">1</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">1</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+    <ann chan="C">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/postcond2/cclmatch4.ccl b/tests/rules-data/match/postcond2/cclmatch4.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..6e68f17b1d2c177c43cc34d4298a8dbea44465c0
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch4.ccl
@@ -0,0 +1,5 @@
+apply(
+  match(repeat(equal(class[0], adj))),
+  cond(annsub(M, "B")),
+  actions(mark(M,"C"))
+)
diff --git a/tests/rules-data/match/postcond2/cclmatch4.out.xml b/tests/rules-data/match/postcond2/cclmatch4.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0dfe62a1d104e68b9a07bba9e79e40073d723b0e
--- /dev/null
+++ b/tests/rules-data/match/postcond2/cclmatch4.out.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+    <ann chan="C" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">1</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">1</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">2</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+    <ann chan="C">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/postcond2/simple.is-the-tagset b/tests/rules-data/match/postcond2/simple.is-the-tagset
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/tests/rules-data/match/postcond2/simple.is-the-tagset
@@ -0,0 +1 @@
+
diff --git a/tests/rules-data/match/text/cclmatch.xml b/tests/rules-data/match/text/cclmatch.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d1e4e8efee86a2c31d199fe36f149fb5c9c7cdc8
--- /dev/null
+++ b/tests/rules-data/match/text/cclmatch.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+   </tok>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>ooo</orth>
+    <lex><base>ooo</base><ctag>qub</ctag></lex>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/text/cclmatch1.ccl b/tests/rules-data/match/text/cclmatch1.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..9b1ed19378eb9d0def185a6818decd41bb4fc98d
--- /dev/null
+++ b/tests/rules-data/match/text/cclmatch1.ccl
@@ -0,0 +1,8 @@
+apply(
+  match(
+    text("Sp. z o.o.")
+  ),
+  actions(
+    mark(M, "Co")
+  )
+)
diff --git a/tests/rules-data/match/text/cclmatch1.out.xml b/tests/rules-data/match/text/cclmatch1.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a5d8c2514713841ffaf3ade1cb98d3d5128270e6
--- /dev/null
+++ b/tests/rules-data/match/text/cclmatch1.out.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+    <ann chan="Co" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+    <ann chan="Co">1</ann>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="Co">1</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="Co">1</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="Co">1</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="Co">1</ann>
+   </tok>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+    <ann chan="Co">0</ann>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+    <ann chan="Co">0</ann>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="Co">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="Co">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>ooo</orth>
+    <lex><base>ooo</base><ctag>qub</ctag></lex>
+    <ann chan="Co">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/text/cclmatch2.ccl b/tests/rules-data/match/text/cclmatch2.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..96885ffbb7bb4f741af3621a95b4d4a21518b96f
--- /dev/null
+++ b/tests/rules-data/match/text/cclmatch2.ccl
@@ -0,0 +1,12 @@
+apply(
+  match(
+    text("Sp."),
+    inter(class[0], {prep}),
+    repeat(text("o."))
+  ),
+  actions(
+    mark(:1, "Sp"),
+    mark(:2, "Z"),
+    mark(:3, "O")
+  )
+)
diff --git a/tests/rules-data/match/text/cclmatch2.out.xml b/tests/rules-data/match/text/cclmatch2.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eda51ad7674295b3adc0c8aa9d04317db7a6e848
--- /dev/null
+++ b/tests/rules-data/match/text/cclmatch2.out.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+    <ann chan="O">0</ann>
+    <ann chan="Sp" head="1">1</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+    <ann chan="O">0</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="O" head="1">1</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="O">1</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="O">1</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="O">1</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <tok>
+    <orth>Sp.</orth>
+    <lex><base>sp.</base><ctag>subst:sg:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:sg:voc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:nom:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:gen:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:dat:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:acc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:inst:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:loc:f</ctag></lex>
+    <lex><base>sp.</base><ctag>subst:pl:voc:f</ctag></lex>
+    <ann chan="Sp" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>z</orth>
+    <lex><base>z</base><ctag>prep:gen:nwok</ctag></lex>
+    <lex><base>z</base><ctag>prep:inst:nwok</ctag></lex>
+    <lex><base>z</base><ctag>qub</ctag></lex>
+    <ann chan="O">0</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>o</orth>
+    <lex><base>o</base><ctag>prep:acc</ctag></lex>
+    <lex><base>o</base><ctag>prep:loc</ctag></lex>
+    <ann chan="O" head="1">2</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>.</orth>
+    <lex><base>.</base><ctag>interp</ctag></lex>
+    <ann chan="O">2</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+   <ns/>
+   <tok>
+    <orth>ooo</orth>
+    <lex><base>ooo</base><ctag>qub</ctag></lex>
+    <ann chan="O">0</ann>
+    <ann chan="Sp">0</ann>
+    <ann chan="Z">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/variants/cclmatch.xml b/tests/rules-data/match/variants/cclmatch.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7b48741fe5a6070eb919fa18884500f8d394eb62
--- /dev/null
+++ b/tests/rules-data/match/variants/cclmatch.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/variants/cclmatch1.ccl b/tests/rules-data/match/variants/cclmatch1.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..5e4efc1b1ae12cc59b9b0390d4bcefcffdad3ab0
--- /dev/null
+++ b/tests/rules-data/match/variants/cclmatch1.ccl
@@ -0,0 +1,18 @@
+apply(
+  match(
+    longest(
+      variant(
+        inter(class[0], {noun}),
+        inter(class[0], {verb})
+      ),
+      variant(
+        is("B")
+      ),
+      variant(
+        inter(class[0], {adj})
+      )
+    )
+  ),
+  actions(mark(M, "C"))
+)
+
diff --git a/tests/rules-data/match/variants/cclmatch1.out.xml b/tests/rules-data/match/variants/cclmatch1.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b7c686294cbb038e18ba79fedf4372a817e7ee8f
--- /dev/null
+++ b/tests/rules-data/match/variants/cclmatch1.out.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+    <ann chan="C" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+    <ann chan="C" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">2</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C">2</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+    <ann chan="C" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+    <ann chan="C">3</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C" head="1">4</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C" head="1">5</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+    <ann chan="C">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/variants/cclmatch2.ccl b/tests/rules-data/match/variants/cclmatch2.ccl
new file mode 100644
index 0000000000000000000000000000000000000000..bb5fdaaec67fb1dbdb806eafdbbaa1c23a29c27e
--- /dev/null
+++ b/tests/rules-data/match/variants/cclmatch2.ccl
@@ -0,0 +1,18 @@
+apply(
+  match(
+    oneof(
+      variant(
+        inter(class[0], {adj})
+      ),
+      variant(
+        inter(class[0], {noun}),
+        inter(class[0], {verb})
+      ),
+      variant(
+        is("B")
+      )
+    )
+  ),
+  actions(mark(M, "C"))
+)
+
diff --git a/tests/rules-data/match/variants/cclmatch2.out.xml b/tests/rules-data/match/variants/cclmatch2.out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..12272275fd27b06ca59d01275599b2c3a5bcebd9
--- /dev/null
+++ b/tests/rules-data/match/variants/cclmatch2.out.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
+<cesAna xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" type="lex disamb">
+<chunkList>
+ <chunk>
+  <sentence>
+   <tok>
+    <orth>Dwa</orth>
+    <lex><base>dwa</base><ctag>other</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">1</ann>
+    <ann chan="C" head="1">1</ann>
+   </tok>
+   <tok>
+    <orth>wielkie</orth>
+    <lex><base>wielki</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B" head="1">2</ann>
+    <ann chan="C" head="1">2</ann>
+   </tok>
+   <tok>
+    <orth>włochate</orth>
+    <lex><base>włochaty</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C" head="1">3</ann>
+   </tok>
+   <tok>
+    <orth>zapchlone</orth>
+    <lex><base>zapchlić</base><ctag>adj</ctag></lex>
+    <ann chan="A">1</ann>
+    <ann chan="B">2</ann>
+    <ann chan="C" head="1">4</ann>
+   </tok>
+   <tok>
+    <orth>koty</orth>
+    <lex><base>kot</base><ctag>noun</ctag></lex>
+    <ann chan="A" head="1">1</ann>
+    <ann chan="B" head="1">3</ann>
+    <ann chan="C" head="1">5</ann>
+   </tok>
+   <tok>
+    <orth>zjadły</orth>
+    <lex><base>zjeść</base><ctag>verb</ctag></lex>
+    <ann chan="A">0</ann>
+    <ann chan="B" head="1">4</ann>
+    <ann chan="C">5</ann>
+   </tok>
+   <tok>
+    <orth>pięć</orth>
+    <lex><base>pięć</base><ctag>other</ctag></lex>
+    <ann chan="A" head="1">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C">0</ann>
+   </tok>
+   <tok>
+    <orth>tłustych</orth>
+    <lex><base>tłusty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C" head="1">6</ann>
+   </tok>
+   <tok>
+    <orth>soczystych</orth>
+    <lex><base>soczysty</base><ctag>adj</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">4</ann>
+    <ann chan="C" head="1">7</ann>
+   </tok>
+   <tok>
+    <orth>much</orth>
+    <lex><base>mucha</base><ctag>noun</ctag></lex>
+    <ann chan="A">2</ann>
+    <ann chan="B">0</ann>
+    <ann chan="C">0</ann>
+   </tok>
+  </sentence>
+ </chunk>
+</chunkList>
+</cesAna>
diff --git a/tests/rules-data/match/variants/simple.is-the-tagset b/tests/rules-data/match/variants/simple.is-the-tagset
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/tests/rules-data/match/variants/simple.is-the-tagset
@@ -0,0 +1 @@
+