diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index 157129f8288559069e2825d17d5c7aaf732b8990..9af1b3db183600d9da86df2a51504ae56c17b327 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -69,6 +69,18 @@ private:
 		return UnicodeString::fromUTF8(((antlr::Token*)rstr)->getText()).unescape();
 	}
 	//
+	const UnicodeString str_token_ref_to_ustring(antlr::RefToken& rstr) const { 
+		UnicodeString ret_ustr, ustr = token_ref_to_ustring(rstr);
+
+		if (ustr.length() < 3) {
+			return "";
+		}
+
+		ustr.extract(1, ustr.length() - 2, ret_ustr);
+
+		return ret_ustr;
+	}
+	//
 	const std::string token_ref_to_std_string(antlr::RefToken& rstr) const { 
 		return (((antlr::Token*)rstr)->getText());
 	}
@@ -80,7 +92,6 @@ private:
 
 // TODO
 //  - base, orth
-//  - po dodaniu reguly condit_sym jest niejednoznacznosc w in/inter/equal!!
 //  - equal do bool
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -140,10 +151,10 @@ parse_sym_set_operator
 str_set_value_in 
 	[boost::shared_ptr<Wccl::StrSet>& s_set]
   : v1: STRING { 
-		s_set->insert(token_ref_to_ustring(v1)); 
+		s_set->insert(str_token_ref_to_ustring(v1)); 
 	}
   | v2: STRING COMMA str_set_value_in [s_set] {
-    s_set->insert(token_ref_to_ustring(v2)); 
+    s_set->insert(str_token_ref_to_ustring(v2)); 
   }
 ;
 // string set, called as unnamed (temporary) StrSet: 
@@ -247,6 +258,7 @@ position_value
 position_variable_acc
 	[Wccl::Variables& vars] 
 	returns [boost::shared_ptr<Wccl::VariableAccessor<Wccl::Position> > pos_acc]
+//	: DOLLAR POS_PREFIX n: SYMBOL { 
 	: DOLLAR n: SYMBOL { 
 		vars.get_put<Wccl::Position>(token_ref_to_std_string(n));
 
@@ -274,6 +286,7 @@ position_ref_variable
 	[Wccl::Variables& vars]
 	: DOLLAR p_ref: INT n: SYMBOL { 
 		// TODO
+		vars.get_put<Wccl::Position>(token_ref_to_std_string(n));
 	}
 ;
 // ----------------------------------------------------------------------------
@@ -377,8 +390,6 @@ setvar_op
 ;
 // Implementations of setvar:
 // ----------------------------------------------------------------------------
-// setvar dla position przyjmuje position_ref_variable -> TODO sprawdzic dlaczego
-// gramatyka nie pokrywa "setvar" LPAREN position COMMA position_value RPAREN
 setvar_pos 
 	[Wccl::Variables& vars]
 	returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
@@ -465,16 +476,20 @@ condit_sym
 	boost::shared_ptr<Wccl::Function<Wccl::TSet> > p_true, p_false;
 }
 	: "if" LPAREN test  = logical_predicates [vars] COMMA 
-							p_true  = sym_set_operators  [vars] COMMA 
-							p_false = sym_set_operators  [vars] {
-		op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true, p_false));
-	}
-/*
+							p_true  = sym_set_operators  [vars] 
+							(COMMA p_false = sym_set_operators [vars])? 
+		{
+			if (p_false) {
+				op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true, p_false));
+			}
+			else {
+				op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true));
+			}
+		}
 	| Q_MARK p_true = sym_set_operators  [vars] 
 		Q_MARK test   = logical_predicates [vars] {
 		op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true));
 	}
-*/
 ;
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
@@ -585,16 +600,20 @@ condit_str
 	boost::shared_ptr<Wccl::Function<Wccl::StrSet> > p_true, p_false;
 }
 	: "if" LPAREN test  = logical_predicates [vars] COMMA 
-							p_true  = string_operators   [vars] COMMA 
-							p_false = string_operators   [vars] {
-		op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true, p_false));
+							p_true  = string_operators   [vars] 
+							(COMMA p_false = string_operators [vars])? 
+	{
+		if (p_false) {
+			op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true, p_false));
+		}
+		else {
+			op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true));
+		}
 	}
-/*
 	| Q_MARK p_true = string_operators   [vars] 
 		Q_MARK test   = logical_predicates [vars] {
 		op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true));
 	}
-*/
 ;
 
 // ----------------------------------------------------------------------------
@@ -688,24 +707,17 @@ lpred_in
 	[Wccl::Variables& vars]
 	returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
 {
-	boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2;
-	boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ss1, ss2;
-	boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2;
+	boost::shared_ptr<Wccl::Function<Wccl::TSet> > t1, t2;
+	boost::shared_ptr<Wccl::Function<Wccl::StrSet> > s1, s2;
 }
