diff --git a/libwccl/CMakeLists.txt b/libwccl/CMakeLists.txt
index 6f4924cc8362e28219711d3416f16e878b448708..d9cf19efb2f0b2befcc72f1b4381d8a31fa25c53 100644
--- a/libwccl/CMakeLists.txt
+++ b/libwccl/CMakeLists.txt
@@ -27,17 +27,17 @@ endif(WIN32)
 
 SET(libwccl_STAT_SRC
 	exception.cpp
-	ops/and.cpp
-	ops/affix.cpp
 	ops/formatters.cpp
-	ops/logicalpredicate.cpp
-	ops/nor.cpp
-	ops/or.cpp
-	ops/predicate.cpp
-	ops/regex.cpp
-	ops/relativeposition.cpp
-	ops/tolower.cpp
-	ops/toupper.cpp
+	ops/functions/bool/predicate.cpp
+	ops/functions/bool/predicates/and.cpp
+	ops/functions/bool/predicates/logicalpredicate.cpp
+	ops/functions/bool/predicates/nor.cpp
+	ops/functions/bool/predicates/or.cpp
+	ops/functions/bool/predicates/regex.cpp
+	ops/functions/position/relativeposition.cpp
+	ops/functions/strset/affix.cpp
+	ops/functions/strset/tolower.cpp
+	ops/functions/strset/toupper.cpp
 	parser/grammar.g
 	parser/Parser.cpp
 	parser/ParserException.cpp
diff --git a/libwccl/ops/formatters.h b/libwccl/ops/formatters.h
index 21cd119f948d6bba0104ea02ed70aa6fe445fb77..60270a6d0b10fa7c7d9610ef8e9984aa922a78f6 100644
--- a/libwccl/ops/formatters.h
+++ b/libwccl/ops/formatters.h
@@ -1,7 +1,7 @@
 #ifndef LIBWCCL_OPS_FORMATTERS_H
 #define LIBWCCL_OPS_FORMATTERS_H
 
-#include <libwccl/ops/functions.h>
+#include <libwccl/ops/function.h>
 
 namespace Wccl {
 
diff --git a/libwccl/ops/functions.h b/libwccl/ops/function.h
similarity index 100%
rename from libwccl/ops/functions.h
rename to libwccl/ops/function.h
diff --git a/libwccl/ops/predicate.cpp b/libwccl/ops/functions/bool/predicate.cpp
similarity index 100%
rename from libwccl/ops/predicate.cpp
rename to libwccl/ops/functions/bool/predicate.cpp
diff --git a/libwccl/ops/predicate.h b/libwccl/ops/functions/bool/predicate.h
similarity index 100%
rename from libwccl/ops/predicate.h
rename to libwccl/ops/functions/bool/predicate.h
diff --git a/libwccl/ops/and.cpp b/libwccl/ops/functions/bool/predicates/and.cpp
similarity index 100%
rename from libwccl/ops/and.cpp
rename to libwccl/ops/functions/bool/predicates/and.cpp
diff --git a/libwccl/ops/and.h b/libwccl/ops/functions/bool/predicates/and.h
similarity index 100%
rename from libwccl/ops/and.h
rename to libwccl/ops/functions/bool/predicates/and.h
diff --git a/libwccl/ops/equals.h b/libwccl/ops/functions/bool/predicates/equals.h
similarity index 100%
rename from libwccl/ops/equals.h
rename to libwccl/ops/functions/bool/predicates/equals.h
diff --git a/libwccl/ops/intersects.h b/libwccl/ops/functions/bool/predicates/intersects.h
similarity index 100%
rename from libwccl/ops/intersects.h
rename to libwccl/ops/functions/bool/predicates/intersects.h
diff --git a/libwccl/ops/isinside.h b/libwccl/ops/functions/bool/predicates/isinside.h
similarity index 100%
rename from libwccl/ops/isinside.h
rename to libwccl/ops/functions/bool/predicates/isinside.h
diff --git a/libwccl/ops/isoutside.h b/libwccl/ops/functions/bool/predicates/isoutside.h
similarity index 100%
rename from libwccl/ops/isoutside.h
rename to libwccl/ops/functions/bool/predicates/isoutside.h
diff --git a/libwccl/ops/issubsetof.h b/libwccl/ops/functions/bool/predicates/issubsetof.h
similarity index 100%
rename from libwccl/ops/issubsetof.h
rename to libwccl/ops/functions/bool/predicates/issubsetof.h
diff --git a/libwccl/ops/logicalpredicate.cpp b/libwccl/ops/functions/bool/predicates/logicalpredicate.cpp
similarity index 100%
rename from libwccl/ops/logicalpredicate.cpp
rename to libwccl/ops/functions/bool/predicates/logicalpredicate.cpp
diff --git a/libwccl/ops/logicalpredicate.h b/libwccl/ops/functions/bool/predicates/logicalpredicate.h
similarity index 100%
rename from libwccl/ops/logicalpredicate.h
rename to libwccl/ops/functions/bool/predicates/logicalpredicate.h
diff --git a/libwccl/ops/nor.cpp b/libwccl/ops/functions/bool/predicates/nor.cpp
similarity index 100%
rename from libwccl/ops/nor.cpp
rename to libwccl/ops/functions/bool/predicates/nor.cpp
diff --git a/libwccl/ops/nor.h b/libwccl/ops/functions/bool/predicates/nor.h
similarity index 100%
rename from libwccl/ops/nor.h
rename to libwccl/ops/functions/bool/predicates/nor.h
diff --git a/libwccl/ops/or.cpp b/libwccl/ops/functions/bool/predicates/or.cpp
similarity index 100%
rename from libwccl/ops/or.cpp
rename to libwccl/ops/functions/bool/predicates/or.cpp
diff --git a/libwccl/ops/or.h b/libwccl/ops/functions/bool/predicates/or.h
similarity index 100%
rename from libwccl/ops/or.h
rename to libwccl/ops/functions/bool/predicates/or.h
diff --git a/libwccl/ops/regex.cpp b/libwccl/ops/functions/bool/predicates/regex.cpp
similarity index 100%
rename from libwccl/ops/regex.cpp
rename to libwccl/ops/functions/bool/predicates/regex.cpp
diff --git a/libwccl/ops/regex.h b/libwccl/ops/functions/bool/predicates/regex.h
similarity index 100%
rename from libwccl/ops/regex.h
rename to libwccl/ops/functions/bool/predicates/regex.h
diff --git a/libwccl/ops/setpredicate.h b/libwccl/ops/functions/bool/predicates/setpredicate.h
similarity index 100%
rename from libwccl/ops/setpredicate.h
rename to libwccl/ops/functions/bool/predicates/setpredicate.h
diff --git a/libwccl/ops/varsetter.h b/libwccl/ops/functions/bool/varsetter.h
similarity index 100%
rename from libwccl/ops/varsetter.h
rename to libwccl/ops/functions/bool/varsetter.h
diff --git a/libwccl/ops/conditional.h b/libwccl/ops/functions/conditional.h
similarity index 100%
rename from libwccl/ops/conditional.h
rename to libwccl/ops/functions/conditional.h
diff --git a/libwccl/ops/constant.h b/libwccl/ops/functions/constant.h
similarity index 100%
rename from libwccl/ops/constant.h
rename to libwccl/ops/functions/constant.h
diff --git a/libwccl/ops/relativeposition.cpp b/libwccl/ops/functions/position/relativeposition.cpp
similarity index 100%
rename from libwccl/ops/relativeposition.cpp
rename to libwccl/ops/functions/position/relativeposition.cpp
diff --git a/libwccl/ops/relativeposition.h b/libwccl/ops/functions/position/relativeposition.h
similarity index 100%
rename from libwccl/ops/relativeposition.h
rename to libwccl/ops/functions/position/relativeposition.h
diff --git a/libwccl/ops/affix.cpp b/libwccl/ops/functions/strset/affix.cpp
similarity index 100%
rename from libwccl/ops/affix.cpp
rename to libwccl/ops/functions/strset/affix.cpp
diff --git a/libwccl/ops/affix.h b/libwccl/ops/functions/strset/affix.h
similarity index 100%
rename from libwccl/ops/affix.h
rename to libwccl/ops/functions/strset/affix.h
diff --git a/libwccl/ops/tolower.cpp b/libwccl/ops/functions/strset/tolower.cpp
similarity index 100%
rename from libwccl/ops/tolower.cpp
rename to libwccl/ops/functions/strset/tolower.cpp
diff --git a/libwccl/ops/tolower.h b/libwccl/ops/functions/strset/tolower.h
similarity index 100%
rename from libwccl/ops/tolower.h
rename to libwccl/ops/functions/strset/tolower.h
diff --git a/libwccl/ops/toupper.cpp b/libwccl/ops/functions/strset/toupper.cpp
similarity index 100%
rename from libwccl/ops/toupper.cpp
rename to libwccl/ops/functions/strset/toupper.cpp
diff --git a/libwccl/ops/toupper.h b/libwccl/ops/functions/strset/toupper.h
similarity index 100%
rename from libwccl/ops/toupper.h
rename to libwccl/ops/functions/strset/toupper.h
diff --git a/libwccl/ops/operator.h b/libwccl/ops/operator.h
index 6ac04d949b1b9eedbac4daa1358442b2f228693a..9bbb53fa94e9a97358bcaada6022101cacc16fe8 100644
--- a/libwccl/ops/operator.h
+++ b/libwccl/ops/operator.h
@@ -4,8 +4,8 @@
 #include <boost/scoped_ptr.hpp>
 
 #include <libwccl/ops/parsedexpression.h>
-#include <libwccl/ops/functions.h>
-#include <libwccl/ops/constant.h>
+#include <libwccl/ops/function.h>
+#include <libwccl/ops/functions/constant.h>
 
 namespace Wccl {
 
diff --git a/libwccl/parser/ANTLRParserResult.h b/libwccl/parser/ANTLRParserResult.h
index ebf9bc314f8572717668c7c6ea39f1285d797695..30fe9643b5c40c9a85bfb7f1231afed6e09d8d05 100644
--- a/libwccl/parser/ANTLRParserResult.h
+++ b/libwccl/parser/ANTLRParserResult.h
@@ -4,7 +4,7 @@
 #include <boost/shared_ptr.hpp>
 
 #include <libwccl/variables.h>
-#include <libwccl/ops/functions.h>
+#include <libwccl/ops/function.h>
 
 
 template<class T>
diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index 9520eeea569b579bb4dd1e6e37bd850d2b0780ec..2ba60ade5f1a9853eba193dde8f7266828faebd4 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -16,28 +16,28 @@ header {
 	#include <libwccl/sentencecontext.h>
 
 	// operators
-	#include <libwccl/ops/or.h>
-	#include <libwccl/ops/nor.h>
-	#include <libwccl/ops/and.h>
-	#include <libwccl/ops/affix.h>
-	#include <libwccl/ops/regex.h>
-	#include <libwccl/ops/equals.h>
-	#include <libwccl/ops/toupper.h>
-	#include <libwccl/ops/tolower.h>
-	#include <libwccl/ops/constant.h>
-	#include <libwccl/ops/functions.h>
-	#include <libwccl/ops/vargetter.h>
-	#include <libwccl/ops/varsetter.h>
-	#include <libwccl/ops/logicalpredicate.h>
-	
-	#include <libwccl/ops/intersects.h>
-	#include <libwccl/ops/issubsetof.h>
-	#include <libwccl/ops/setpredicate.h>
+	#include <libwccl/ops/functions/bool/predicates/or.h>
+	#include <libwccl/ops/functions/bool/predicates/nor.h>
+	#include <libwccl/ops/functions/bool/predicates/and.h>
+	#include <libwccl/ops/functions/bool/predicates/regex.h>
+	#include <libwccl/ops/functions/bool/predicates/equals.h>
+
+	#include <libwccl/ops/functions/bool/varsetter.h>
+
+	#include <libwccl/ops/functions/strset/affix.h>
+	#include <libwccl/ops/functions/strset/toupper.h>
+	#include <libwccl/ops/functions/strset/tolower.h>
+
+	#include <libwccl/ops/functions/constant.h>
+	#include <libwccl/ops/functions/vargetter.h>
+
+	#include <libwccl/ops/functions/bool/predicates/intersects.h>
+	#include <libwccl/ops/functions/bool/predicates/issubsetof.h>
 
-	#include <libwccl/ops/isinside.h>
-	#include <libwccl/ops/isoutside.h>
+	#include <libwccl/ops/functions/bool/predicates/isinside.h>
+	#include <libwccl/ops/functions/bool/predicates/isoutside.h>
 
-	#include <libwccl/ops/conditional.h>
+	#include <libwccl/ops/functions/conditional.h>
 
 	// Unicode String
 	#include <unicode/uniset.h>
diff --git a/tests/conditional.cpp b/tests/conditional.cpp
index e6e5d55b036601ffb1501919739bab303c23d3e4..f7cff57825d8d596c145105d558baea606da4212 100644
--- a/tests/conditional.cpp
+++ b/tests/conditional.cpp
@@ -3,8 +3,8 @@
 #include <boost/shared_ptr.hpp>
 #include <libcorpus2/sentence.h>
 
-#include <libwccl/ops/constant.h>
-#include <libwccl/ops/conditional.h>
+#include <libwccl/ops/functions/constant.h>
+#include <libwccl/ops/functions/conditional.h>
 
 #include <libwccl/values/bool.h>
 #include <libwccl/values/tset.h>
diff --git a/tests/constant.cpp b/tests/constant.cpp
index 08e1f0247997e806fec33a065b5ce675eaf62de0..47e4fb25a28f802342e97e2887f1e86cdcf55fcc 100644
--- a/tests/constant.cpp
+++ b/tests/constant.cpp
@@ -2,7 +2,7 @@
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 
-#include <libwccl/ops/constant.h>
+#include <libwccl/ops/functions/constant.h>
 #include <libwccl/variables.h>
 #include <libwccl/values/bool.h>
 #include <libwccl/sentencecontext.h>
diff --git a/tests/logicalpredicates.cpp b/tests/logicalpredicates.cpp
index b400bc894117a2cea5635966c510c1afc991fbde..b5cc62b8fa29f1e89140b3e26c6817e3d117ef0f 100644
--- a/tests/logicalpredicates.cpp
+++ b/tests/logicalpredicates.cpp
@@ -3,11 +3,10 @@
 #include <boost/shared_ptr.hpp>
 #include <libcorpus2/sentence.h>
 
-#include <libwccl/ops/constant.h>
-#include <libwccl/ops/logicalpredicate.h>
-#include <libwccl/ops/and.h>
-#include <libwccl/ops/or.h>
-#include <libwccl/ops/nor.h>
+#include <libwccl/ops/functions/constant.h>
+#include <libwccl/ops/functions/bool/predicates/and.h>
+#include <libwccl/ops/functions/bool/predicates/or.h>
+#include <libwccl/ops/functions/bool/predicates/nor.h>
 #include <libwccl/values/bool.h>
 #include <libwccl/sentencecontext.h>
 
diff --git a/tests/positionpredicates.cpp b/tests/positionpredicates.cpp
index 54de8e599b654198377bdc2feb967de966fd3872..7ff1a4a245f7740795635e8934a728fc38e64187 100644
--- a/tests/positionpredicates.cpp
+++ b/tests/positionpredicates.cpp
@@ -3,9 +3,9 @@
 #include <boost/shared_ptr.hpp>
 #include <libcorpus2/sentence.h>
 
-#include <libwccl/ops/constant.h>
-#include <libwccl/ops/isinside.h>
-#include <libwccl/ops/isoutside.h>
+#include <libwccl/ops/functions/constant.h>
+#include <libwccl/ops/functions/bool/predicates/isinside.h>
+#include <libwccl/ops/functions/bool/predicates/isoutside.h>
 
 using namespace Wccl;
 
diff --git a/tests/regex.cpp b/tests/regex.cpp
index 8884567a3ebaa0207679b56b86f12f5a33a2e7b4..b27a72eaef284a52c1f58a358a011c7d11ac15ba 100644
--- a/tests/regex.cpp
+++ b/tests/regex.cpp
@@ -3,8 +3,8 @@
 #include <boost/shared_ptr.hpp>
 #include <libcorpus2/sentence.h>
 
-#include <libwccl/ops/constant.h>
-#include <libwccl/ops/regex.h>
+#include <libwccl/ops/functions/constant.h>
+#include <libwccl/ops/functions/bool/predicates/regex.h>
 #include <libwccl/values/bool.h>
 #include <libwccl/values/strset.h>
 #include <libwccl/sentencecontext.h>
diff --git a/tests/relativeposition.cpp b/tests/relativeposition.cpp
index 00d70a454d0ef3abe2366774230ab4cd46147212..87dc70e404e3a5fc6955e7991fdcaaf0022b9bce 100644
--- a/tests/relativeposition.cpp
+++ b/tests/relativeposition.cpp
@@ -3,8 +3,8 @@
 #include <boost/shared_ptr.hpp>
 #include <libcorpus2/sentence.h>
 
-#include <libwccl/ops/constant.h>
-#include <libwccl/ops/relativeposition.h>
+#include <libwccl/ops/functions/constant.h>
+#include <libwccl/ops/functions/position/relativeposition.h>
 
 using namespace Wccl;
 
diff --git a/tests/strsetfunctions.cpp b/tests/strsetfunctions.cpp
index d87b40272c0070486b7b45686056692287780f9e..dad977a473b7a411fc401aa70fbda9edc37ac67c 100644
--- a/tests/strsetfunctions.cpp
+++ b/tests/strsetfunctions.cpp
@@ -6,10 +6,10 @@
 
 #include <libwccl/values/strset.h>
 #include <libwccl/sentencecontext.h>
-#include <libwccl/ops/tolower.h>
-#include <libwccl/ops/toupper.h>
-#include <libwccl/ops/affix.h>
-#include <libwccl/ops/constant.h>
+#include <libwccl/ops/functions/strset/tolower.h>
+#include <libwccl/ops/functions/strset/toupper.h>
+#include <libwccl/ops/functions/strset/affix.h>
+#include <libwccl/ops/functions/constant.h>
 
 using namespace Wccl;
 
diff --git a/tests/vargetter.cpp b/tests/vargetter.cpp
index fac84d5e4068dfc803161a25d7046a2b41868165..83ed31f4c030417f547184a71dc4d8bda76fc312 100644
--- a/tests/vargetter.cpp
+++ b/tests/vargetter.cpp
@@ -1,11 +1,11 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/bind.hpp>
 
-#include <libwccl/ops/vargetter.h>
+#include <libwccl/ops/functions/vargetter.h>
 #include <libwccl/values/bool.h>
 #include <libwccl/values/tset.h>
 #include <libwccl/values/strset.h>
-#include <libwccl/ops/constant.h>
+#include <libwccl/ops/functions/constant.h>
 
 using namespace Wccl;
 
diff --git a/tests/varsetter.cpp b/tests/varsetter.cpp
index f1445205a75ade4e319addbf8f67b9cdf5441c2d..db508f4041a5c4bc59df4c9d4062a0450cbbcf05 100644
--- a/tests/varsetter.cpp
+++ b/tests/varsetter.cpp
@@ -3,11 +3,11 @@
 
 #include <libcorpus2/tagsetmanager.h>
 
-#include <libwccl/ops/varsetter.h>
+#include <libwccl/ops/functions/bool/varsetter.h>
 #include <libwccl/values/bool.h>
 #include <libwccl/values/tset.h>
 #include <libwccl/values/strset.h>
-#include <libwccl/ops/constant.h>
+#include <libwccl/ops/functions/constant.h>
 
 using namespace Wccl;