-	: "in" LPAREN ss1 = string_operators [vars] COMMA 
-	              ss2 = string_operators [vars] RPAREN {
-		op.reset(new Wccl::IsSubsetOf<Wccl::StrSet>(ss1, ss2));
+	: "in" LPAREN t1 = sym_set_operators [vars] COMMA 
+	              t2 = sym_set_operators [vars] RPAREN {
+		op.reset(new Wccl::IsSubsetOf<Wccl::TSet>(t1, t2));
 	}
-/*
-	| "in" LPAREN ts1 = sym_set_operators [vars] COMMA
-	              ts2 = sym_set_operators [vars] RPAREN {
-		op.reset(new Wccl::IsSubsetOf<Wccl::TSet>(ts1, ts2));
-	}
-	| "in" LPAREN p1 = position_operators [vars] COMMA 
-	              p2 = position_operators [vars] RPAREN {
-		// op.reset(new Wccl::IsSubsetOf(*p1.get(), *p2.get()));
+	| "in" LPAREN s1 = string_operators [vars] COMMA 
+	              s2 = string_operators [vars] RPAREN {
+		op.reset(new Wccl::IsSubsetOf<Wccl::StrSet>(s1, s2));
 	}
-*/
 ;
 
 // ----------------------------------------------------------------------------
@@ -713,22 +725,16 @@ lpred_inter
 	[Wccl::Variables& vars]
 	returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
 {
-	boost::shared_ptr<Wccl::Function<Wccl::StrSet> >   ss1, ss2;
-	boost::shared_ptr<Wccl::Function<Wccl::TSet> >     ts1, ts2;
-}
-	: "inter" LPAREN (
-			(ss1 = string_operators  [vars] COMMA  ss2 = string_operators [vars] RPAREN)
-			(ts1 = sym_set_operators [vars] COMMA  ts2 = sym_set_operators [vars] RPAREN) |
-	) {
-		if (ss1) {
-			op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2));
-		}
-		else if (ts1) {
-			op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2));
-		}
-		else {
-			assert(false);
-		}
+	boost::shared_ptr<Wccl::Function<Wccl::TSet> > t1, t2;
+	boost::shared_ptr<Wccl::Function<Wccl::StrSet> > s1, s2;
+}
+	: "inter" LPAREN s1 = string_operators  [vars] COMMA  
+									 s2 = string_operators  [vars] RPAREN {
+			op.reset(new Wccl::Intersects<Wccl::StrSet>(s1, s2));
+	}
+	| "inter" LPAREN t1 = sym_set_operators [vars] COMMA  
+									 t2 = sym_set_operators [vars] RPAREN {
+			op.reset(new Wccl::Intersects<Wccl::TSet>(t1, t2));
 	}
 ;
 
@@ -737,24 +743,27 @@ lpred_eq
 	[Wccl::Variables& vars]
 	returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
 {
-	boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2;
+	boost::shared_ptr<Wccl::Function<Wccl::TSet> > t1, t2;
+	boost::shared_ptr<Wccl::Function<Wccl::Bool> > b1, b2;
+	boost::shared_ptr<Wccl::Function<Wccl::StrSet>  > s1, s2;
 	boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2;
-	boost::shared_ptr<Wccl::Function<Wccl::StrSet>  > ss1, ss2;
 }
-	: "equal" LPAREN ss1 = string_operators [vars] COMMA 
-	                 ss2 = string_operators [vars] RPAREN {
-		op.reset(new Wccl::Equals<Wccl::StrSet>(ss1, ss2));
+	: "equal" LPAREN s1 = string_operators  [vars] COMMA  
+									 s2 = string_operators  [vars] RPAREN {
+			op.reset(new Wccl::Equals<Wccl::StrSet>(s1, s2));
 	}
-/*
-	| "equal" LPAREN ts1 = sym_set_operators [vars] COMMA
-	                 ts2 = sym_set_operators [vars] RPAREN {
-		op.reset(new Wccl::Equals<Wccl::TSet>(ts1, ts2));
+	| "equal" LPAREN t1 = sym_set_operators [vars] COMMA  
+									 t2 = sym_set_operators [vars] RPAREN {
+			op.reset(new Wccl::Equals<Wccl::TSet>(t1, t2));
 	}
 	| "equal" LPAREN p1 = position_operators [vars] COMMA 
 	                 p2 = position_operators [vars] RPAREN {
 		op.reset(new Wccl::Equals<Wccl::Position>(p1, p2));
 	}
-*/
+	| "equal" LPAREN b1 = logical_predicates [vars] COMMA
+								   b2 = logical_predicates [vars] RPAREN {
+		op.reset(new Wccl::Equals<Wccl::Bool>(b1, b2));
+	}
 ;
 
 // ----------------------------------------------------------------------------
@@ -794,9 +803,15 @@ condit_bool
 	boost::shared_ptr<Wccl::Function<Wccl::Bool> > test, p_true, p_false;
 }
 	: "if" LPAREN test  = logical_predicates [vars] COMMA 
-							p_true  = logical_predicates [vars] COMMA 
-							p_false = logical_predicates [vars] {
-		op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true, p_false));
+							p_true  = logical_predicates [vars] 
+							(COMMA p_false = logical_predicates [vars])? 
+	{
+		if (p_false) {
+			op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true, p_false));
+		}
+		else {
+			op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true));
+		}
 	}
 	| Q_MARK p_true = logical_predicates [vars] 
 		Q_MARK test   = logical_predicates [vars] {
@@ -888,12 +903,14 @@ options {
 	: "b:"
 ;
 
+/*
 POS_PREFIX
 options {
-	paraphrase = "Bool prefix";
+	paraphrase = "Position prefix";
 }
 	: "p:"
 ;
+*/
 
 LBRACKET 
 options {
@@ -964,34 +981,8 @@ options {
 	testLiterals = true; 
 }
 	: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
-//	: ('a'..'z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
 ;
 
-/*
-VAR_NAME
-options { 
-	paraphrase = "Variable name"; 
-}
-	: ('A'..'Z') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
-;
-*/
-
-/*
-TRUE_VALUE
-options {
-	paraphrase = "True value";
-}
-	: "True"
-;
-
-FALSE_VALUE
-options {
-	paraphrase = "False value";
-}
-	: "False"
-;
-*/
-
 WS
 	: ( ' '
 		| '\t'