diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8077b4075f814ed34577e68cba4de2fdeed0b192..b522361210e61ffa2c0fc90c3da35af652d85868 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed
 
+* #31 - Queries with keywords in the path (e.g. `... STORED AT 0in.txt`)
+* #116 - Queries `FIND [ANY VERSION OF] *` and `FIND [ANY VERSION OF] ENTITY`.
+
 ### Security
 
 ## [0.3.0] - 2021-02-10
diff --git a/src/main/java/org/caosdb/server/query/CQLLexer.g4 b/src/main/java/org/caosdb/server/query/CQLLexer.g4
index ec363be59893ad72cf412dbdc9d1f6d6644da5be..85061d30cacb222dd8c866d84a7abfb525a592a9 100644
--- a/src/main/java/org/caosdb/server/query/CQLLexer.g4
+++ b/src/main/java/org/caosdb/server/query/CQLLexer.g4
@@ -23,15 +23,15 @@
 lexer grammar CQLLexer;
 
 AS_A:
-	[Aa][Ss] (EMPTY_SPACE? A)?
+	[Aa][Ss] (WHITE_SPACE_f? A)? WHITE_SPACE_f?
 ;
 
 IS_REFERENCED:
-	(IS_f EMPTY_SPACE?)? [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee][Dd]
+	(IS_f WHITE_SPACE_f?)? [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee][Dd] WHITE_SPACE_f?
 ;
 
 BY:
-	[Bb][Yy]
+	[Bb][Yy] WHITE_SPACE_f?
 ;
 
 fragment
@@ -50,69 +50,73 @@ VERSION_f:
 ;
 
 ANY_VERSION_OF:
-	(ANY_f EMPTY_SPACE VERSION_f EMPTY_SPACE OF_f)
+	(ANY_f WHITE_SPACE_f VERSION_f WHITE_SPACE_f OF_f) WHITE_SPACE_f?
 ;
 
 SELECT:
-    [Ss][Ee][Ll][Ee][Cc][Tt] -> pushMode(SELECT_MODE)
+    [Ss][Ee][Ll][Ee][Cc][Tt] WHITE_SPACE_f? -> pushMode(SELECT_MODE)
 ;
 
 INSERTED:
-	[Ii][Nn][Ss][Ee][Rr][Tt][Ee][Dd]
+	[Ii][Nn][Ss][Ee][Rr][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
 CREATED:
-	[Cc][Rr][Ee][Aa][Tt][Ee][Dd]
+	[Cc][Rr][Ee][Aa][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
 UPDATED:
-	[Uu][Pp][Dd][Aa][Tt][Ee][Dd]
+	[Uu][Pp][Dd][Aa][Tt][Ee][Dd] WHITE_SPACE_f?
 ;
 
 ON:
-	[Oo][Nn]
+	[Oo][Nn] WHITE_SPACE_f?
 ;
 
 IN:
-	[Ii][Nn]
+	[Ii][Nn] WHITE_SPACE_f?
 ;
 
 IS_STORED_AT:
-	(IS_f EMPTY_SPACE?)? [Ss][Tt][Oo][Rr][Ee][Dd] (EMPTY_SPACE? AT)?
+	(IS_f WHITE_SPACE_f?)? [Ss][Tt][Oo][Rr][Ee][Dd] (WHITE_SPACE_f? AT)? WHITE_SPACE_f?
 ;
 
 AT:
-	[Aa][Tt]
+	[Aa][Tt] WHITE_SPACE_f?
 ;
 
 FIND:
-	[Ff][Ii][Nn][Dd]
+	[Ff][Ii][Nn][Dd] WHITE_SPACE_f?
 ;
 
 COUNT:
-	[Cc][Oo][Uu][Nn][Tt]
+	[Cc][Oo][Uu][Nn][Tt] WHITE_SPACE_f?
 ;
 	
 AND:
-	( 
-		[Aa][Nn][Dd] 
-	)
-	| '&'
+	(
+		(
+			[Aa][Nn][Dd]
+		)
+		| '&'
+	) WHITE_SPACE_f?
 ;
 
 OR:
-	( 
-		[Oo][Rr] 
-	)
-	| '|'
+	(
+		(
+			[Oo][Rr]
+		)
+		| '|'
+	) WHITE_SPACE_f?
 ;
 
 LPAREN:
-	'('
+	'(' WHITE_SPACE_f?
 ;
 
 RPAREN:
-	')'
+	')' WHITE_SPACE_f?
 ;
 
 SINGLE_QUOTE_START:
@@ -131,19 +135,19 @@ OPERATOR:
 	| '>'
 	| '!='
 	| '->'
-	| [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee]([Ss]|EMPTY_SPACE? [Tt][Oo]) (EMPTY_SPACE? A {_input.LA(1) == ' '}?)? {setText("->");}
+	| [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee]([Ss]|WHITE_SPACE_f? [Tt][Oo]) (WHITE_SPACE_f? A {_input.LA(1) == ' '}?)? {setText("->");}
 ;
 
 LIKE:
-	[Ll][Ii][Kk][Ee]
+	[Ll][Ii][Kk][Ee] WHITE_SPACE_f?
 ;
 
 IS_NULL:
-	IS_f EMPTY_SPACE NULL_f
+	IS_f WHITE_SPACE_f NULL_f WHITE_SPACE_f?
 ;
 
 IS_NOT_NULL:
-	IS_f EMPTY_SPACE NOT_f EMPTY_SPACE NULL_f
+	IS_f WHITE_SPACE_f NOT_f WHITE_SPACE_f NULL_f WHITE_SPACE_f?
 ;
 
 fragment
@@ -163,7 +167,7 @@ NOT_f:
 
 fragment
 DOESNT_f:
-	DOES_f EMPTY_SPACE? NOT_f
+	DOES_f WHITE_SPACE_f? NOT_f
 	| DOES_f [Nn] SINGLE_QUOTE [Tt]
 ;
 
@@ -244,88 +248,92 @@ WASNT_f:
 ;
 
 NEGATION:
-	'!'
-	| DOESNT_f (WHITE_SPACE? HAVE_A_f)?
-	| DONT_f (WHITE_SPACE? HAVE_A_f)?
-	| HASNT_f (WHITE_SPACE? BEEN_f)?
-	| ISNT_f (WHITE_SPACE? BEEN_f)?
-	| NOT_f (WHITE_SPACE? BEEN_f)?
-	| WERENT_f (WHITE_SPACE? BEEN_f)?
-	| WASNT_f (WHITE_SPACE? BEEN_f)?
-	| HAVENT_f (WHITE_SPACE? BEEN_f)?
-	| HADNT_f (WHITE_SPACE? BEEN_f)?
+	(
+		'!'
+		| DOESNT_f (WHITE_SPACE? HAVE_A_f)?
+		| DONT_f (WHITE_SPACE? HAVE_A_f)?
+		| HASNT_f (WHITE_SPACE? BEEN_f)?
+		| ISNT_f (WHITE_SPACE? BEEN_f)?
+		| NOT_f (WHITE_SPACE? BEEN_f)?
+		| WERENT_f (WHITE_SPACE? BEEN_f)?
+		| WASNT_f (WHITE_SPACE? BEEN_f)?
+		| HAVENT_f (WHITE_SPACE? BEEN_f)?
+		| HADNT_f (WHITE_SPACE? BEEN_f)?
+	) WHITE_SPACE_f?
 ;	
 
 WITH:
-	[Ww][Ii][Tt][Hh]
+	[Ww][Ii][Tt][Hh] WHITE_SPACE_f?
 ;
 
 THE: 
-	[Tt][Hh][Ee]
+	[Tt][Hh][Ee] WHITE_SPACE_f?
 ;
 
 GREATEST:
-	[Gg][Rr][Ee][Aa][Tt][Ee][Ss][Tt]
+	[Gg][Rr][Ee][Aa][Tt][Ee][Ss][Tt] WHITE_SPACE_f?
 ;
 
 SMALLEST:
-	[Ss][Mm][Aa][Ll][Ll][Ee][Ss][Tt]
+	[Ss][Mm][Aa][Ll][Ll][Ee][Ss][Tt] WHITE_SPACE_f?
 ;
 
 A:
-	[Aa][Nn]?
+	[Aa][Nn]? WHITE_SPACE_f?
 ;
 
 ME:
-	[Mm][Ee]
+	[Mm][Ee] WHITE_SPACE_f?
 ;
 
 SOMEONE:
-	[Ss][Oo][Mm][Ee][Oo][Nn][Ee]
+	[Ss][Oo][Mm][Ee][Oo][Nn][Ee] WHITE_SPACE_f?
 ;
 
 ELSE:
-	[Ee][Ll][Ss][Ee]
+	[Ee][Ll][Ss][Ee] WHITE_SPACE_f?
 ;
 
 WHERE:
-	[Ww][Hh][Ee][Rr][Ee]
+	[Ww][Hh][Ee][Rr][Ee] WHITE_SPACE_f?
 ;
 
 WHICH:
-	[Ww][Hh][Ii][Cc][Hh]
+	[Ww][Hh][Ii][Cc][Hh] WHITE_SPACE_f?
 ;
 
 HAS_A:
-	(HAS_f | HAD_f | HAVE_f | WERE_f | WAS_f | IS_f)
 	(
-		(EMPTY_SPACE? A)
-		| (EMPTY_SPACE? BEEN_f)
-	)?
+		(HAS_f | HAD_f | HAVE_f | WERE_f | WAS_f | IS_f)
+		(
+			(WHITE_SPACE_f? A)
+			| (WHITE_SPACE_f? BEEN_f)
+		)?
+	) WHITE_SPACE_f?
 ;
 
 PROPERTY:
-	[Pp][Rr][Oo][Pp][Ee][Rr][Tt]([Yy]|[Ii][Ee][Ss])
+	[Pp][Rr][Oo][Pp][Ee][Rr][Tt]([Yy]|[Ii][Ee][Ss]) WHITE_SPACE_f?
 ;
 
 RECORDTYPE:	
-	[Rr][Ee][Cc][Oo][Rr][Dd][Tt][Yy][Pp][Ee]([Ss])?
+	[Rr][Ee][Cc][Oo][Rr][Dd][Tt][Yy][Pp][Ee]([Ss])? WHITE_SPACE_f?
 ;
 
 RECORD:
-	[Rr][Ee][Cc][Oo][Rr][Dd]([Ss])?
+	[Rr][Ee][Cc][Oo][Rr][Dd]([Ss])? WHITE_SPACE_f?
 ;
 
 FILE:
-	[Ff][Ii][Ll][Ee]([Ss])?
+	[Ff][Ii][Ll][Ee]([Ss])? WHITE_SPACE_f?
 ;
 
 ENTITY:
-    [Ee][Nn][Tt][Ii][Tt]([Yy]|[Ii][Ee][Ss])
+    [Ee][Nn][Tt][Ii][Tt]([Yy]|[Ii][Ee][Ss]) WHITE_SPACE_f?
 ;
 
 QUERYTEMPLATE:
-	[Qq][Uu][Ee][Rr][yY][Tt][Ee][Mm][Pp][Ll][Aa][Tt][Ee]
+	[Qq][Uu][Ee][Rr][yY][Tt][Ee][Mm][Pp][Ll][Aa][Tt][Ee] WHITE_SPACE_f?
 ;
 
 fragment
@@ -334,12 +342,12 @@ IS_f:
 ;
 
 fragment
-EMPTY_SPACE:
+WHITE_SPACE_f:
 	[ \t\n\r]+
 ;
 
 WHITE_SPACE:
-	[ \t\n\r]+ -> channel(HIDDEN)
+	[ \t\n\r]+
 ;
 
 fragment
@@ -365,12 +373,11 @@ REGEXP_END:
 ;
 
 ID: 
-	[Ii][Dd]
+	[Ii][Dd] WHITE_SPACE_f?
 ;
 
-// Multiple slashes should be allowed in paths instead of a single slash.
-SLASHES:
-	'/'+
+SLASH:
+	'/'
 ;
 
 STAR:
@@ -382,26 +389,26 @@ DOT:
 ;
 
 QMARK:
-	'?'
+	'?' WHITE_SPACE_f?
 ;
 
 BUT:
-	[Bb][Uu][Tt]
+	[Bb][Uu][Tt] WHITE_SPACE_f?
 ;
 
 ESC_REGEXP_END:
 	ESC_MARKER
-	'>>'
+	'>>' WHITE_SPACE_f?
 ;
 
 ESC_STAR:
 	ESC_MARKER
-	'*'
+	'*' WHITE_SPACE_f?
 ;
 
 ESC_BS:
 	ESC_MARKER
-	'\\'
+	'\\' WHITE_SPACE_f?
 ;
 
 fragment 
@@ -410,7 +417,7 @@ ESC_MARKER:
 ;
 
 TODAY:
-	[Tt][Oo][Dd][Aa][Yy]
+	[Tt][Oo][Dd][Aa][Yy] WHITE_SPACE_f?
 ;
 
 HYPHEN:
@@ -422,11 +429,17 @@ COLON:
 ;
 
 NUM:
+    NUM_f
+    | DOT NUM_f
+    | NUM_f DOT NUM_f
+;
+
+NUM_f:
 	('0'..'9')+
 ;
 
 TXT:
-	('a'..'z' | 'A'..'Z' | '_' | '-' {_input.LA(1) != '>'}? | '+' | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
+	('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-' {_input.LA(1) != '>'}? | '+' | '&' | ';' | ',' | '$' | ':' | '%' | '^' | '~' {_input.LA(1) != '='}? | '`' | '´' | 'ö' | 'ä' | 'ß' | 'ü' | 'Ö' | 'Ä' | 'Ü' | '@' | '[' | ']' | '{' | '}' )+
 ;
 
 UNKNOWN_CHAR: . ;
@@ -473,7 +486,7 @@ mode DOUBLE_QUOTE_MODE;
 mode SELECT_MODE;
 
     FROM:
-         [Ff][Rr][Oo][Mm] -> mode(DEFAULT_MODE)
+         [Ff][Rr][Oo][Mm]([ \t\n\r])? -> mode(DEFAULT_MODE)
     ;
 
     SELECT_DOT:
diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4
index 0daeff47a95ff38391ce3f9b8004bec642b0ccb2..452321c670d4101bc603e657023143025f12c22f 100644
--- a/src/main/java/org/caosdb/server/query/CQLParser.g4
+++ b/src/main/java/org/caosdb/server/query/CQLParser.g4
@@ -46,15 +46,15 @@ cq returns [Query.Type t, List<Query.Selection> s, Query.Pattern e, Query.Role r
 	   | FIND {$t = Query.Type.FIND;}
 	   | COUNT {$t = Query.Type.COUNT;})
 	(version {$v = $version.v;})?
-	(
-		(
-			role {$r = $role.r;}
-			(entity {$e = $entity.ep;})?
-		) | entity {$e = $entity.ep;}
-	)
+	( role {$r = $role.r;} )?
 	(
 		entity_filter {$filter = $entity_filter.filter;}
-	)??
+		|
+		entity WHITE_SPACE?{$e = $entity.ep;}
+		(
+			entity_filter {$filter = $entity_filter.filter;}
+		)?
+	)?
 	EOF
 ;
 
@@ -100,7 +100,7 @@ entity_filter returns [EntityFilterInterface filter]
 	which_exp
 	(
 		(
-			LPAREN
+			LPAREN WHITE_SPACE?
 			( 
 				filter_expression {$filter = $filter_expression.efi;}
 				| conjunction {$filter = $conjunction.c;} 
@@ -120,7 +120,7 @@ which_exp:
 	| HAS_A (PROPERTY)?
 	| WITH (A (PROPERTY)?)?
 	| WHERE
-	| DOT
+	| DOT WHITE_SPACE?
 ;
 
 filter_expression returns [EntityFilterInterface efi]
@@ -148,6 +148,7 @@ idfilter returns [IDFilter filter] locals [String o, String v, String a]
 	ID 
 	(
 		OPERATOR {$o = $OPERATOR.text;}
+		WHITE_SPACE?
 		value {$v = $value.str;}
 	)?
 ;
@@ -195,15 +196,14 @@ username returns [Query.Pattern ep] locals [int type]
     $ep = new Query.Pattern($text, Query.Pattern.TYPE_NORMAL);
 }
 :
-    ( STAR {$type = Query.Pattern.TYPE_LIKE;} | ESC_STAR | TXT | DOT | ESC_REGEXP_END | COLON  )+
+    ( STAR {$type = Query.Pattern.TYPE_LIKE;} | ~(STAR | WHITE_SPACE) )+
 ;
 
 transaction_time returns [String tqp]
 :
     (
         (ON | IN)
-        (value {$tqp = $value.text;}
-        | entity {$tqp = $entity.ep.toString();})
+        (value {$tqp = $value.text;})
     ) | TODAY {$tqp = TransactionFilter.TODAY;}
 ;
 
@@ -249,10 +249,10 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
 		property {$p = $property.pp; $a=$property.agg;} 
 		(
 			( 
-			  LIKE {$o = $LIKE.text;}
+			  LIKE {$o = $LIKE.text.trim();}
 			  ( like_pattern {$v = $like_pattern.ep.toString();}
 			    | value {$v = $value.str;} )
-			  | OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}
+			  | OPERATOR {$o = $OPERATOR.text;} WHITE_SPACE? value {$v = $value.str;}
 			)
 			| IS_NULL {$o = "0";}
 			| IS_NOT_NULL {$o = "!0";}
@@ -266,12 +266,12 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
 		  ( like_pattern {$v = $like_pattern.ep.toString();}
 		    | value {$v = $value.str;} )
 		)
-		| ( OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}
+		| ( OPERATOR {$o = $OPERATOR.text;} WHITE_SPACE? value {$v = $value.str;}
 		  ( AS_A
 			property {$p = $property.pp;} )?
 		)
 	)
-	
+	WHITE_SPACE?
 ;
 
 
@@ -296,9 +296,11 @@ backreference returns [Backreference ref] locals [Query.Pattern e, Query.Pattern
 	IS_REFERENCED
 	(BY A? entity {$e=$entity.ep;})?
 	( 
+		WHITE_SPACE?
 		AS_A
 		property {$p=$property.pp;}
 	)?
+	WHITE_SPACE?
 ;
 
 storedat returns [StoredAt filter] locals [String loc]
@@ -311,6 +313,7 @@ storedat returns [StoredAt filter] locals [String loc]
 :
 	IS_STORED_AT
 	location {$loc = $location.str;}
+	WHITE_SPACE?
 ;
 
 conjunction returns [Conjunction c] locals [Conjunction dummy]
@@ -321,7 +324,7 @@ conjunction returns [Conjunction c] locals [Conjunction dummy]
 	(
 		f1 = filter_expression {$c.add($f1.efi);}
 		|
-		LPAREN
+		LPAREN WHITE_SPACE?
 		(
 			f4 = filter_expression {$c.add($f4.efi);}
 			| disjunction {$c.add($disjunction.d);}
@@ -330,6 +333,7 @@ conjunction returns [Conjunction c] locals [Conjunction dummy]
 		RPAREN
 	) 
 	( 
+		WHITE_SPACE?
 		AND
 		(
 			( which_exp | A (PROPERTY)?? )
@@ -337,7 +341,7 @@ conjunction returns [Conjunction c] locals [Conjunction dummy]
 		( 
 			f2 = filter_expression {$c.add($f2.efi);}
 			| (
-				LPAREN
+				LPAREN WHITE_SPACE?
 				( 
 					f3 = filter_expression {$c.add($f3.efi);}
 					| disjunction {$c.add($disjunction.d);}
@@ -357,7 +361,7 @@ disjunction returns [Disjunction d]
 	(
 		f1 = filter_expression {$d.add($f1.efi);}
 		|
-		LPAREN
+		LPAREN WHITE_SPACE?
 		(
 			f4 = filter_expression {$d.add($f4.efi);}
 			| conjunction {$d.add($conjunction.c);}
@@ -373,7 +377,7 @@ disjunction returns [Disjunction d]
 		(
 			f2 = filter_expression {$d.add($f2.efi);}
 			| (
-				LPAREN
+				LPAREN WHITE_SPACE?
 				( 
 					f3 = filter_expression {$d.add($f3.efi);}
 					| conjunction {$d.add($conjunction.c);}
@@ -393,7 +397,7 @@ negation returns [Negation n]
 	(
 		f1 = filter_expression {$n = new Negation($f1.efi);}
 		| ( 
-			LPAREN
+			LPAREN WHITE_SPACE?
 			(	
 				f2 = filter_expression {$n = new Negation($f2.efi);}
 				| disjunction {$n = new Negation($disjunction.d);}
@@ -408,9 +412,10 @@ entity returns [Query.Pattern ep]
 : 
 	regexp_pattern {$ep = $regexp_pattern.ep;}
 	| like_pattern {$ep = $like_pattern.ep;}
-	| ( double_quoted {$ep = $double_quoted.ep;} ) 
+	| ( double_quoted {$ep = $double_quoted.ep;} )
 	| ( single_quoted {$ep = $single_quoted.ep;} )
-	| (~(SINGLE_QUOTE_START|DOUBLE_QUOTE_START|WHITE_SPACE|WHICH|DOT|WHERE|HAS_A|WITH|STAR|AND|OR))+? {$ep = new Query.Pattern((String) $text, Query.Pattern.TYPE_NORMAL);}
+	| ENTITY {$ep = new Query.Pattern((String) $text.trim(), Query.Pattern.TYPE_NORMAL);}
+	| ( ~(ENTITY |WHITE_SPACE | DOT) )+ {$ep = new Query.Pattern((String) $text.trim(), Query.Pattern.TYPE_NORMAL);}
 ;
 
 regexp_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
@@ -428,12 +433,10 @@ like_pattern returns [Query.Pattern ep] locals [StringBuffer sb]
 		$sb = new StringBuffer();
 	}
 :
-	
-	(m=~(WHITE_SPACE|WHICH|DOT|WHERE|HAS_A|WITH|STAR|LIKE|OPERATOR|AS_A|AND|OR|IS_STORED_AT|IS_REFERENCED) {$sb.append($m.text);})*?
-	(
-		STAR {$sb.append('*');}
-		(m=~(WHITE_SPACE|WHICH|DOT|WHERE|HAS_A|WITH|STAR|LIKE|OPERATOR|AS_A|AND|OR) {$sb.append($m.text);})*?
-	)+? {$ep = new Query.Pattern((String) $sb.toString(), Query.Pattern.TYPE_LIKE);}
+	~(WHITE_SPACE|DOT|LIKE|OPERATOR|AS_A|AND|OR|IS_STORED_AT|IS_REFERENCED)*?
+	STAR
+	~(WHITE_SPACE|DOT|STAR)*?
+	{$ep = new Query.Pattern((String) $text, Query.Pattern.TYPE_LIKE);}
 ;
 
 property returns [Query.Pattern pp, String agg]locals [StringBuffer sb]
@@ -446,10 +449,11 @@ property returns [Query.Pattern pp, String agg]locals [StringBuffer sb]
 	(
         regexp_pattern {$pp = $regexp_pattern.ep;}
         | like_pattern {$pp = $like_pattern.ep;}
-        | ( double_quoted {$pp = $double_quoted.ep;} ) 
+        | ( double_quoted {$pp = $double_quoted.ep;} )
         | ( single_quoted {$pp = $single_quoted.ep;} )
         | ((m=TXT | m=NUM | m=REGEXP_MARKER | m=ENTITY){$sb.append($m.text);})+  {$pp = new Query.Pattern($sb.toString(), Query.Pattern.TYPE_NORMAL);}
 	)
+	WHITE_SPACE?
 ;
 
 minmax returns [String agg]
@@ -462,29 +466,37 @@ minmax returns [String agg]
 
 value returns [String str]
 : 
-	number {$str = $text;}
+	number_with_unit {$str = $number_with_unit.text;}
 	| datetime {$str = $datetime.text;}
 	| atom {$str = $atom.ep.toString();}
+	WHITE_SPACE?
+;
+
+number_with_unit
+:
+	HYPHEN??
+	NUM
+	(WHITE_SPACE?? unit)?
 ;
 
-number
+unit
 :
-	HYPHEN?? NUM* (DOT NUM+)?
+	TXT
+	| NUM SLASH TXT
 ;
 
 location returns [String str]
 :
     atom {$str = $atom.ep.str;}
     |
-	SLASHES ?
-	((WHICH | WITH)+ SLASHES |( TXT | COLON | HYPHEN | NUM | DOT | ESC_STAR | ESC_BS | ESC_REGEXP_END | STAR )+ SLASHES ?)* {$str = $text; }
+    (~WHITE_SPACE)+ {$str = $text; }
 ;
 
 atom returns [Query.Pattern ep]
 :
     double_quoted {$ep = $double_quoted.ep;}
 	| single_quoted {$ep = $single_quoted.ep;}
-	| (TXT | NUM | REGEXP_MARKER | STAR | A )+  {$ep = new Query.Pattern($text, Query.Pattern.TYPE_NORMAL);}
+	| (~(WHITE_SPACE | DOT ))+  {$ep = new Query.Pattern($text, Query.Pattern.TYPE_NORMAL);}
 ;
 
 single_quoted returns [Query.Pattern ep] locals [StringBuffer sb, int patternType]
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 702c6fa22a0528ec0a99b1f463e18151501d0a36..0a877fc83e2f680565181655ed92c3a61cda393b 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -181,6 +181,28 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
 
     public Integer id;
     public String version;
+
+    @Override
+    public String toString() {
+      if (version == null) {
+        return Integer.toString(id);
+      }
+      return Integer.toString(id) + "@" + version;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj instanceof IdVersionPair) {
+        IdVersionPair that = (IdVersionPair) obj;
+        return this.id == that.id && this.version == that.version;
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return toString().hashCode();
+    }
   }
 
   private static boolean filterEntitiesWithoutRetrievePermisions =
@@ -445,7 +467,13 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     }
   }
 
-  public void parse() throws ParsingException {
+  /**
+   * Parse the query and run optimize() if the parameter `optimize` is true.
+   *
+   * @param optimize whether to run optimize() immediately.
+   * @throws ParsingException
+   */
+  public void parse(boolean optimize) throws ParsingException {
     final long t1 = System.currentTimeMillis();
     CQLLexer lexer;
     lexer = new CQLLexer(CharStreams.fromString(this.query));
@@ -471,29 +499,96 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     if (t2 - t1 > 1000) {
       addBenchmark("LONG_PARSING: " + this.query, t2 - t1);
     }
+
+    if (optimize) {
+      optimize();
+    }
+  }
+
+  /**
+   * Parse the query and run optimize() immediately.
+   *
+   * @throws ParsingException
+   */
+  public void parse() throws ParsingException {
+    parse(true);
+  }
+
+  /**
+   * Optimize the query after parsing. The optimization is purely based on formal rules.
+   *
+   * <p>Implemented rules:
+   *
+   * <ol>
+   *   <li>FIND * -> FIND ENTITY (which basically prevents to copy the complete entity table just to
+   *       read out the ids immediately).
+   * </ol>
+   */
+  public void optimize() {
+    // basic optimization
+    if (this.entity != null
+        && this.entity.type == Pattern.TYPE_LIKE
+        && this.entity.str.equals("*")) {
+      this.entity = null;
+      if (this.role == null) {
+        this.role = Role.ENTITY;
+      }
+    }
   }
 
   private String executeStrategy(boolean versioned) throws QueryException {
     if (this.entity != null) {
       return sourceStrategy(initQuery(versioned));
+    } else if (this.role == Role.ENTITY && this.filter == null) {
+      return "entities";
     } else {
       return targetStrategy(initQuery(versioned));
     }
   }
 
+  /**
+   * Generate a SQL statement which reads out the resulting ids (and version ids if `versioned` is
+   * true).
+   *
+   * <p>If the parameter `resultSetTableName` is "entities" actually the entity_version table is
+   * used to fetch all ids.
+   *
+   * @param resultSetTableName name of the table with all the resulting entities
+   * @param versioned whether the query was versioned
+   * @return an SQL statement
+   * @throws QueryException
+   */
+  private String generateSelectStatementForResultSet(
+      final String resultSetTableName, boolean versioned) {
+    if (resultSetTableName.equals("entities")) {
+      return "SELECT entity_id AS id"
+          + (versioned ? ", version AS version" : "")
+          + " FROM entity_version"
+          + (versioned ? "" : " WHERE `_iversion` = 1");
+    }
+    return "SELECT results.id AS id"
+        + (versioned ? ", ev.version AS version" : "")
+        + " FROM `"
+        + resultSetTableName
+        + "` AS results"
+        + (versioned
+            ? " JOIN entity_version AS ev ON (results.id = ev.entity_id AND results._iversion = ev._iversion)"
+            : "");
+  }
+
+  /**
+   * Return a list of all resulting entities (versions of entities if `versioned` is true).
+   *
+   * @param resultSetTableName name of the table with all the resulting entities
+   * @param versioned whether the query was versioned
+   * @return list of results of this query.
+   * @throws QueryException
+   */
   private List<IdVersionPair> getResultSet(final String resultSetTableName, boolean versioned)
       throws QueryException {
     ResultSet finishResultSet = null;
     try {
-      final String sql =
-          "Select results.id AS id"
-              + (versioned ? ", ev.version AS version" : "")
-              + " from `"
-              + resultSetTableName
-              + "` AS results"
-              + (versioned
-                  ? " JOIN entity_version AS ev ON (results.id = ev.entity_id AND results._iversion = ev._iversion)"
-                  : "");
+      final String sql = generateSelectStatementForResultSet(resultSetTableName, versioned);
       final PreparedStatement finish = getConnection().prepareStatement(sql);
       finishResultSet = finish.executeQuery();
       final List<IdVersionPair> rs = new LinkedList<>();
@@ -869,4 +964,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     if (this.filter != null) sb.append(this.filter.getCacheKey());
     return sb.toString();
   }
+
+  public Pattern getEntity() {
+    return this.entity;
+  }
+
+  public Role getRole() {
+    return this.role;
+  }
 }
diff --git a/src/test/java/org/caosdb/server/query/QueryTest.java b/src/test/java/org/caosdb/server/query/QueryTest.java
index 092ebfcf833e6e60ff4edbb095a0759739975141..edbefab78fdfb5846c59a058fdfb67b55a6707cb 100644
--- a/src/test/java/org/caosdb/server/query/QueryTest.java
+++ b/src/test/java/org/caosdb/server/query/QueryTest.java
@@ -1,6 +1,7 @@
 package org.caosdb.server.query;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import java.io.IOException;
 import org.caosdb.server.CaosDBServer;
@@ -48,4 +49,16 @@ public class QueryTest {
         "ename@(ref1,null)SUB(POV(pname,>,val1)",
         getCacheKey("FIND ename WHICH IS REFERENCED BY ref1 WITH pname > val1 "));
   }
+
+  @Test
+  public void testOptimizationOfFindStar() {
+    Query q = new Query("FIND *");
+    q.parse(false);
+    assertEquals("*", q.getEntity().str);
+    assertNull(q.getRole());
+
+    q.optimize();
+    assertNull(q.getEntity());
+    assertEquals(Query.Role.ENTITY, q.getRole());
+  }
 }
diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java
index 2f6651cc81a2614b63f1314f35052fe2096758b0..2c28d7f59c018f90ce77e9f7691a362027655466 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -65,9 +65,8 @@ public class TestCQL {
   String query1e = "FIND ename . pname1";
   String query2 = "FIND ename.pname1=val1 OR pname2=val2";
   String query3 = "FIND ename.pname1=val1 AND pname2=val2 AND pname3=val3";
-  // String query4 =
-  // "FIND ename WHICH HAS A PROPERTY pname1=val1 AND pname1 HAS A PROPERTY
-  // pname2=val2";
+  String query4 =
+      "FIND ename WHICH HAS A PROPERTY pname1=val1 AND pname1 HAS A PROPERTY pname2=val2";
   String query5 = "FIND ename WHICH HAS A PROPERTY pname1=val1 AND (pname2=val2 OR pname3=val3)";
   String query6 = "FIND ename1 WHICH HAS A pname REFERENCE TO ename2";
   String query6a = "FIND ename1 WHICH REFERENCES ename2 AS A pname";
@@ -148,8 +147,13 @@ public class TestCQL {
   String query27b = "FIND 'Some name with spaces and 1234 numbers and \"'";
   String query27c = "FIND 'Some name with spaces and 1234 numbers and \\*'";
   String query27d = "FIND 'Some name with spaces and 1234 numbers and *'";
-  String query28 = "FIND ename . pname=2.0";
+  String query28 = "FIND ename . pname=2.02";
   String query28a = "FIND ename . pname=2.0prop=test";
+  String query28b = "FIND ename . pname = 1.02m";
+  String query28c = "FIND ename . pname = .02";
+  String query28d = "FIND ename . pname =.02m";
+  String query28e = "FIND ename . pname =.02 1/m^2";
+
   String ticket148 =
       "FIND RECORD FrequencyMeasurement WHICH HAS A PROPERTY ( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016') AND A PROPERTY MinPeakHeight = '0.5'";
   String ticket148a =
@@ -213,13 +217,26 @@ public class TestCQL {
   String query54b = "SELECT field with spaces FROM RECORD ename";
   String query54c = "SELECT field1, field2, field3 FROM RECORD ename";
   String query54d = "SELECT field1.subfield1, field1.subfield2, field2.*, field3 FROM RECORD ename";
+  String query54e = "SELECT id FROM ename";
   String query55a = "FIND FILE WHICH IS STORED AT /dir/with/date/2016-05-15";
   String query55b = "FIND FILE WHICH IS STORED AT /dir/with/date/2016-05-15/**";
   String query56a = "FIND RECORD WHICH REFERENCES anna";
   String query56b = "FIND RECORD WHICH REFERENCES AN ename2";
   String query56c = "FIND RECORD WHICH REFERENCES atom";
   String query56d = "FIND RECORD WHICH REFERENCES A tom";
+  String query57a = "FIND ENTITY";
+  String query57b = "FIND ENTITY WITH ID";
+  String query57c = "FIND ENTITY WITH ID = 123";
+
+  // strange names and values
+  String query58a = "FIND ENTITY WITH endswith";
+  String query58b = "FIND ENTITY WITH endswith = val1";
+  String query58c = "FIND ENTITY WITH 0with = val1";
+  String query58d = "FIND ENTITY.withdrawn=TRUE";
+  String query58e = "FIND ENTITY WITH pname=with";
+
   String queryIssue31 = "FIND FILE WHICH IS STORED AT /data/in0.foo";
+  String queryIssue116 = "FIND *";
 
   // File paths ///////////////////////////////////////////////////////////////
   String filepath_verb01 = "/foo/";
@@ -259,7 +276,7 @@ public class TestCQL {
 
     // 4 children: FIND, EMPTY_SPACE, entity, entity_filter
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -306,19 +323,19 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WITHpname1=val1", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WITH pname1=val1", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WITH", entity_filter.getChild(0).getText());
+    assertEquals("WITH ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname1=val1", entity_filter.getChild(1).getText());
@@ -353,19 +370,19 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WHICHHAS APROPERTYpname1=val1", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WHICH HAS A PROPERTY pname1=val1", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP,conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname1=val1", entity_filter.getChild(1).getText());
@@ -401,19 +418,19 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WHICHHAS Apname1=val1", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WHICH HAS A pname1=val1", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname1=val1", entity_filter.getChild(1).getText());
@@ -454,21 +471,21 @@ public class TestCQL {
     }
     System.out.println("query1d: " + sfq.toStringTree(parser));
 
-    // 5 children: FIND, role, entity, filter, EOF
+    // 6 children: FIND, role, entity, WHITE_SPACE, filter, EOF
     // entity_filter
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("ename", sfq.getChild(2).getText());
-    assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WHICHHAS Apname1=val1", sfq.getChild(3).getText());
-    final ParseTree entity_filter = sfq.getChild(3);
+    assertEquals("WHICH HAS A pname1=val1", sfq.getChild(4).getText());
+    assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
+    final ParseTree entity_filter = sfq.getChild(4);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname1=val1", entity_filter.getChild(1).getText());
@@ -512,20 +529,19 @@ public class TestCQL {
     }
     System.out.println("query1e: " + sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, entity, EOF
-    // entity_filter
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals(".pname1", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals(". pname1", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals(".", entity_filter.getChild(0).getText());
+    assertEquals(". ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname1", entity_filter.getChild(1).getText());
@@ -563,12 +579,12 @@ public class TestCQL {
 
     // 4 children: FIND, entity, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals(".pname1=val1ORpname2=val2", sfq.getChild(2).getText());
+    assertEquals(".pname1=val1 OR pname2=val2", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, disjunction
@@ -576,13 +592,13 @@ public class TestCQL {
     assertEquals(".", entity_filter.getChild(0).getText());
 
     // disjunction
-    assertEquals("pname1=val1ORpname2=val2", entity_filter.getChild(1).getText());
+    assertEquals("pname1=val1 OR pname2=val2", entity_filter.getChild(1).getText());
     final ParseTree disjunction = entity_filter.getChild(1);
 
     // 3 children: pov, OR, pov
     assertEquals(3, disjunction.getChildCount());
-    assertEquals("pname1=val1", disjunction.getChild(0).getText());
-    assertEquals("OR", disjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", disjunction.getChild(0).getText());
+    assertEquals("OR ", disjunction.getChild(1).getText());
     assertEquals("pname2=val2", disjunction.getChild(2).getText());
 
     // pov
@@ -600,7 +616,7 @@ public class TestCQL {
     assertEquals("=", pov1.getChild(1).getText());
     assertEquals("=", pov2.getChild(1).getText());
 
-    assertEquals("val1", pov1.getChild(2).getText());
+    assertEquals("val1 ", pov1.getChild(2).getText());
     assertEquals("val2", pov2.getChild(2).getText());
 
     assertEquals("ename", sfq.e.toString());
@@ -628,14 +644,14 @@ public class TestCQL {
 
     // 4 children: FIND, entity, entity_filter EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
 
     // entity
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity filter
-    assertEquals(".pname1=val1ANDpname2=val2ANDpname3=val3", sfq.getChild(2).getText());
+    assertEquals(".pname1=val1 AND pname2=val2 AND pname3=val3", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
@@ -643,15 +659,16 @@ public class TestCQL {
     assertEquals(".", entity_filter.getChild(0).getText());
 
     // conjunction
-    assertEquals("pname1=val1ANDpname2=val2ANDpname3=val3", entity_filter.getChild(1).getText());
+    assertEquals(
+        "pname1=val1 AND pname2=val2 AND pname3=val3", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 9 children: pov, AND, pov, AND, pov
     assertEquals(5, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
-    assertEquals("pname2=val2", conjunction.getChild(2).getText());
-    assertEquals("AND", conjunction.getChild(3).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
+    assertEquals("pname2=val2 ", conjunction.getChild(2).getText());
+    assertEquals("AND ", conjunction.getChild(3).getText());
     assertEquals("pname3=val3", conjunction.getChild(4).getText());
 
     // pov
@@ -674,8 +691,8 @@ public class TestCQL {
     assertEquals("=", pov2.getChild(1).getText());
     assertEquals("=", pov3.getChild(1).getText());
 
-    assertEquals("val1", pov1.getChild(2).getText());
-    assertEquals("val2", pov2.getChild(2).getText());
+    assertEquals("val1 ", pov1.getChild(2).getText());
+    assertEquals("val2 ", pov2.getChild(2).getText());
     assertEquals("val3", pov3.getChild(2).getText());
 
     assertEquals("ename", sfq.e.toString());
@@ -692,124 +709,82 @@ public class TestCQL {
     }
   }
 
-  // @Test
-  // public void testQuery4() {
-  // CQLLexer lexer;
-  // lexer = new CQLLexer(CharStreams.fromString(query4));
-  // final CommonTokenStream tokens = new CommonTokenStream(lexer);
-  //
-  // final CQLParser parser = new CQLParser(tokens);
-  // final CqContext sfq = parser.cq();
-  //
-  // System.out.println("query4: " + sfq.toStringTree(parser));
-  //
-  // // 5 children: FIND, EMPTY_SPACE, entity, EMPTY_SPACE, entity_filter
-  // assertEquals(5, sfq.getChildCount());
-  // assertEquals("FIND", sfq.getChild(0).getText());
-  // assertEquals(" ", sfq.getChild(1).getText());
-  // assertEquals("ename", sfq.getChild(2).getText());
-  // assertEquals(" ", sfq.getChild(3).getText());
-  //
-  // // entity_filter
-  // assertEquals("WHICH HAS A PROPERTY pname1=val1 AND pname1 HAS A PROPERTY
-  // pname2=val2",
-  // sfq
-  // .getChild(4).getText());
-  // final ParseTree entity_filter1 = sfq.getChild(4);
-  //
-  // // 3 children: WHICH_EXP, conjunction
-  // assertEquals(3, entity_filter1.getChildCount());
-  // assertEquals("WHICH HAS A PROPERTY",
-  // entity_filter1.getChild(0).getText());
-  // assertEquals(" ", entity_filter1.getChild(1).getText());
-  //
-  // // conjunction
-  // assertEquals("pname1=val1 AND pname1 HAS A PROPERTY pname2=val2",
-  // entity_filter1
-  // .getChild(2).getText());
-  // final ParseTree conjunction = entity_filter1.getChild(2);
-  //
-  // // 5 children: pov, AND, subproperty
-  // assertEquals(5, conjunction.getChildCount());
-  // assertEquals("pname1=val1", conjunction.getChild(0).getText());
-  // assertEquals(" ", conjunction.getChild(1).getText());
-  // assertEquals("AND", conjunction.getChild(2).getText());
-  // assertEquals(" ", conjunction.getChild(3).getText());
-  // assertEquals("pname1 HAS A PROPERTY pname2=val2",
-  // conjunction.getChild(4).getText());
-  //
-  // // pov
-  // final ParseTree pov1 = conjunction.getChild(0);
-  //
-  // // 3 children: property, operator, value
-  // assertEquals(3, pov1.getChildCount());
-  // assertEquals("pname1", pov1.getChild(0).getText());
-  // assertEquals("=", pov1.getChild(1).getText());
-  // assertEquals("val1", pov1.getChild(2).getText());
-  //
-  // // subproperty
-  // final ParseTree subproperty = conjunction.getChild(4);
-  //
-  // // 3 children: property, entity_filter
-  // assertEquals(3, subproperty.getChildCount());
-  // assertEquals("pname1", subproperty.getChild(0).getText());
-  // assertEquals(" ", subproperty.getChild(1).getText());
-  // assertEquals("HAS A PROPERTY pname2=val2",
-  // subproperty.getChild(2).getText());
-  //
-  // // entity_filter
-  // final ParseTree entity_filter2 = subproperty.getChild(2);
-  //
-  // // 3 children: WHICH_EXP pov
-  // assertEquals(3, entity_filter2.getChildCount());
-  // assertEquals("HAS A PROPERTY", entity_filter2.getChild(0).getText());
-  // assertEquals(" ", entity_filter2.getChild(1).getText());
-  // assertEquals("pname2=val2", entity_filter2.getChild(2).getText());
-  //
-  // // conjunction2
-  // final ParseTree conjunction2 = entity_filter2.getChild(2);
-  // assertEquals(1, conjunction2.getChildCount());
-  // assertEquals("pname2=val2", conjunction2.getChild(0).getText());
-  //
-  // // pov2
-  // final ParseTree pov2 = conjunction2.getChild(0);
-  //
-  // // 3 children: property, operator, value
-  // assertEquals(3, pov2.getChildCount());
-  // assertEquals("pname2", pov2.getChild(0).getText());
-  // assertEquals("=", pov2.getChild(1).getText());
-  // assertEquals("val2", pov2.getChild(2).getText());
-  //
-  // assertEquals("ename", sfq.e.toString());
-  // assertNotNull(sfq.filter);
-  // assertEquals(Conjunction.class.getName(),
-  // sfq.filter.getClass().getName());
-  // assertNotNull(sfq.filter.getFilters());
-  // assertFalse(sfq.filter.getFilters().isEmpty());
-  //
-  // Integer i = 0;
-  // EntityFilterInterface f = sfq.filter.getFilters().get(i);
-  // assertNotNull(f);
-  // assertEquals(POV.class.getName(), f.getClass().getName());
-  // assertEquals("POV(pname1,=,val1)", f.toString());
-  //
-  // i++;
-  // f = sfq.filter.getFilters().get(i);
-  // assertNotNull(f);
-  // assertEquals(SubProperty.class.getName(), f.getClass().getName());
-  //
-  // assertEquals("pname1", ((SubProperty) f).getProperty());
-  // assertEquals(Conjunction.class.getName(), ((SubProperty)
-  // f).getFilter().getClass()
-  // .getName());
-  // assertNotNull(((SubProperty) f).getFilter().getFilters());
-  // assertFalse(((SubProperty) f).getFilter().getFilters().isEmpty());
-  // f = ((SubProperty) f).getFilter().getFilters().getFirst();
-  // assertNotNull(f);
-  // assertEquals(POV.class.getName(), f.getClass().getName());
-  // assertEquals("POV(pname2,=,val2)", f.toString());
-  //
-  // }
+  @Test
+  public void testQuery4() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(query4));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println("query4: " + sfq.toStringTree(parser));
+
+    // 5 children: FIND, entity, EMPTY_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("ename", sfq.getChild(1).getText());
+    // entity_filter
+    assertEquals(
+        "WHICH HAS A PROPERTY pname1=val1 AND pname1 HAS A PROPERTY pname2=val2",
+        sfq.getChild(3).getText());
+    final ParseTree entity_filter1 = sfq.getChild(3);
+
+    // 2 children: WHICH_EXP, conjunction
+    assertEquals(2, entity_filter1.getChildCount());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter1.getChild(0).getText());
+
+    // conjunction
+    assertEquals(
+        "pname1=val1 AND pname1 HAS A PROPERTY pname2=val2", entity_filter1.getChild(1).getText());
+    final ParseTree conjunction = entity_filter1.getChild(1);
+
+    // 3 children: pov, AND, pov
+    assertEquals(3, conjunction.getChildCount());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
+    assertEquals("pname1 HAS A PROPERTY pname2=val2", conjunction.getChild(2).getText());
+
+    // subproperty
+    final ParseTree subproperty = conjunction.getChild(2);
+
+    // 3 children: property, entity_filter
+    assertEquals(2, subproperty.getChildCount());
+    assertEquals("pname1 ", subproperty.getChild(0).getText());
+    assertEquals("HAS A PROPERTY pname2=val2", subproperty.getChild(1).getText());
+
+    // entity_filter
+    final ParseTree entity_filter2 = subproperty.getChild(1).getChild(0);
+
+    // 3 children: WHICH_EXP pov
+    assertEquals(2, entity_filter2.getChildCount());
+    assertEquals("HAS A PROPERTY ", entity_filter2.getChild(0).getText());
+    assertEquals("pname2=val2", entity_filter2.getChild(1).getText());
+
+    final ParseTree pov2 = entity_filter2.getChild(1).getChild(0);
+
+    // 3 children: property, operator, value
+    assertEquals(3, pov2.getChildCount());
+    assertEquals("pname2", pov2.getChild(0).getText());
+    assertEquals("=", pov2.getChild(1).getText());
+    assertEquals("val2", pov2.getChild(2).getText());
+
+    assertEquals("ename", sfq.e.toString());
+    assertNotNull(sfq.filter);
+    assertEquals(Conjunction.class.getName(), sfq.filter.getClass().getName());
+    assertNotNull(sfq.filter);
+
+    EntityFilterInterface f = sfq.filter;
+    assertNotNull(f);
+    assertEquals(Conjunction.class.getName(), f.getClass().getName());
+    assertEquals("POV(pname1,=,val1)", ((Conjunction) f).getFilters().get(0).toString());
+
+    f = ((Conjunction) sfq.filter).getFilters().get(1);
+    assertEquals("POV(pname1,null,null)", f.toString());
+
+    f = ((POV) f).getSubProperty().getFilter();
+    assertEquals("POV(pname2,=,val2)", f.toString());
+  }
 
   @Test
   public void testQuery5() {
@@ -823,30 +798,32 @@ public class TestCQL {
     System.out.println(sfq.toStringTree(parser));
 
     // r children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    //    assertEquals(4, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
     assertEquals(
-        "WHICHHAS APROPERTYpname1=val1AND(pname2=val2ORpname3=val3)", sfq.getChild(2).getText());
-    final ParseTree entity_filter1 = sfq.getChild(2);
+        "WHICH HAS A PROPERTY pname1=val1 AND (pname2=val2 OR pname3=val3)",
+        sfq.getChild(3).getText());
+    final ParseTree entity_filter1 = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter1.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter1.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter1.getChild(0).getText());
 
     // conjunction
-    assertEquals("pname1=val1AND(pname2=val2ORpname3=val3)", entity_filter1.getChild(1).getText());
+    assertEquals(
+        "pname1=val1 AND (pname2=val2 OR pname3=val3)", entity_filter1.getChild(1).getText());
     final ParseTree conjunction = entity_filter1.getChild(1);
 
     // 5 children: pov, AND, LPAREN, disjunction, RPAREN
     assertEquals(5, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
     assertEquals("(", conjunction.getChild(2).getText());
-    assertEquals("pname2=val2ORpname3=val3", conjunction.getChild(3).getText());
+    assertEquals("pname2=val2 OR pname3=val3", conjunction.getChild(3).getText());
     assertEquals(")", conjunction.getChild(4).getText());
 
     // pov
@@ -856,15 +833,15 @@ public class TestCQL {
     assertEquals(3, pov1.getChildCount());
     assertEquals("pname1", pov1.getChild(0).getText());
     assertEquals("=", pov1.getChild(1).getText());
-    assertEquals("val1", pov1.getChild(2).getText());
+    assertEquals("val1 ", pov1.getChild(2).getText());
 
     // disjunction
     final ParseTree disjunction = conjunction.getChild(3);
 
     // 3 children: pov, OR, pov
     assertEquals(3, disjunction.getChildCount());
-    assertEquals("pname2=val2", disjunction.getChild(0).getText());
-    assertEquals("OR", disjunction.getChild(1).getText());
+    assertEquals("pname2=val2 ", disjunction.getChild(0).getText());
+    assertEquals("OR ", disjunction.getChild(1).getText());
     assertEquals("pname3=val3", disjunction.getChild(2).getText());
 
     // pov
@@ -877,7 +854,7 @@ public class TestCQL {
 
     assertEquals("pname2", pov2.getChild(0).getText());
     assertEquals("=", pov2.getChild(1).getText());
-    assertEquals("val2", pov2.getChild(2).getText());
+    assertEquals("val2 ", pov2.getChild(2).getText());
 
     assertEquals("pname3", pov3.getChild(0).getText());
     assertEquals("=", pov3.getChild(1).getText());
@@ -924,34 +901,34 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 4 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WHICHHAS Apname->ename2", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WHICH HAS A pname -> ename2", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
-    assertEquals("pname->ename2", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
+    assertEquals("pname -> ename2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: pov
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("pname->ename2", conjunction.getChild(0).getText());
+    assertEquals("pname -> ename2", conjunction.getChild(0).getText());
 
     // pov
     final ParseTree pov1 = conjunction.getChild(0);
 
-    // 3 chidren: property, operator, value
-    assertEquals(3, pov1.getChildCount());
-    assertEquals("pname", pov1.getChild(0).getText());
+    // 4 chidren: property, operator, WHITE_SPACE, value
+    assertEquals(4, pov1.getChildCount());
+    assertEquals("pname ", pov1.getChild(0).getText());
     assertEquals("->", pov1.getChild(1).getText());
-    assertEquals("ename2", pov1.getChild(2).getText());
+    assertEquals("ename2", pov1.getChild(3).getText());
 
     assertEquals("ename1", sfq.e.toString());
     assertNotNull(sfq.filter);
@@ -975,35 +952,35 @@ public class TestCQL {
     }
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals("WHICH->ename2AS Apname", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WHICH -> ename2 AS A pname", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("->ename2AS Apname", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("-> ename2 AS A pname", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: pov
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("->ename2AS Apname", conjunction.getChild(0).getText());
+    assertEquals("-> ename2 AS A pname", conjunction.getChild(0).getText());
 
     // pov
     final ParseTree pov1 = conjunction.getChild(0);
 
-    // 4 chidren: value operator, AS_A, property
-    assertEquals(4, pov1.getChildCount());
+    // 5 children: operator, WHITE_SPACE, entity, AS_A, property
+    assertEquals(5, pov1.getChildCount());
     assertEquals("->", pov1.getChild(0).getText());
-    assertEquals("ename2", pov1.getChild(1).getText());
-    assertEquals("AS A", pov1.getChild(2).getText());
-    assertEquals("pname", pov1.getChild(3).getText());
+    assertEquals("ename2 ", pov1.getChild(2).getText());
+    assertEquals("AS A ", pov1.getChild(3).getText());
+    assertEquals("pname", pov1.getChild(4).getText());
 
     assertEquals("ename1", sfq.e.toString());
     assertNotNull(sfq.filter);
@@ -1022,33 +999,34 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
+    assertEquals(" ", sfq.getChild(2).getText());
 
     // entity_filter
-    assertEquals("WHICHHAS A->ename2", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals("WHICH HAS A -> ename2", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
+    assertEquals(5, sfq.getChildCount());
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
-    assertEquals("->ename2", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
+    assertEquals("-> ename2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: pov
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("->ename2", conjunction.getChild(0).getText());
+    assertEquals("-> ename2", conjunction.getChild(0).getText());
 
     // pov
     final ParseTree pov1 = conjunction.getChild(0);
 
-    // 2 children: operator, value
-    assertEquals(2, pov1.getChildCount());
+    // 3 children: operator, WHITE_SPACE, value
+    assertEquals(3, pov1.getChildCount());
     assertEquals("->", pov1.getChild(0).getText());
-    assertEquals("ename2", pov1.getChild(1).getText());
+    assertEquals("ename2", pov1.getChild(2).getText());
 
     assertEquals("ename1", sfq.e.toString());
     assertNotNull(sfq.filter);
@@ -1068,33 +1046,33 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WHICHIS REFERENCEDBYename2", sfq.getChild(2).getText());
+    assertEquals("WHICH IS REFERENCED BY ename2", sfq.getChild(3).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS REFERENCEDBYename2", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS REFERENCED BY ename2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: backreference
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS REFERENCEDBYename2", conjunction.getChild(0).getText());
+    assertEquals("IS REFERENCED BY ename2", conjunction.getChild(0).getText());
 
     // backreference
     final ParseTree backreference = conjunction.getChild(0);
 
     // 3 children: IS_REFERENCED, BY, entity
     assertEquals(3, backreference.getChildCount());
-    assertEquals("IS REFERENCED", backreference.getChild(0).getText());
-    assertEquals("BY", backreference.getChild(1).getText());
+    assertEquals("IS REFERENCED ", backreference.getChild(0).getText());
+    assertEquals("BY ", backreference.getChild(1).getText());
     assertEquals("ename2", backreference.getChild(2).getText());
 
     assertEquals("ename1", sfq.e.toString());
@@ -1116,25 +1094,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WHICHIS REFERENCEDBYename2AS Apname1", sfq.getChild(2).getText());
+    assertEquals("WHICH IS REFERENCED BY ename2 AS A pname1", sfq.getChild(3).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS REFERENCEDBYename2AS Apname1", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS REFERENCED BY ename2 AS A pname1", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: backreference
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS REFERENCEDBYename2AS Apname1", conjunction.getChild(0).getText());
+    assertEquals("IS REFERENCED BY ename2 AS A pname1", conjunction.getChild(0).getText());
 
     // backreference
     final ParseTree backreference = conjunction.getChild(0);
@@ -1144,13 +1122,13 @@ public class TestCQL {
     assertNotNull(sfq.filter);
     assertEquals("@(ename2,pname1)", sfq.filter.toString());
 
-    // 5 children: IS_REFERENCED, BY, entity, AS_A, property
-    assertEquals(5, backreference.getChildCount());
-    assertEquals("IS REFERENCED", backreference.getChild(0).getText());
-    assertEquals("BY", backreference.getChild(1).getText());
+    // 6 children: IS_REFERENCED, BY, entity, WHITE_SPACE, AS_A, property
+    assertEquals(6, backreference.getChildCount());
+    assertEquals("IS REFERENCED ", backreference.getChild(0).getText());
+    assertEquals("BY ", backreference.getChild(1).getText());
     assertEquals("ename2", backreference.getChild(2).getText());
-    assertEquals("AS A", backreference.getChild(3).getText());
-    assertEquals("pname1", backreference.getChild(4).getText());
+    assertEquals("AS A ", backreference.getChild(4).getText());
+    assertEquals("pname1", backreference.getChild(5).getText());
     assertEquals("ename1", sfq.e.toString());
     assertNotNull(sfq.filter);
   }
@@ -1164,42 +1142,42 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    assertEquals(Backreference.class.getName(), sfq.filter.getClass().getName());
-    assertEquals("@(ename2,pname1)", sfq.filter.toString());
-
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WHICHIS REFERENCEDBYANename2AS Apname1", sfq.getChild(2).getText());
+    assertEquals("WHICH IS REFERENCED BY AN ename2 AS A pname1", sfq.getChild(3).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS REFERENCEDBYANename2AS Apname1", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS REFERENCED BY AN ename2 AS A pname1", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: backreference
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS REFERENCEDBYANename2AS Apname1", conjunction.getChild(0).getText());
+    assertEquals("IS REFERENCED BY AN ename2 AS A pname1", conjunction.getChild(0).getText());
 
     // backreference
     final ParseTree backreference = conjunction.getChild(0);
 
-    // 6 children: IS_REFERENCED, BY, AN, entity, AS_A, property
-    assertEquals(6, backreference.getChildCount());
-    assertEquals("IS REFERENCED", backreference.getChild(0).getText());
-    assertEquals("BY", backreference.getChild(1).getText());
-    assertEquals("AN", backreference.getChild(2).getText());
+    // 6 children: IS_REFERENCED, BY, AN, entity, WHITE_SPACE, AS_A, property
+    assertEquals(7, backreference.getChildCount());
+    assertEquals("IS REFERENCED ", backreference.getChild(0).getText());
+    assertEquals("BY ", backreference.getChild(1).getText());
+    assertEquals("AN ", backreference.getChild(2).getText());
     assertEquals("ename2", backreference.getChild(3).getText());
-    assertEquals("AS A", backreference.getChild(4).getText());
-    assertEquals("pname1", backreference.getChild(5).getText());
+    assertEquals("AS A ", backreference.getChild(5).getText());
+    assertEquals("pname1", backreference.getChild(6).getText());
     assertEquals("ename1", sfq.e.toString());
     assertNotNull(sfq.filter);
+
+    assertEquals(Backreference.class.getName(), sfq.filter.getClass().getName());
+    assertEquals("@(ename2,pname1)", sfq.filter.toString());
   }
 
   @Test
@@ -1211,32 +1189,32 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WITHNOTpname1=val1", sfq.getChild(2).getText());
+    assertEquals("WITH NOT pname1=val1", sfq.getChild(3).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WITH", entity_filter.getChild(0).getText());
+    assertEquals("WITH ", entity_filter.getChild(0).getText());
 
     // conjunction
-    assertEquals("NOTpname1=val1", entity_filter.getChild(1).getText());
+    assertEquals("NOT pname1=val1", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: negation
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("NOTpname1=val1", conjunction.getChild(0).getText());
+    assertEquals("NOT pname1=val1", conjunction.getChild(0).getText());
     final ParseTree negation = conjunction.getChild(0);
 
     // 2 children: NOT, pov
     assertEquals(2, negation.getChildCount());
-    assertEquals("NOT", negation.getChild(0).getText());
+    assertEquals("NOT ", negation.getChild(0).getText());
     assertEquals("pname1=val1", negation.getChild(1).getText());
     final ParseTree pov1 = negation.getChild(1).getChild(0);
 
@@ -1263,32 +1241,32 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WHICHDOES NOT HAVE Apname1!=val1", sfq.getChild(2).getText());
+    assertEquals("WHICH DOES NOT HAVE A pname1!=val1", sfq.getChild(3).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
 
     // conjunction
-    assertEquals("DOES NOT HAVE Apname1!=val1", entity_filter.getChild(1).getText());
+    assertEquals("DOES NOT HAVE A pname1!=val1", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: negation
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("DOES NOT HAVE Apname1!=val1", conjunction.getChild(0).getText());
+    assertEquals("DOES NOT HAVE A pname1!=val1", conjunction.getChild(0).getText());
     final ParseTree negation = conjunction.getChild(0);
 
     // 2 children: DOESN'T, pov
     assertEquals(2, negation.getChildCount());
-    assertEquals("DOES NOT HAVE A", negation.getChild(0).getText());
+    assertEquals("DOES NOT HAVE A ", negation.getChild(0).getText());
     assertEquals("pname1!=val1", negation.getChild(1).getText());
     final ParseTree pov1 = negation.getChild(1).getChild(0);
 
@@ -1316,11 +1294,11 @@ public class TestCQL {
     final CqContext sfq = parser.cq();
 
     // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(".!pname1=val1", sfq.getChild(2).getText());
+    assertEquals(4, sfq.getChildCount());
 
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
@@ -1369,12 +1347,12 @@ public class TestCQL {
 
     // 4 children: FIND, entity, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
-    assertEquals(".pname1=val1AND.pname2=val2", sfq.getChild(2).getText());
+    assertEquals(".pname1=val1 AND .pname2=val2", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
@@ -1382,13 +1360,13 @@ public class TestCQL {
     assertEquals(".", entity_filter.getChild(0).getText());
 
     // conjunction
-    assertEquals("pname1=val1AND.pname2=val2", entity_filter.getChild(1).getText());
+    assertEquals("pname1=val1 AND .pname2=val2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 4 child: pov1, AND, which_exp, pov2
     assertEquals(4, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
     assertEquals(".", conjunction.getChild(2).getText());
     assertEquals("pname2=val2", conjunction.getChild(3).getText());
     final ParseTree pov1 = conjunction.getChild(0).getChild(0);
@@ -1398,7 +1376,7 @@ public class TestCQL {
     assertEquals(3, pov1.getChildCount());
     assertEquals("pname1", pov1.getChild(0).getText());
     assertEquals("=", pov1.getChild(1).getText());
-    assertEquals("val1", pov1.getChild(2).getText());
+    assertEquals("val1 ", pov1.getChild(2).getText());
 
     assertEquals(3, pov2.getChildCount());
     assertEquals("pname2", pov2.getChild(0).getText());
@@ -1426,46 +1404,47 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
     // entity_filter
     assertEquals(
-        "WHICHDOESN'T HAVE Apname1=val1ANDWHICHHAS Apname2=val2", sfq.getChild(2).getText());
-    final ParseTree entity_filter = sfq.getChild(2);
+        "WHICH DOESN'T HAVE A pname1=val1 AND WHICH HAS A pname2=val2", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals(
-        "DOESN'T HAVE Apname1=val1ANDWHICHHAS Apname2=val2", entity_filter.getChild(1).getText());
+        "DOESN'T HAVE A pname1=val1 AND WHICH HAS A pname2=val2",
+        entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 4 children: pov1, AND, which_exp, pov2
     assertEquals(4, conjunction.getChildCount());
-    assertEquals("DOESN'T HAVE Apname1=val1", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
-    assertEquals("WHICHHAS A", conjunction.getChild(2).getText());
+    assertEquals("DOESN'T HAVE A pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
+    assertEquals("WHICH HAS A ", conjunction.getChild(2).getText());
     assertEquals("pname2=val2", conjunction.getChild(3).getText());
     final ParseTree pov2 = conjunction.getChild(3).getChild(0);
 
     final ParseTree negation = conjunction.getChild(0).getChild(0);
     // 2 children: NOT, pov
     assertEquals(2, negation.getChildCount());
-    assertEquals("DOESN'T HAVE A", negation.getChild(0).getText());
-    assertEquals("pname1=val1", negation.getChild(1).getText());
+    assertEquals("DOESN'T HAVE A ", negation.getChild(0).getText());
+    assertEquals("pname1=val1 ", negation.getChild(1).getText());
     final ParseTree pov1 = negation.getChild(1).getChild(0);
 
     // 3 children: property, operator, value
     assertEquals(3, pov1.getChildCount());
     assertEquals("pname1", pov1.getChild(0).getText());
     assertEquals("=", pov1.getChild(1).getText());
-    assertEquals("val1", pov1.getChild(2).getText());
+    assertEquals("val1 ", pov1.getChild(2).getText());
 
     assertEquals(3, pov2.getChildCount());
     assertEquals("pname2", pov2.getChild(0).getText());
@@ -1502,7 +1481,7 @@ public class TestCQL {
 
     // 3 children: FIND, role, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("FILE", sfq.getChild(1).getText());
     assertEquals(null, sfq.e);
     assertEquals(Query.Role.FILE, sfq.r);
@@ -1525,27 +1504,27 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("File", sfq.getChild(1).getText());
-    assertEquals("WHICHISNOTREFERENCED", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("File ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS NOT REFERENCED", sfq.getChild(2).getText());
 
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHIS", entity_filter.getChild(0).getText());
-    assertEquals("NOTREFERENCED", entity_filter.getChild(1).getText());
+    assertEquals("WHICH IS ", entity_filter.getChild(0).getText());
+    assertEquals("NOT REFERENCED", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: negation
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("NOTREFERENCED", conjunction.getChild(0).getText());
+    assertEquals("NOT REFERENCED", conjunction.getChild(0).getText());
     final ParseTree negation = conjunction.getChild(0);
 
     // 2 children: NOT, backreference
     assertEquals(2, negation.getChildCount());
-    assertEquals("NOT", negation.getChild(0).getText());
+    assertEquals("NOT ", negation.getChild(0).getText());
     assertEquals("REFERENCED", negation.getChild(1).getText());
 
     // backreference
@@ -1582,26 +1561,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT\"/bla/bla/bla\"", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT \"/bla/bla/bla\"", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT\"/bla/bla/bla\"", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT \"/bla/bla/bla\"", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT\"/bla/bla/bla\"", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT \"/bla/bla/bla\"", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("\"/bla/bla/bla\"", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1627,27 +1606,27 @@ public class TestCQL {
     assertEquals(StoredAt.class.getName(), sfq.filter.getClass().getName());
 
     // 4 children: FIND, role, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/bla/bla/bla", sfq.getChild(2).getText());
+    //    assertEquals(4, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /bla/bla/bla", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT/bla/bla/bla", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT/bla/bla/bla", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("/bla/bla/bla", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1674,26 +1653,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/bla/bla/bla/", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /bla/bla/bla/", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT/bla/bla/bla/", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla/", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT/bla/bla/bla/", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla/", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("/bla/bla/bla/", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1723,27 +1702,27 @@ public class TestCQL {
     assertEquals(StoredAt.class.getName(), sfq.filter.getClass().getName());
 
     // 4 children: FIND, role, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/bla/bla/bla.html", sfq.getChild(2).getText());
+    //    assertEquals(4, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /bla/bla/bla.html", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT/bla/bla/bla.html", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla.html", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT/bla/bla/bla.html", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla/bla.html", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("/bla/bla/bla.html", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1775,26 +1754,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT//bla///bla.html", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT //bla///bla.html", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT//bla///bla.html", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT //bla///bla.html", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT//bla///bla.html", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT //bla///bla.html", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("//bla///bla.html", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1826,26 +1805,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/bla/bla_bla.html", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /bla/bla_bla.html", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT/bla/bla_bla.html", entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla_bla.html", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT/bla/bla_bla.html", conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT /bla/bla_bla.html", conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("/bla/bla_bla.html", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1879,26 +1858,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT" + origPath, sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT " + origPath, sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
-    assertEquals("IS STORED AT" + origPath, entity_filter.getChild(1).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
+    assertEquals("IS STORED AT " + origPath, entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: storedAt
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("IS STORED AT" + origPath, conjunction.getChild(0).getText());
+    assertEquals("IS STORED AT " + origPath, conjunction.getChild(0).getText());
     final ParseTree storedat = conjunction.getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals(origPath, storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1929,30 +1908,31 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT\"/bla/bla/bla\"ORHAS Apname2=val2", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals(
+        "WHICH IS STORED AT \"/bla/bla/bla\" OR HAS A pname2=val2", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
     assertEquals(
-        "IS STORED AT\"/bla/bla/bla\"ORHAS Apname2=val2", entity_filter.getChild(1).getText());
+        "IS STORED AT \"/bla/bla/bla\" OR HAS A pname2=val2", entity_filter.getChild(1).getText());
     final ParseTree disjunction = entity_filter.getChild(1);
 
     // 4 child: storedAt, OR, HAS_A, POV
     assertEquals(4, disjunction.getChildCount());
-    assertEquals("IS STORED AT\"/bla/bla/bla\"", disjunction.getChild(0).getText());
-    assertEquals("OR", disjunction.getChild(1).getText());
-    assertEquals("HAS A", disjunction.getChild(2).getText());
+    assertEquals("IS STORED AT \"/bla/bla/bla\" ", disjunction.getChild(0).getText());
+    assertEquals("OR ", disjunction.getChild(1).getText());
+    assertEquals("HAS A ", disjunction.getChild(2).getText());
     assertEquals("pname2=val2", disjunction.getChild(3).getText());
     final ParseTree storedat = disjunction.getChild(0).getChild(0);
 
-    // 2 children: IS_STORED_AT, loc
-    assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    // 3 children: IS_STORED_AT, loc, WHITE_SPACE
+    assertEquals(3, storedat.getChildCount());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("\"/bla/bla/bla\"", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -1990,36 +1970,38 @@ public class TestCQL {
 
     // 4 children: FIND, role, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS Apname2=val2ORIS STORED AT\"/bla/bla/bla\"", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals(
+        "WHICH HAS A pname2=val2 OR IS STORED AT \"/bla/bla/bla\"", sfq.getChild(2).getText());
     // entity_filter
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
-    assertEquals("pname2=val2ORIS STORED AT\"/bla/bla/bla\"", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
+    assertEquals(
+        "pname2=val2 OR IS STORED AT \"/bla/bla/bla\"", entity_filter.getChild(1).getText());
     final ParseTree disjunction = entity_filter.getChild(1);
 
     // 3 children: POV, OR, storedAt
     assertEquals(3, disjunction.getChildCount());
-    assertEquals("pname2=val2", disjunction.getChild(0).getText());
-    assertEquals("OR", disjunction.getChild(1).getText());
-    assertEquals("IS STORED AT\"/bla/bla/bla\"", disjunction.getChild(2).getText());
+    assertEquals("pname2=val2 ", disjunction.getChild(0).getText());
+    assertEquals("OR ", disjunction.getChild(1).getText());
+    assertEquals("IS STORED AT \"/bla/bla/bla\"", disjunction.getChild(2).getText());
     final ParseTree pov = disjunction.getChild(0).getChild(0);
 
     // 3 children: p, o, v
     assertEquals(3, pov.getChildCount());
     assertEquals("pname2", pov.getChild(0).getText());
     assertEquals("=", pov.getChild(1).getText());
-    assertEquals("val2", pov.getChild(2).getText());
+    assertEquals("val2 ", pov.getChild(2).getText());
 
     final ParseTree storedat = disjunction.getChild(2).getChild(0);
 
     // 2 children: IS_STORED_AT, loc
     assertEquals(2, storedat.getChildCount());
-    assertEquals("IS STORED AT", storedat.getChild(0).getText());
+    assertEquals("IS STORED AT ", storedat.getChild(0).getText());
     assertEquals("\"/bla/bla/bla\"", storedat.getChild(1).getText());
 
     assertEquals(null, sfq.e);
@@ -2056,48 +2038,50 @@ public class TestCQL {
     // assertEquals(Conjunction.class.getName(),
     // sfq.filter.getClass().getName());
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(
-        "WHICHHAS APROPERTY(pname1=val1WHICHHAS APROPERTYpname2=val2)", sfq.getChild(2).getText());
+        "WHICH HAS A PROPERTY ( pname1=val1 WHICH HAS A PROPERTY pname2=val2 )",
+        sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 4 children: WHICH_EXP, (, conjunction, )
     assertEquals(4, entity_filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter.getChild(0).getText());
-    assertEquals("(", entity_filter.getChild(1).getText());
-    assertEquals("pname1=val1WHICHHAS APROPERTYpname2=val2", entity_filter.getChild(2).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter.getChild(0).getText());
+    assertEquals("( ", entity_filter.getChild(1).getText());
+    assertEquals(
+        "pname1=val1 WHICH HAS A PROPERTY pname2=val2 ", entity_filter.getChild(2).getText());
     assertEquals(")", entity_filter.getChild(3).getText());
     final ParseTree conjunction = entity_filter.getChild(2);
 
     // 2 children: pov subp
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("WHICHHAS APROPERTYpname2=val2", conjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY pname2=val2 ", conjunction.getChild(1).getText());
     final ParseTree pov = conjunction.getChild(0);
 
     // 3 children: p, o, v
     assertEquals(3, pov.getChildCount());
     assertEquals("pname1", pov.getChild(0).getText());
     assertEquals("=", pov.getChild(1).getText());
-    assertEquals("val1", pov.getChild(2).getText());
+    assertEquals("val1 ", pov.getChild(2).getText());
 
     final ParseTree subproperty = conjunction.getChild(1);
 
     // 1 child: entity_filter
     assertEquals(1, subproperty.getChildCount());
-    assertEquals("WHICHHAS APROPERTYpname2=val2", subproperty.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY pname2=val2 ", subproperty.getChild(0).getText());
 
     final ParseTree subEntityFilter = subproperty.getChild(0);
 
     // 2 children: WHICH_EXP, pov
     assertEquals(2, subEntityFilter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", subEntityFilter.getChild(0).getText());
-    assertEquals("pname2=val2", subEntityFilter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY ", subEntityFilter.getChild(0).getText());
+    assertEquals("pname2=val2 ", subEntityFilter.getChild(1).getText());
 
     assertEquals("ename", sfq.e.toString());
     assertEquals(null, sfq.r);
@@ -2128,45 +2112,47 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(
-        "WHICHHAS APROPERTYpname1=val1WHICHHAS APROPERTYpname2=val2", sfq.getChild(2).getText());
+        "WHICH HAS A PROPERTY pname1=val1 WHICH HAS A PROPERTY pname2=val2",
+        sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter.getChild(0).getText());
-    assertEquals("pname1=val1WHICHHAS APROPERTYpname2=val2", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter.getChild(0).getText());
+    assertEquals(
+        "pname1=val1 WHICH HAS A PROPERTY pname2=val2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 2 children: pov, subp
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("WHICHHAS APROPERTYpname2=val2", conjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY pname2=val2", conjunction.getChild(1).getText());
     final ParseTree pov = conjunction.getChild(0);
 
     // 3 children: p, o, v
     assertEquals(3, pov.getChildCount());
     assertEquals("pname1", pov.getChild(0).getText());
     assertEquals("=", pov.getChild(1).getText());
-    assertEquals("val1", pov.getChild(2).getText());
+    assertEquals("val1 ", pov.getChild(2).getText());
 
     final ParseTree subproperty = conjunction.getChild(1);
 
     // 1 child: entity_filter
     assertEquals(1, subproperty.getChildCount());
-    assertEquals("WHICHHAS APROPERTYpname2=val2", subproperty.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY pname2=val2", subproperty.getChild(0).getText());
 
     final ParseTree subEntityFilter = subproperty.getChild(0);
 
     // 2 children: WHICH_EXP, pov
     assertEquals(2, subEntityFilter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", subEntityFilter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", subEntityFilter.getChild(0).getText());
     assertEquals("pname2=val2", subEntityFilter.getChild(1).getText());
 
     assertEquals("ename", sfq.e.toString());
@@ -2197,14 +2183,14 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals(".pname1=val1.pname2=val2", sfq.getChild(2).getText());
+    assertEquals(".pname1=val1.pname2=val2", sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
@@ -2266,14 +2252,14 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals(".(pname1=val1.pname2=val2)", sfq.getChild(2).getText());
+    assertEquals(".(pname1=val1.pname2=val2)", sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 4 children: WHICH_EXP, (, conjunction, )
     assertEquals(4, entity_filter.getChildCount());
@@ -2339,44 +2325,44 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    assertEquals("WHICHHAS Apname1=val1WITHpname2=val2", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A pname1=val1 WITH pname2=val2", sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
-    assertEquals("pname1=val1WITHpname2=val2", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
+    assertEquals("pname1=val1 WITH pname2=val2", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 2 children: pov, subp
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("pname1=val1", conjunction.getChild(0).getText());
-    assertEquals("WITHpname2=val2", conjunction.getChild(1).getText());
+    assertEquals("pname1=val1 ", conjunction.getChild(0).getText());
+    assertEquals("WITH pname2=val2", conjunction.getChild(1).getText());
     final ParseTree pov = conjunction.getChild(0);
 
     // 3 children: p, o, v
     assertEquals(3, pov.getChildCount());
     assertEquals("pname1", pov.getChild(0).getText());
     assertEquals("=", pov.getChild(1).getText());
-    assertEquals("val1", pov.getChild(2).getText());
+    assertEquals("val1 ", pov.getChild(2).getText());
 
     final ParseTree subproperty = conjunction.getChild(1);
 
     // 1 child: entity_filter
     assertEquals(1, subproperty.getChildCount());
-    assertEquals("WITHpname2=val2", subproperty.getChild(0).getText());
+    assertEquals("WITH pname2=val2", subproperty.getChild(0).getText());
 
     final ParseTree subEntityFilter = subproperty.getChild(0);
 
     // 2 children: WHICH_EXP, pov
     assertEquals(2, subEntityFilter.getChildCount());
-    assertEquals("WITH", subEntityFilter.getChild(0).getText());
+    assertEquals("WITH ", subEntityFilter.getChild(0).getText());
     assertEquals("pname2=val2", subEntityFilter.getChild(1).getText());
 
     assertEquals("ename", sfq.e.toString());
@@ -2408,50 +2394,53 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(
-        "WHICHHAS A->ename2WHICHHAS A->ename3WHICHHAS APROPERTYpname1=val1",
-        sfq.getChild(2).getText());
+        "WHICH HAS A -> ename2 WHICH HAS A -> ename3 WHICH HAS A PROPERTY pname1=val1",
+        sfq.getChild(3).getText());
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICHHAS A", entity_filter.getChild(0).getText());
+    assertEquals("WHICH HAS A ", entity_filter.getChild(0).getText());
     assertEquals(
-        "->ename2WHICHHAS A->ename3WHICHHAS APROPERTYpname1=val1",
+        "-> ename2 WHICH HAS A -> ename3 WHICH HAS A PROPERTY pname1=val1",
         entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 2 children: pov, subp
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("->ename2", conjunction.getChild(0).getText());
+    assertEquals("-> ename2 ", conjunction.getChild(0).getText());
     assertEquals(
-        "WHICHHAS A->ename3WHICHHAS APROPERTYpname1=val1", conjunction.getChild(1).getText());
+        "WHICH HAS A -> ename3 WHICH HAS A PROPERTY pname1=val1",
+        conjunction.getChild(1).getText());
     final ParseTree pov = conjunction.getChild(0);
 
-    // 2 children: ->, ?
-    assertEquals(2, pov.getChildCount());
+    // 3 children: ->, WHITE_SPACE, ename2
+    assertEquals(3, pov.getChildCount());
     assertEquals("->", pov.getChild(0).getText());
-    assertEquals("ename2", pov.getChild(1).getText());
+    assertEquals("ename2 ", pov.getChild(2).getText());
 
     final ParseTree subproperty = conjunction.getChild(1);
 
     // 1 child: entity_filter
     assertEquals(1, subproperty.getChildCount());
     assertEquals(
-        "WHICHHAS A->ename3WHICHHAS APROPERTYpname1=val1", subproperty.getChild(0).getText());
+        "WHICH HAS A -> ename3 WHICH HAS A PROPERTY pname1=val1",
+        subproperty.getChild(0).getText());
 
     final ParseTree subEntityFilter = subproperty.getChild(0);
 
     // 2 children: WHICH_EXP, subp
     assertEquals(2, subEntityFilter.getChildCount());
-    assertEquals("WHICHHAS A", subEntityFilter.getChild(0).getText());
-    assertEquals("->ename3WHICHHAS APROPERTYpname1=val1", subEntityFilter.getChild(1).getText());
+    assertEquals("WHICH HAS A ", subEntityFilter.getChild(0).getText());
+    assertEquals(
+        "-> ename3 WHICH HAS A PROPERTY pname1=val1", subEntityFilter.getChild(1).getText());
 
     assertEquals("ename1", sfq.e.toString());
     assertEquals(null, sfq.r);
@@ -2489,7 +2478,7 @@ public class TestCQL {
 
     // 4 children: FIND, ename, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(".ename2.ename3.pname1=val1", sfq.getChild(2).getText());
@@ -2556,40 +2545,37 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
-    // assertEquals("WHICH HAS A PROPERTY ( ename2 WHICH HAS A PROPERTY
-    // pname1=val1)",
-    // sfq
-    // .getChild(4).getText());
-    // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    assertEquals(
+        "WHICH HAS A PROPERTY ( WHICH HAS A PROPERTY pname1=val1)", sfq.getChild(3).getText());
+    final ParseTree entity_filter = sfq.getChild(3);
 
-    // 4 children: WHICH_EXP, (, conjunction, )
+    // 4 children: WHICH_EXP, (, subproperty, )
     assertEquals(4, entity_filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter.getChild(0).getText());
-    assertEquals("(", entity_filter.getChild(1).getText());
-    assertEquals("WHICHHAS APROPERTYpname1=val1", entity_filter.getChild(2).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter.getChild(0).getText());
+    assertEquals("( ", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY pname1=val1", entity_filter.getChild(2).getText());
     assertEquals(")", entity_filter.getChild(3).getText());
-    final ParseTree conjunction = entity_filter.getChild(2);
+    final ParseTree subproperty1 = entity_filter.getChild(2);
 
-    // 1 children
-    assertEquals(1, conjunction.getChildCount());
-    assertEquals("WHICHHAS APROPERTYpname1=val1", conjunction.getChild(0).getText());
-    final ParseTree subp = conjunction.getChild(0);
+    // 1 child: filter
+    assertEquals(1, subproperty1.getChildCount());
+    assertEquals("WHICH HAS A PROPERTY pname1=val1", subproperty1.getChild(0).getText());
+    final ParseTree filter = subproperty1.getChild(0);
 
     // 1 children: filter
-    assertEquals(1, subp.getChildCount());
-    assertEquals("WHICHHAS APROPERTYpname1=val1", subp.getChild(0).getText());
+    assertEquals(1, filter.getChildCount());
+    assertEquals("WHICH HAS A PROPERTY pname1=val1", filter.getChild(0).getText());
 
-    final ParseTree subproperty = subp.getChild(0);
+    final ParseTree subproperty = filter.getChild(0);
 
-    // 2 children: entity_filter
+    // 2 children: WHICH entity_filter
     assertEquals(2, subproperty.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", subproperty.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", subproperty.getChild(0).getText());
     assertEquals("pname1=val1", subproperty.getChild(1).getText());
 
     assertEquals("ename1", sfq.e.toString());
@@ -2616,41 +2602,44 @@ public class TestCQL {
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
     assertEquals(null, sfq.r);
 
-    // 4 children: FIND, ename, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename1", sfq.getChild(1).getText());
 
     // entity_filter
-    final ParseTree entity_filter = sfq.getChild(2);
+    final ParseTree entity_filter = sfq.getChild(3);
 
     // 4 children: WHICH_EXP, (, conjunction, )
     assertEquals(4, entity_filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", entity_filter.getChild(0).getText());
-    assertEquals("(", entity_filter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY ", entity_filter.getChild(0).getText());
+    assertEquals("( ", entity_filter.getChild(1).getText());
     assertEquals(
-        "WHICHHAS APROPERTY(WHICHHAS APROPERTY(pname1=val1))", entity_filter.getChild(2).getText());
+        "WHICH HAS A PROPERTY ( WHICH HAS A PROPERTY (pname1=val1) ) ",
+        entity_filter.getChild(2).getText());
     assertEquals(")", entity_filter.getChild(3).getText());
     final ParseTree conjunction = entity_filter.getChild(2);
 
     // 1 children
     assertEquals(1, conjunction.getChildCount());
     assertEquals(
-        "WHICHHAS APROPERTY(WHICHHAS APROPERTY(pname1=val1))", conjunction.getChild(0).getText());
+        "WHICH HAS A PROPERTY ( WHICH HAS A PROPERTY (pname1=val1) ) ",
+        conjunction.getChild(0).getText());
     final ParseTree subp = conjunction.getChild(0);
 
     // 1 children: filter
     assertEquals(1, subp.getChildCount());
-    assertEquals("WHICHHAS APROPERTY(WHICHHAS APROPERTY(pname1=val1))", subp.getChild(0).getText());
+    assertEquals(
+        "WHICH HAS A PROPERTY ( WHICH HAS A PROPERTY (pname1=val1) ) ", subp.getChild(0).getText());
 
     final ParseTree subproperty = subp.getChild(0);
 
     // 4 children: which, (, conjunction, )
     assertEquals(4, subproperty.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", subproperty.getChild(0).getText());
-    assertEquals("(", subproperty.getChild(1).getText());
-    assertEquals("WHICHHAS APROPERTY(pname1=val1)", subproperty.getChild(2).getText());
-    assertEquals(")", subproperty.getChild(3).getText());
+    assertEquals("WHICH HAS A PROPERTY ", subproperty.getChild(0).getText());
+    assertEquals("( ", subproperty.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY (pname1=val1) ", subproperty.getChild(2).getText());
+    assertEquals(") ", subproperty.getChild(3).getText());
 
     assertEquals("ename1", sfq.e.toString());
     assertEquals(null, sfq.r);
@@ -2684,13 +2673,13 @@ public class TestCQL {
 
     // 4 children: FIND, ename, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals(".", entity_filter.getChild(0).getText());
+    assertEquals(". ", entity_filter.getChild(0).getText());
     assertEquals("pname->ename", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
@@ -2742,7 +2731,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename#", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
@@ -2759,7 +2748,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("#ename", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
@@ -2778,7 +2767,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("<<ename-regexp>>", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_REGEXP, sfq.e.type);
     assertEquals("ename-regexp", sfq.e.toString());
@@ -2801,7 +2790,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("<<ename\\>>regexp>>", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_REGEXP, sfq.e.type);
     assertEquals("ename>>regexp", sfq.e.toString());
@@ -2825,7 +2814,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("*ename", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_LIKE, sfq.e.type);
     assertEquals("%ename", sfq.e.toString());
@@ -2848,7 +2837,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("en*ame", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_LIKE, sfq.e.type);
     assertEquals("en%ame", sfq.e.toString());
@@ -2871,7 +2860,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("SimpleD*Property", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_LIKE, sfq.e.type);
     assertEquals("SimpleD%Property", sfq.e.toString());
@@ -2894,7 +2883,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename*", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_LIKE, sfq.e.type);
     assertEquals("ename%", sfq.e.toString());
@@ -2917,7 +2906,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("<<SimpleD.*Property>>", sfq.getChild(1).getText());
     assertEquals(Query.Pattern.TYPE_REGEXP, sfq.e.type);
     assertEquals("SimpleD.*Property", sfq.e.toString());
@@ -2938,11 +2927,11 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".THEGREATESTpname", sfq.getChild(2).getText());
+    assertEquals(". THE GREATEST pname", sfq.getChild(3).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
 
@@ -2961,11 +2950,11 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".THESMALLESTpname", sfq.getChild(2).getText());
+    assertEquals(". THE SMALLEST pname", sfq.getChild(3).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
 
@@ -2985,17 +2974,17 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("SimpleRecordType", sfq.getChild(1).getText());
-    assertEquals("WITHTHEGREATESTSimpleDoubleProperty>0", sfq.getChild(2).getText());
+    assertEquals("WITH THE GREATEST SimpleDoubleProperty>0", sfq.getChild(3).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    assertEquals(2, sfq.getChild(2).getChildCount());
-    final ParseTree filter = sfq.getChild(2);
-    assertEquals("WITH", filter.getChild(0).getText());
-    assertEquals("THEGREATESTSimpleDoubleProperty>0", filter.getChild(1).getText());
+    assertEquals(2, sfq.getChild(3).getChildCount());
+    final ParseTree filter = sfq.getChild(3);
+    assertEquals("WITH ", filter.getChild(0).getText());
+    assertEquals("THE GREATEST SimpleDoubleProperty>0", filter.getChild(1).getText());
 
     assertEquals(1, filter.getChild(1).getChildCount());
     assertEquals(3, filter.getChild(1).getChild(0).getChildCount());
@@ -3024,13 +3013,13 @@ public class TestCQL {
     System.out.println(sfq.toStringTree(parser));
 
     // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDAPROPERTY(BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND A PROPERTY ( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016')",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
     assertNotNull(sfq.filter);
@@ -3069,24 +3058,24 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS APROPERTYpname=val1AND(pname=val2)", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A PROPERTY pname=val1 AND (pname=val2)", sfq.getChild(3).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(2);
+    final ParseTree filter = sfq.getChild(3);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
-    assertEquals("pname=val1AND(pname=val2)", filter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
+    assertEquals("pname=val1 AND (pname=val2)", filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
 
     // 5 children: pov, AND, (, pov, )
     assertEquals(5, conjunction1.getChildCount());
-    assertEquals("pname=val1", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
+    assertEquals("pname=val1 ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
     assertEquals("(", conjunction1.getChild(2).getText());
     assertEquals("pname=val2", conjunction1.getChild(3).getText());
     assertEquals(")", conjunction1.getChild(4).getText());
@@ -3123,41 +3112,41 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'AND(BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND ( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016')",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
+    final ParseTree filter = sfq.getChild(4);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "ObstacleRadius='2.0'AND(BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016')",
+        "ObstacleRadius = '2.0' AND ( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016')",
         filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
     assertEquals(5, conjunction1.getChildCount());
-    assertEquals("ObstacleRadius='2.0'", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
-    assertEquals("(", conjunction1.getChild(2).getText());
+    assertEquals("ObstacleRadius = '2.0' ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
+    assertEquals("( ", conjunction1.getChild(2).getText());
     assertEquals(
-        "BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         conjunction1.getChild(3).getText());
     assertEquals(")", conjunction1.getChild(4).getText());
 
     final ParseTree sub = conjunction1.getChild(3);
     assertEquals(2, sub.getChildCount());
-    assertEquals("BarkleyModelSimulation", sub.getChild(0).getText());
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", sub.getChild(1).getText());
+    assertEquals("BarkleyModelSimulation ", sub.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", sub.getChild(1).getText());
 
     final ParseTree con2 = sub.getChild(1).getChild(0);
     assertEquals(2, con2.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", con2.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", con2.getChild(0).getText());
     assertEquals("TimeStep='0.0016'", con2.getChild(1).getText());
 
     assertNotNull(sfq.filter);
@@ -3197,42 +3186,42 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDBarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
+    final ParseTree filter = sfq.getChild(4);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "ObstacleRadius='2.0'ANDBarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "ObstacleRadius = '2.0' AND BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
     assertEquals(3, conjunction1.getChildCount());
-    assertEquals("ObstacleRadius='2.0'", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
+    assertEquals("ObstacleRadius = '2.0' ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
     assertEquals(
-        "BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         conjunction1.getChild(2).getText());
     final ParseTree filter_exp = conjunction1.getChild(2);
     assertEquals(2, filter_exp.getChildCount());
-    assertEquals("BarkleyModelSimulation", filter_exp.getChild(0).getText());
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", filter_exp.getChild(1).getText());
+    assertEquals("BarkleyModelSimulation ", filter_exp.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", filter_exp.getChild(1).getText());
 
     final ParseTree sub = filter_exp.getChild(1);
     assertEquals(1, sub.getChildCount());
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", sub.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", sub.getChild(0).getText());
 
     final ParseTree sub1 = sub.getChild(0);
     assertEquals(2, sub1.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", sub1.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", sub1.getChild(0).getText());
     assertEquals("TimeStep='0.0016'", sub1.getChild(1).getText());
 
     assertNotNull(sfq.filter);
@@ -3274,43 +3263,43 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDAPROPERTYBarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND A PROPERTY BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
+    final ParseTree filter = sfq.getChild(4);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "ObstacleRadius='2.0'ANDAPROPERTYBarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "ObstacleRadius = '2.0' AND A PROPERTY BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
     assertEquals(5, conjunction1.getChildCount());
-    assertEquals("ObstacleRadius='2.0'", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
-    assertEquals("A", conjunction1.getChild(2).getText());
-    assertEquals("PROPERTY", conjunction1.getChild(3).getText());
+    assertEquals("ObstacleRadius = '2.0' ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
+    assertEquals("A ", conjunction1.getChild(2).getText());
+    assertEquals("PROPERTY ", conjunction1.getChild(3).getText());
     assertEquals(
-        "BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         conjunction1.getChild(4).getText());
     final ParseTree filter_exp = conjunction1.getChild(4);
-    assertEquals("BarkleyModelSimulation", filter_exp.getChild(0).getText());
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", filter_exp.getChild(1).getText());
+    assertEquals("BarkleyModelSimulation ", filter_exp.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", filter_exp.getChild(1).getText());
 
     final ParseTree sub = filter_exp.getChild(1);
     assertEquals(1, sub.getChildCount());
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", sub.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", sub.getChild(0).getText());
 
     final ParseTree sub1 = sub.getChild(0);
     assertEquals(2, sub1.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", sub1.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", sub1.getChild(0).getText());
     assertEquals("TimeStep='0.0016'", sub1.getChild(1).getText());
 
     assertNotNull(sfq.filter);
@@ -3352,30 +3341,31 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDAPROPERTY(BarkleyModelSimulation)",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND A PROPERTY ( BarkleyModelSimulation )",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
+    final ParseTree filter = sfq.getChild(4);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "ObstacleRadius='2.0'ANDAPROPERTY(BarkleyModelSimulation)", filter.getChild(1).getText());
+        "ObstacleRadius = '2.0' AND A PROPERTY ( BarkleyModelSimulation )",
+        filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
     assertEquals(7, conjunction1.getChildCount());
-    assertEquals("ObstacleRadius='2.0'", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
-    assertEquals("A", conjunction1.getChild(2).getText());
-    assertEquals("PROPERTY", conjunction1.getChild(3).getText());
-    assertEquals("(", conjunction1.getChild(4).getText());
-    assertEquals("BarkleyModelSimulation", conjunction1.getChild(5).getText());
+    assertEquals("ObstacleRadius = '2.0' ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
+    assertEquals("A ", conjunction1.getChild(2).getText());
+    assertEquals("PROPERTY ", conjunction1.getChild(3).getText());
+    assertEquals("( ", conjunction1.getChild(4).getText());
+    assertEquals("BarkleyModelSimulation ", conjunction1.getChild(5).getText());
     assertEquals(")", conjunction1.getChild(6).getText());
 
     assertNotNull(sfq.filter);
@@ -3412,33 +3402,33 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, entity_filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS APROPERTYpname1=val1AND(pname2)", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A PROPERTY pname1=val1 AND ( pname2 )", sfq.getChild(3).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(2);
+    final ParseTree filter = sfq.getChild(3);
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
-    assertEquals("pname1=val1AND(pname2)", filter.getChild(1).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
+    assertEquals("pname1=val1 AND ( pname2 )", filter.getChild(1).getText());
 
     final ParseTree conjunction1 = filter.getChild(1);
     assertEquals(5, conjunction1.getChildCount());
-    assertEquals("pname1=val1", conjunction1.getChild(0).getText());
-    assertEquals("AND", conjunction1.getChild(1).getText());
-    assertEquals("(", conjunction1.getChild(2).getText());
-    assertEquals("pname2", conjunction1.getChild(3).getText());
+    assertEquals("pname1=val1 ", conjunction1.getChild(0).getText());
+    assertEquals("AND ", conjunction1.getChild(1).getText());
+    assertEquals("( ", conjunction1.getChild(2).getText());
+    assertEquals("pname2 ", conjunction1.getChild(3).getText());
     assertEquals(")", conjunction1.getChild(4).getText());
 
     final ParseTree sub = conjunction1.getChild(3);
     assertEquals(1, sub.getChildCount());
-    assertEquals("pname2", sub.getChild(0).getText());
+    assertEquals("pname2 ", sub.getChild(0).getText());
 
     final ParseTree sub1 = sub.getChild(0);
     assertEquals(1, sub1.getChildCount());
-    assertEquals("pname2", sub1.getChild(0).getText());
+    assertEquals("pname2 ", sub1.getChild(0).getText());
 
     assertNotNull(sfq.filter);
     assertEquals(Conjunction.class.getName(), sfq.filter.getClass().getName());
@@ -3469,14 +3459,14 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDAPROPERTY(BarkleyModelSimulationWHICHHAS ATimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND A PROPERTY ( BarkleyModelSimulation WHICH HAS A TimeStep='0.0016')",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
 
     assertNotNull(sfq.filter);
@@ -3512,14 +3502,14 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYObstacleRadius='2.0'ANDAPROPERTY(BarkleyModelSimulationWHICHHASTimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ObstacleRadius = '2.0' AND A PROPERTY ( BarkleyModelSimulation WHICH HAS TimeStep='0.0016')",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
 
@@ -3576,14 +3566,14 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, RECORD, entity, entity_filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, RECORD, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("ticket147_FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYticket147_ObstacleRadius='2.0'ANDAPROPERTY(ticket147_BarkleyModelSimulationWHICHHASticket147_TimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ticket147_ObstacleRadius = '2.0' AND A PROPERTY ( ticket147_BarkleyModelSimulation WHICH HAS ticket147_TimeStep='0.0016')",
+        sfq.getChild(4).getText());
     assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
   }
 
@@ -3604,7 +3594,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("'Some name with spaces and 1234 numbers'", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -3629,7 +3619,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("\"Some name with spaces and 1234 numbers\"", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -3654,7 +3644,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("'Some name with spaces and 1234 numbers and \"'", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -3680,7 +3670,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("'Some name with spaces and 1234 numbers and \\*'", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -3705,7 +3695,7 @@ public class TestCQL {
 
     // 3 children: FIND, entity, EOF
     assertEquals(3, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("'Some name with spaces and 1234 numbers and *'", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_LIKE, sfq.e.type);
 
@@ -3714,7 +3704,7 @@ public class TestCQL {
   }
 
   /*
-   * String query28 = "FIND ename . pname=2.0";
+   * String query28 = "FIND ename . pname=2.02";
    */
   @Test
   public void testQuery28()
@@ -3727,20 +3717,21 @@ public class TestCQL {
     final CqContext sfq = parser.cq();
 
     System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,2.02)", sfq.filter.toString());
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".pname=2.0", sfq.getChild(2).getText());
+    assertEquals(". pname=2.02", sfq.getChild(3).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    assertEquals(2, sfq.getChild(2).getChildCount());
-    assertEquals(".", sfq.getChild(2).getChild(0).getText());
-    assertEquals("pname=2.0", sfq.getChild(2).getChild(1).getText());
-    assertEquals(1, sfq.getChild(2).getChild(1).getChildCount());
-    assertEquals("pname=2.0", sfq.getChild(2).getChild(1).getChild(0).getText());
-    assertEquals("2.0", sfq.getChild(2).getChild(1).getChild(0).getChild(2).getText());
+    assertEquals(2, sfq.getChild(3).getChildCount());
+    assertEquals(". ", sfq.getChild(3).getChild(0).getText());
+    assertEquals("pname=2.02", sfq.getChild(3).getChild(1).getText());
+    assertEquals(1, sfq.getChild(3).getChild(1).getChildCount());
+    assertEquals("pname=2.02", sfq.getChild(3).getChild(1).getChild(0).getText());
+    assertEquals("2.02", sfq.getChild(3).getChild(1).getChild(0).getChild(2).getText());
   }
 
   /*
@@ -3757,58 +3748,88 @@ public class TestCQL {
     final CqContext sfq = parser.cq();
 
     System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,2.0prop=test)", sfq.filter.toString());
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".pname=2.0prop=test", sfq.getChild(2).getText());
+    assertEquals(". pname=2.0prop=test", sfq.getChild(3).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
+  }
 
-    assertEquals(2, sfq.getChild(2).getChildCount());
-    assertEquals(".", sfq.getChild(2).getChild(0).getText());
-    assertEquals("pname=2.0prop=test", sfq.getChild(2).getChild(1).getText());
-    assertEquals(2, sfq.getChild(2).getChild(1).getChildCount());
-    assertEquals("pname=2", sfq.getChild(2).getChild(1).getChild(0).getText());
-    assertEquals(".0prop=test", sfq.getChild(2).getChild(1).getChild(1).getText());
-    assertEquals("2", sfq.getChild(2).getChild(1).getChild(0).getChild(2).getText());
-    assertEquals(1, sfq.getChild(2).getChild(1).getChild(1).getChildCount());
-    assertEquals(".0prop=test", sfq.getChild(2).getChild(1).getChild(1).getChild(0).getText());
-    assertEquals(2, sfq.getChild(2).getChild(1).getChild(1).getChild(0).getChildCount());
-    assertEquals(".", sfq.getChild(2).getChild(1).getChild(1).getChild(0).getChild(0).getText());
-    assertEquals(
-        "0prop=test",
-        sfq.getChild(2).getChild(1).getChild(1).getChild(0).getChild(1).getChild(0).getText());
-    assertEquals(
-        "0prop",
-        sfq.getChild(2)
-            .getChild(1)
-            .getChild(1)
-            .getChild(0)
-            .getChild(1)
-            .getChild(0)
-            .getChild(0)
-            .getText());
-    assertEquals(
-        "=",
-        sfq.getChild(2)
-            .getChild(1)
-            .getChild(1)
-            .getChild(0)
-            .getChild(1)
-            .getChild(0)
-            .getChild(1)
-            .getText());
-    assertEquals(
-        "test",
-        sfq.getChild(2)
-            .getChild(1)
-            .getChild(1)
-            .getChild(0)
-            .getChild(1)
-            .getChild(0)
-            .getChild(2)
-            .getText());
+  /** String query28b = "FIND ename . pname = 1.02m"; */
+  @Test
+  public void testQuery28b()
+      throws InterruptedException, SQLException, ConnectionException, QueryException {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query28b));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,1.02m)", sfq.filter.toString());
+
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("ename", sfq.getChild(1).getText());
+    assertEquals(". pname = 1.02m", sfq.getChild(3).getText());
+    assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
+
+    assertEquals(2, sfq.getChild(3).getChildCount());
+    assertEquals(". ", sfq.getChild(3).getChild(0).getText());
+    assertEquals("pname = 1.02m", sfq.getChild(3).getChild(1).getText());
+    assertEquals(1, sfq.getChild(3).getChild(1).getChildCount());
+    assertEquals("pname = 1.02m", sfq.getChild(3).getChild(1).getChild(0).getText());
+    assertEquals("1.02m", sfq.getChild(3).getChild(1).getChild(0).getChild(3).getText());
+  }
+
+  /** String query28c = "FIND ename . pname = .02"; */
+  @Test
+  public void testQuery28c()
+      throws InterruptedException, SQLException, ConnectionException, QueryException {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query28c));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,.02)", sfq.filter.toString());
+  }
+
+  /** String query28d = "FIND ename . pname =.02m"; */
+  @Test
+  public void testQuery28d()
+      throws InterruptedException, SQLException, ConnectionException, QueryException {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query28d));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,.02m)", sfq.filter.toString());
+  }
+
+  /** String query28e = "FIND ename . pname =.02 1/m^2"; */
+  @Test
+  public void testQuery28e()
+      throws InterruptedException, SQLException, ConnectionException, QueryException {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query28e));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+    assertEquals("POV(pname,=,.02 1/m^2)", sfq.filter.toString());
   }
 
   /*
@@ -3828,45 +3849,45 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTY(BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016')ANDAPROPERTYMinPeakHeight='0.5'",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY ( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016') AND A PROPERTY MinPeakHeight = '0.5'",
+        sfq.getChild(4).getText());
 
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
-    // 2 children: WHICH, conjunction
+    final ParseTree filter = sfq.getChild(4);
+    // 2 children: WHICH , conjunction
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "(BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016')ANDAPROPERTYMinPeakHeight='0.5'",
+        "( BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016') AND A PROPERTY MinPeakHeight = '0.5'",
         filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1);
     // 7 children: (, filter, ), AND, A, PROPERTY, filter
     assertEquals(7, conjunction.getChildCount());
-    assertEquals("(", conjunction.getChild(0).getText());
+    assertEquals("( ", conjunction.getChild(0).getText());
     assertEquals(
-        "BarkleyModelSimulationWHICHHAS APROPERTYTimeStep='0.0016'",
+        "BarkleyModelSimulation WHICH HAS A PROPERTY TimeStep='0.0016'",
         conjunction.getChild(1).getText());
-    assertEquals(")", conjunction.getChild(2).getText());
-    assertEquals("AND", conjunction.getChild(3).getText());
-    assertEquals("A", conjunction.getChild(4).getText());
-    assertEquals("PROPERTY", conjunction.getChild(5).getText());
-    assertEquals("MinPeakHeight='0.5'", conjunction.getChild(6).getText());
+    assertEquals(") ", conjunction.getChild(2).getText());
+    assertEquals("AND ", conjunction.getChild(3).getText());
+    assertEquals("A ", conjunction.getChild(4).getText());
+    assertEquals("PROPERTY ", conjunction.getChild(5).getText());
+    assertEquals("MinPeakHeight = '0.5'", conjunction.getChild(6).getText());
 
     final ParseTree pov1 = conjunction.getChild(1).getChild(0);
-    assertEquals("BarkleyModelSimulation", pov1.getText());
+    assertEquals("BarkleyModelSimulation ", pov1.getText());
     final ParseTree subp = conjunction.getChild(1).getChild(1);
-    assertEquals("WHICHHAS APROPERTYTimeStep='0.0016'", subp.getText());
+    assertEquals("WHICH HAS A PROPERTY TimeStep='0.0016'", subp.getText());
     final ParseTree pov2 = subp.getChild(0).getChild(1);
     assertEquals("TimeStep='0.0016'", pov2.getText());
     final ParseTree pov3 = conjunction.getChild(6).getChild(0);
-    assertEquals("MinPeakHeight='0.5'", pov3.getText());
+    assertEquals("MinPeakHeight = '0.5'", pov3.getText());
 
     assertEquals(sfq.e.toString(), "FrequencyMeasurement");
     assertEquals(sfq.r, Query.Role.RECORD);
@@ -3901,44 +3922,44 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, role, entity, filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, role, entity, WHITE_SPACE, filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        ".(BarkleyModelSimulation.TimeStep='0.0016')ANDAPROPERTYMinPeakHeight='0.5'",
-        sfq.getChild(3).getText());
+        ". ( BarkleyModelSimulation . TimeStep='0.0016') AND A PROPERTY MinPeakHeight = '0.5'",
+        sfq.getChild(4).getText());
 
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
-    // 2 children: WHICH, conjunction
+    final ParseTree filter = sfq.getChild(4);
+    // 2 children: WHICH , conjunction
     assertEquals(2, filter.getChildCount());
-    assertEquals(".", filter.getChild(0).getText());
+    assertEquals(". ", filter.getChild(0).getText());
     assertEquals(
-        "(BarkleyModelSimulation.TimeStep='0.0016')ANDAPROPERTYMinPeakHeight='0.5'",
+        "( BarkleyModelSimulation . TimeStep='0.0016') AND A PROPERTY MinPeakHeight = '0.5'",
         filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1);
     // 7 children: (, filter, ), AND, A, PROPERTY, filter
     assertEquals(7, conjunction.getChildCount());
-    assertEquals("(", conjunction.getChild(0).getText());
-    assertEquals("BarkleyModelSimulation.TimeStep='0.0016'", conjunction.getChild(1).getText());
-    assertEquals(")", conjunction.getChild(2).getText());
-    assertEquals("AND", conjunction.getChild(3).getText());
-    assertEquals("A", conjunction.getChild(4).getText());
-    assertEquals("PROPERTY", conjunction.getChild(5).getText());
-    assertEquals("MinPeakHeight='0.5'", conjunction.getChild(6).getText());
+    assertEquals("( ", conjunction.getChild(0).getText());
+    assertEquals("BarkleyModelSimulation . TimeStep='0.0016'", conjunction.getChild(1).getText());
+    assertEquals(") ", conjunction.getChild(2).getText());
+    assertEquals("AND ", conjunction.getChild(3).getText());
+    assertEquals("A ", conjunction.getChild(4).getText());
+    assertEquals("PROPERTY ", conjunction.getChild(5).getText());
+    assertEquals("MinPeakHeight = '0.5'", conjunction.getChild(6).getText());
 
     final ParseTree pov1 = conjunction.getChild(1).getChild(0);
-    assertEquals("BarkleyModelSimulation", pov1.getText());
+    assertEquals("BarkleyModelSimulation ", pov1.getText());
     final ParseTree subp = conjunction.getChild(1).getChild(1);
-    assertEquals(".TimeStep='0.0016'", subp.getText());
+    assertEquals(". TimeStep='0.0016'", subp.getText());
     final ParseTree pov2 = subp.getChild(0).getChild(1);
     assertEquals("TimeStep='0.0016'", pov2.getText());
     final ParseTree pov3 = conjunction.getChild(6).getChild(0);
-    assertEquals("MinPeakHeight='0.5'", pov3.getText());
+    assertEquals("MinPeakHeight = '0.5'", pov3.getText());
 
     assertEquals(sfq.e.toString(), "FrequencyMeasurement");
     assertEquals(sfq.r, Query.Role.RECORD);
@@ -3972,47 +3993,47 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 5 children: FIND, role, entity, filter, EOF
-    assertEquals(5, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    // 6 children: FIND, role, entity, WHITE_SPACE, filter, EOF
+    assertEquals(6, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
     assertEquals("FrequencyMeasurement", sfq.getChild(2).getText());
     assertEquals(
-        "WHICHHAS APROPERTYMinPeakHeight='0.5'ANDAPROPERTY(BarkleyModelSimulation.TimeStep='0.0016')",
-        sfq.getChild(3).getText());
+        "WHICH HAS A PROPERTY MinPeakHeight = '0.5' AND A PROPERTY ( BarkleyModelSimulation . TimeStep='0.0016')",
+        sfq.getChild(4).getText());
 
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(3);
-    // 2 children: WHICH, conjunction,
+    final ParseTree filter = sfq.getChild(4);
+    // 2 children: WHICH , conjunction,
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICHHAS APROPERTY", filter.getChild(0).getText());
+    assertEquals("WHICH HAS A PROPERTY ", filter.getChild(0).getText());
     assertEquals(
-        "MinPeakHeight='0.5'ANDAPROPERTY(BarkleyModelSimulation.TimeStep='0.0016')",
+        "MinPeakHeight = '0.5' AND A PROPERTY ( BarkleyModelSimulation . TimeStep='0.0016')",
         filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1);
 
     // 7 children: filter_exp, AND, A, PROPERTY, (, filter_exp, )
     assertEquals(7, conjunction.getChildCount());
-    assertEquals("MinPeakHeight='0.5'", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
-    assertEquals("A", conjunction.getChild(2).getText());
-    assertEquals("PROPERTY", conjunction.getChild(3).getText());
-    assertEquals("(", conjunction.getChild(4).getText());
-    assertEquals("BarkleyModelSimulation.TimeStep='0.0016'", conjunction.getChild(5).getText());
+    assertEquals("MinPeakHeight = '0.5' ", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(1).getText());
+    assertEquals("A ", conjunction.getChild(2).getText());
+    assertEquals("PROPERTY ", conjunction.getChild(3).getText());
+    assertEquals("( ", conjunction.getChild(4).getText());
+    assertEquals("BarkleyModelSimulation . TimeStep='0.0016'", conjunction.getChild(5).getText());
     assertEquals(")", conjunction.getChild(6).getText());
 
     final ParseTree pov1 = conjunction.getChild(0).getChild(0);
-    assertEquals(3, pov1.getChildCount());
-    assertEquals("MinPeakHeight", pov1.getChild(0).getText());
+    assertEquals(4, pov1.getChildCount());
+    assertEquals("MinPeakHeight ", pov1.getChild(0).getText());
     assertEquals("=", pov1.getChild(1).getText());
-    assertEquals("'0.5'", pov1.getChild(2).getText());
+    assertEquals("'0.5' ", pov1.getChild(3).getText());
 
     final ParseTree ref = conjunction.getChild(5);
     assertEquals(2, ref.getChildCount());
-    assertEquals("BarkleyModelSimulation", ref.getChild(0).getText());
-    assertEquals(".TimeStep='0.0016'", ref.getChild(1).getText());
+    assertEquals("BarkleyModelSimulation ", ref.getChild(0).getText());
+    assertEquals(". TimeStep='0.0016'", ref.getChild(1).getText());
 
     // this is a pov
     final ParseTree subp = ref.getChild(1).getChild(0).getChild(1).getChild(0);
@@ -4034,25 +4055,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHpnameIS NULL", sfq.getChild(2).getText());
+    assertEquals("WHICH pname IS NULL", sfq.getChild(3).getText());
 
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(2);
-    // 2 children: WHICH, pov,
+    final ParseTree filter = sfq.getChild(3);
+    // 2 children: WHICH , pov,
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICH", filter.getChild(0).getText());
-    assertEquals("pnameIS NULL", filter.getChild(1).getText());
+    assertEquals("WHICH ", filter.getChild(0).getText());
+    assertEquals("pname IS NULL", filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1).getChild(0);
 
     // 2 children: pname, IS_NOT_NULL
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("pname", conjunction.getChild(0).getText());
+    assertEquals("pname ", conjunction.getChild(0).getText());
     assertEquals("IS NULL", conjunction.getChild(1).getText());
     assertEquals("POV(pname,0,null)", sfq.filter.toString());
   }
@@ -4069,25 +4090,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHpnameIS NOT NULL", sfq.getChild(2).getText());
+    assertEquals("WHICH pname IS NOT NULL", sfq.getChild(3).getText());
 
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
-    final ParseTree filter = sfq.getChild(2);
-    // 2 children: WHICH, pov,
+    final ParseTree filter = sfq.getChild(3);
+    // 2 children: WHICH , pov,
     assertEquals(2, filter.getChildCount());
-    assertEquals("WHICH", filter.getChild(0).getText());
-    assertEquals("pnameIS NOT NULL", filter.getChild(1).getText());
+    assertEquals("WHICH ", filter.getChild(0).getText());
+    assertEquals("pname IS NOT NULL", filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1).getChild(0);
 
     // 2 children: pname, IS_NOT_NULL
     assertEquals(2, conjunction.getChildCount());
-    assertEquals("pname", conjunction.getChild(0).getText());
+    assertEquals("pname ", conjunction.getChild(0).getText());
     assertEquals("IS NOT NULL", conjunction.getChild(1).getText());
     assertEquals("POV(pname,!0,null)", sfq.filter.toString());
   }
@@ -4104,12 +4125,6 @@ public class TestCQL {
       final String on,
       final String date) {
 
-    if (neg && !sugar.contains("N'T")) {
-      sugar = sugar.replaceFirst("\\s", "");
-    }
-    if (someone_else != null) {
-      someone_else = someone_else.replace(" ", "");
-    }
     CQLLexer lexer;
     lexer = new CQLLexer(CharStreams.fromString(query));
     final CommonTokenStream tokens = new CommonTokenStream(lexer);
@@ -4117,20 +4132,22 @@ public class TestCQL {
     final CQLParser parser = new CQLParser(tokens);
     final CqContext sfq = parser.cq();
 
-    // 4 children: FIND, ename, FILTER, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, FILTER, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(
-        "WHICH"
+        "WHICH "
             + sugar
+            + " "
             + transaction
+            + " "
             + (by != null ? by : "")
-            + (someone_else != null ? someone_else : "")
-            + (but != null ? but : "")
-            + (person != null ? person : "")
-            + (on != null ? on + date : ""),
-        sfq.getChild(2).getText());
+            + (someone_else != null ? " " + someone_else : "")
+            + (but != null ? " " + but : "")
+            + (person != null ? " " + person : "")
+            + (on != null ? " " + on + " " + date : ""),
+        sfq.getChild(3).getText());
   }
 
   @Test
@@ -4298,26 +4315,27 @@ public class TestCQL {
     System.out.println(sfq.toStringTree(parser));
 
     // 4 children: FIND, entity, filter, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("RECORD", sfq.getChild(1).getText());
-    assertEquals(".CREATEDBY'henrik.tomwoerden'ANDTHEGREATESTID", sfq.getChild(2).getText());
+    assertEquals(".CREATED BY 'henrik.tomwoerden' AND THE GREATEST ID", sfq.getChild(2).getText());
 
     assertNull(sfq.e);
+    assertEquals(4, sfq.getChildCount());
 
     final ParseTree filter = sfq.getChild(2);
-    // 2 children: WHICH, conjunction,
+    // 2 children: WHICH , conjunction,
     assertEquals(2, filter.getChildCount());
     assertEquals(".", filter.getChild(0).getText());
-    assertEquals("CREATEDBY'henrik.tomwoerden'ANDTHEGREATESTID", filter.getChild(1).getText());
+    assertEquals(
+        "CREATED BY 'henrik.tomwoerden' AND THE GREATEST ID", filter.getChild(1).getText());
 
     final ParseTree conjunction = filter.getChild(1);
 
-    // 3 children: transaction, AND, id_filter
-    assertEquals(3, conjunction.getChildCount());
-    assertEquals("CREATEDBY'henrik.tomwoerden'", conjunction.getChild(0).getText());
-    assertEquals("AND", conjunction.getChild(1).getText());
-    assertEquals("THEGREATESTID", conjunction.getChild(2).getText());
+    // 4 children: transaction, WHITE_SPACE, AND, id_filter
+    assertEquals(4, conjunction.getChildCount());
+    assertEquals("CREATED BY 'henrik.tomwoerden'", conjunction.getChild(0).getText());
+    assertEquals("AND ", conjunction.getChild(2).getText());
+    assertEquals("THE GREATEST ID", conjunction.getChild(3).getText());
   }
 
   /** String query31 = "FIND PROPERTIES WHICH ARE INSERTED TODAY"; */
@@ -4334,22 +4352,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("PROPERTIES", sfq.getChild(1).getText());
-    assertEquals("WHICHWEREINSERTEDTODAY", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("PROPERTIES ", sfq.getChild(1).getText());
+    assertEquals("WHICH WERE INSERTED TODAY", sfq.getChild(2).getText());
     assertEquals(null, sfq.e);
     assertEquals(Query.Role.PROPERTY, sfq.r);
     assertEquals("TransactionFilter", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, transaction
+    // 2 children: WHICH , transaction
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICHWERE", whichclause.getChild(0).getText());
-    assertEquals("INSERTEDTODAY", whichclause.getChild(1).getText());
+    assertEquals("WHICH WERE ", whichclause.getChild(0).getText());
+    assertEquals("INSERTED TODAY", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("INSERTED", transactionFilter.getChild(0).getText());
+    assertEquals("INSERTED ", transactionFilter.getChild(0).getText());
     assertEquals("TODAY", transactionFilter.getChild(1).getText());
   }
 
@@ -4368,7 +4386,7 @@ public class TestCQL {
 
     // 4 children: FIND, EMPTY_SPACE, entity, entity_filter
     assertEquals(4, sfq.getChildCount());
-    assertEquals("COUNT", sfq.getChild(0).getText());
+    assertEquals("COUNT ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
     assertEquals(Pattern.TYPE_NORMAL, sfq.e.type);
 
@@ -4421,16 +4439,16 @@ public class TestCQL {
 
     // 4 children: FIND, EMPTY_SPACE, entity, entity_filter
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("Entity", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("Entity ", sfq.getChild(1).getText());
 
     // entity_filter
-    assertEquals(".pname=2.0", sfq.getChild(2).getText());
+    assertEquals(". pname=2.0", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals(".", entity_filter.getChild(0).getText());
+    assertEquals(". ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname=2.0", entity_filter.getChild(1).getText());
@@ -4475,35 +4493,36 @@ public class TestCQL {
 
     // 4 children: FIND, RECORD, entity_filter, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("Record", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("Record ", sfq.getChild(1).getText());
 
     // entity_filter
     assertEquals(
-        "WHICHIS REFERENCEDBYannotationWITHcomment='blablabla'", sfq.getChild(2).getText());
+        "WHICH IS REFERENCED BY annotation WITH comment='blablabla'", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, filter
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
 
     // filter
     assertEquals(
-        "IS REFERENCEDBYannotationWITHcomment='blablabla'", entity_filter.getChild(1).getText());
+        "IS REFERENCED BY annotation WITH comment='blablabla'",
+        entity_filter.getChild(1).getText());
     final ParseTree filter = entity_filter.getChild(1);
 
     // 2 children: backref, subproperty
     assertEquals(2, filter.getChildCount());
-    assertEquals("IS REFERENCEDBYannotation", filter.getChild(0).getText());
-    assertEquals("WITHcomment='blablabla'", filter.getChild(1).getText());
+    assertEquals("IS REFERENCED BY annotation ", filter.getChild(0).getText());
+    assertEquals("WITH comment='blablabla'", filter.getChild(1).getText());
 
     // backref
     final ParseTree backref = filter.getChild(0);
 
     // 3 children: IS_REFERENCED, BY, entity
-    assertEquals(3, backref.getChildCount());
-    assertEquals("IS REFERENCED", backref.getChild(0).getText());
-    assertEquals("BY", backref.getChild(1).getText());
+    assertEquals(4, backref.getChildCount());
+    assertEquals("IS REFERENCED ", backref.getChild(0).getText());
+    assertEquals("BY ", backref.getChild(1).getText());
     assertEquals("annotation", backref.getChild(2).getText());
 
     // subproperty
@@ -4511,14 +4530,14 @@ public class TestCQL {
 
     // 1 children: subquery
     assertEquals(1, subp.getChildCount());
-    assertEquals("WITHcomment='blablabla'", subp.getChild(0).getText());
+    assertEquals("WITH comment='blablabla'", subp.getChild(0).getText());
 
     // subquery
     final ParseTree subquery = subp.getChild(0);
 
     // 2 children: WHICH_EXP filter
     assertEquals(2, subquery.getChildCount());
-    assertEquals("WITH", subquery.getChild(0).getText());
+    assertEquals("WITH ", subquery.getChild(0).getText());
     assertEquals("comment='blablabla'", subquery.getChild(1).getText());
 
     assertEquals(Query.Role.RECORD, sfq.r);
@@ -4547,16 +4566,16 @@ public class TestCQL {
 
     // 4 children: FIND, EMPTY_SPACE, entity, entity_filter
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("Entity", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("Entity ", sfq.getChild(1).getText());
 
     // entity_filter
-    assertEquals("WITHpname=-1", sfq.getChild(2).getText());
+    assertEquals("WITH pname=-1", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WITH", entity_filter.getChild(0).getText());
+    assertEquals("WITH ", entity_filter.getChild(0).getText());
 
     // conjunction
     assertEquals("pname=-1", entity_filter.getChild(1).getText());
@@ -4600,32 +4619,32 @@ public class TestCQL {
 
     // 4 children: FIND, EMPTY_SPACE, entity, entity_filter
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("RECORD", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("RECORD ", sfq.getChild(1).getText());
 
     // entity_filter
-    assertEquals("WHICH->10594", sfq.getChild(2).getText());
+    assertEquals("WHICH -> 10594", sfq.getChild(2).getText());
     final ParseTree entity_filter = sfq.getChild(2);
 
     // 2 children: WHICH_EXP, conjunction
     assertEquals(2, entity_filter.getChildCount());
-    assertEquals("WHICH", entity_filter.getChild(0).getText());
+    assertEquals("WHICH ", entity_filter.getChild(0).getText());
 
     // conjunction
-    assertEquals("->10594", entity_filter.getChild(1).getText());
+    assertEquals("-> 10594", entity_filter.getChild(1).getText());
     final ParseTree conjunction = entity_filter.getChild(1);
 
     // 1 child: pov
     assertEquals(1, conjunction.getChildCount());
-    assertEquals("->10594", conjunction.getChild(0).getText());
+    assertEquals("-> 10594", conjunction.getChild(0).getText());
 
     // pov
     final ParseTree pov1 = conjunction.getChild(0);
 
-    // 2 children: (no property), operator, value
-    assertEquals(2, pov1.getChildCount());
+    // 3 children: (no property), operator, WHITE_SPACE, value
+    assertEquals(3, pov1.getChildCount());
     assertEquals("->", pov1.getChild(0).getText());
-    assertEquals("10594", pov1.getChild(1).getText());
+    assertEquals("10594", pov1.getChild(2).getText());
 
     assertEquals(Query.Role.RECORD, sfq.r);
     assertNotNull(sfq.filter);
@@ -4650,25 +4669,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateIN2015", sfq.getChild(2).getText());
+    assertEquals("WITH a date IN 2015", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, transaction
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , transaction
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateIN2015", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date IN 2015", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("IN", transactionFilter.getChild(1).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("IN ", transactionFilter.getChild(1).getText());
     assertEquals("2015", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4689,25 +4708,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, role, WHITE_SPACE, WHICHCLAUSE, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateIN\"2015\"", sfq.getChild(2).getText());
+    assertEquals("WITH a date IN \"2015\"", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children; WHICH, transaction
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children; WHICH , transaction
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateIN\"2015\"", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date IN \"2015\"", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("IN", transactionFilter.getChild(1).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("IN ", transactionFilter.getChild(1).getText());
     assertEquals("\"2015\"", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4728,26 +4747,26 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateNOTIN2015", sfq.getChild(2).getText());
+    assertEquals("WITH a date NOT IN 2015", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateNOTIN2015", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date NOT IN 2015", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(4, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("NOT", transactionFilter.getChild(1).getText());
-    assertEquals("IN", transactionFilter.getChild(2).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("NOT ", transactionFilter.getChild(1).getText());
+    assertEquals("IN ", transactionFilter.getChild(2).getText());
     assertEquals("2015", transactionFilter.getChild(3).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4768,26 +4787,26 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, role, WHITE_SPACE, WHICHCLAUSE, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateNOTIN\"2015\"", sfq.getChild(2).getText());
+    assertEquals("WITH a date NOT IN \"2015\"", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateNOTIN\"2015\"", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date NOT IN \"2015\"", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(4, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("NOT", transactionFilter.getChild(1).getText());
-    assertEquals("IN", transactionFilter.getChild(2).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("NOT ", transactionFilter.getChild(1).getText());
+    assertEquals("IN ", transactionFilter.getChild(2).getText());
     assertEquals("\"2015\"", transactionFilter.getChild(3).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4808,25 +4827,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateIN2015-01-01", sfq.getChild(2).getText());
+    assertEquals("WITH a date IN 2015-01-01", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateIN2015-01-01", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date IN 2015-01-01", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("IN", transactionFilter.getChild(1).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("IN ", transactionFilter.getChild(1).getText());
     assertEquals("2015-01-01", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4847,25 +4866,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, role, WHITE_SPACE, WHICHCLAUSE, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WITHadateIN\"2015-01-01\"", sfq.getChild(2).getText());
+    assertEquals("WITH a date IN \"2015-01-01\"", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WITHa", whichclause.getChild(0).getText());
-    assertEquals("dateIN\"2015-01-01\"", whichclause.getChild(1).getText());
+    assertEquals("WITH a ", whichclause.getChild(0).getText());
+    assertEquals("date IN \"2015-01-01\"", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("date", transactionFilter.getChild(0).getText());
-    assertEquals("IN", transactionFilter.getChild(1).getText());
+    assertEquals("date ", transactionFilter.getChild(0).getText());
+    assertEquals("IN ", transactionFilter.getChild(1).getText());
     assertEquals("\"2015-01-01\"", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4888,23 +4907,23 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".pnameLIKE\"wil*card\"", sfq.getChild(2).getText());
+    assertEquals(".pname LIKE \"wil*card\"", sfq.getChild(2).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
     assertEquals(".", whichclause.getChild(0).getText());
-    assertEquals("pnameLIKE\"wil*card\"", whichclause.getChild(1).getText());
+    assertEquals("pname LIKE \"wil*card\"", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("pname", transactionFilter.getChild(0).getText());
-    assertEquals("LIKE", transactionFilter.getChild(1).getText());
+    assertEquals("pname ", transactionFilter.getChild(0).getText());
+    assertEquals("LIKE ", transactionFilter.getChild(1).getText());
     assertEquals("\"wil*card\"", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4927,23 +4946,23 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals(".pnameLIKEwil*card", sfq.getChild(2).getText());
+    assertEquals(".pname LIKE wil*card", sfq.getChild(2).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
     assertEquals(".", whichclause.getChild(0).getText());
-    assertEquals("pnameLIKEwil*card", whichclause.getChild(1).getText());
+    assertEquals("pname LIKE wil*card", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("pname", transactionFilter.getChild(0).getText());
-    assertEquals("LIKE", transactionFilter.getChild(1).getText());
+    assertEquals("pname ", transactionFilter.getChild(0).getText());
+    assertEquals("LIKE ", transactionFilter.getChild(1).getText());
     assertEquals("wil*card", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -4964,25 +4983,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, ename, WHITE_SPACE, WHICHCLAUSE, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS ApnameLIKE\"wil*\"", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A pname LIKE \"wil*\"", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICHHAS A", whichclause.getChild(0).getText());
-    assertEquals("pnameLIKE\"wil*\"", whichclause.getChild(1).getText());
+    assertEquals("WHICH HAS A ", whichclause.getChild(0).getText());
+    assertEquals("pname LIKE \"wil*\"", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("pname", transactionFilter.getChild(0).getText());
-    assertEquals("LIKE", transactionFilter.getChild(1).getText());
+    assertEquals("pname ", transactionFilter.getChild(0).getText());
+    assertEquals("LIKE ", transactionFilter.getChild(1).getText());
     assertEquals("\"wil*\"", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -5003,25 +5022,25 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS ApnameLIKEwil*", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A pname LIKE wil*", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICHHAS A", whichclause.getChild(0).getText());
-    assertEquals("pnameLIKEwil*", whichclause.getChild(1).getText());
+    assertEquals("WHICH HAS A ", whichclause.getChild(0).getText());
+    assertEquals("pname LIKE wil*", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("pname", transactionFilter.getChild(0).getText());
-    assertEquals("LIKE", transactionFilter.getChild(1).getText());
+    assertEquals("pname ", transactionFilter.getChild(0).getText());
+    assertEquals("LIKE ", transactionFilter.getChild(1).getText());
     assertEquals("wil*", transactionFilter.getChild(2).getText());
 
     assertTrue(sfq.filter instanceof POV);
@@ -5042,26 +5061,26 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, role, WHICHCLAUSE, EOF
-    assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
+    // 5 children: FIND, entity, WHITE_SPACE, entity_filter, EOF
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("FIND ", sfq.getChild(0).getText());
     assertEquals("ename", sfq.getChild(1).getText());
-    assertEquals("WHICHHAS Apname=wil*", sfq.getChild(2).getText());
+    assertEquals("WHICH HAS A pname = wil*", sfq.getChild(3).getText());
     assertEquals("ename", sfq.e.toString());
     assertNull(sfq.r);
     assertEquals("POV", sfq.filter.getClass().getSimpleName());
 
-    final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    final ParseTree whichclause = sfq.getChild(3);
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICHHAS A", whichclause.getChild(0).getText());
-    assertEquals("pname=wil*", whichclause.getChild(1).getText());
+    assertEquals("WHICH HAS A ", whichclause.getChild(0).getText());
+    assertEquals("pname = wil*", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
-    assertEquals(3, transactionFilter.getChildCount());
-    assertEquals("pname", transactionFilter.getChild(0).getText());
+    assertEquals(4, transactionFilter.getChildCount());
+    assertEquals("pname ", transactionFilter.getChild(0).getText());
     assertEquals("=", transactionFilter.getChild(1).getText());
-    assertEquals("wil*", transactionFilter.getChild(2).getText());
+    assertEquals("wil*", transactionFilter.getChild(3).getText());
 
     assertTrue(sfq.filter instanceof POV);
     final POV pov = (POV) sfq.filter;
@@ -5083,22 +5102,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/data/bla.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /data/bla.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/data/bla.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /data/bla.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/data/bla.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5120,22 +5139,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/*", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /*", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/*", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /*", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/*", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5158,22 +5177,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/*/", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /*/", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/*/", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /*/", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/*/", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5196,22 +5215,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/**/", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /**/", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/**/", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /**/", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/**/", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5233,22 +5252,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/**/*", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /**/*", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/**/*", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /**/*", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/**/*", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5270,22 +5289,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/*/*", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /*/*", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/*/*", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /*/*", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/*/*", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5307,22 +5326,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/*/*.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /*/*.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/*/*.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /*/*.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/*/*.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5344,22 +5363,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/**/*.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /**/*.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/**/*.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /**/*.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/**/*.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5381,22 +5400,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/*.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /*.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/*.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /*.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/*.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5418,22 +5437,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT*.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT *.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT*.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT *.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("*.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5455,22 +5474,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT*", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT *", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT*", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT *", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("*", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5600,22 +5619,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT*%.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT *%.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT*%.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT *%.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("*%.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5637,22 +5656,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT*\\*.acq", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT *\\*.acq", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT*\\*.acq", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT *\\*.acq", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("*\\*.acq", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -5688,8 +5707,8 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    assertTrue(sfq.filter instanceof TransactionFilter);
     assertEquals("TRANS(Insert,null,Transactor(some.user,=))", sfq.filter.toString());
+    assertTrue(sfq.filter instanceof TransactionFilter);
   }
 
   /** String ticket262a = "COUNT FILE which is not referenced"; */
@@ -5874,6 +5893,21 @@ public class TestCQL {
     final CqContext sfq = parser.cq();
 
     System.out.println(sfq.toStringTree(parser));
+    assertEquals(4, sfq.getChildCount());
+    assertEquals(
+        "WHICH IS NOT REFERENCED BY AN entity WHICH WAS created by me", sfq.getChild(2).getText());
+
+    ParseTree filter = sfq.getChild(2).getChild(1);
+    assertEquals(1, filter.getChildCount());
+    ParseTree negation = filter.getChild(0);
+    assertEquals(2, negation.getChildCount());
+    assertEquals("NOT ", negation.getChild(0).getText());
+    assertEquals("REFERENCED BY AN entity WHICH WAS created by me", negation.getChild(1).getText());
+    ParseTree refereced = negation.getChild(1).getChild(0);
+    assertEquals("REFERENCED ", refereced.getChild(0).getText());
+    assertEquals("BY ", refereced.getChild(1).getText());
+    assertEquals("AN ", refereced.getChild(2).getText());
+    assertEquals("entity ", refereced.getChild(3).getText());
 
     assertTrue(sfq.filter instanceof Negation);
     final EntityFilterInterface backref = ((Negation) sfq.filter).getFilter();
@@ -6127,22 +6161,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/dir/with/date/2016-05-15", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /dir/with/date/2016-05-15", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/dir/with/date/2016-05-15", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /dir/with/date/2016-05-15", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/dir/with/date/2016-05-15", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -6162,22 +6196,22 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
-    assertEquals("WHICHIS STORED AT/dir/with/date/2016-05-15/**", sfq.getChild(2).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
+    assertEquals("WHICH IS STORED AT /dir/with/date/2016-05-15/**", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
-    assertEquals("IS STORED AT/dir/with/date/2016-05-15/**", whichclause.getChild(1).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
+    assertEquals("IS STORED AT /dir/with/date/2016-05-15/**", whichclause.getChild(1).getText());
 
     final ParseTree transactionFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, transactionFilter.getChildCount());
-    assertEquals("IS STORED AT", transactionFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", transactionFilter.getChild(0).getText());
     assertEquals("/dir/with/date/2016-05-15/**", transactionFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -6320,25 +6354,26 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
     assertEquals(
-        "WHICHIS STORED AT'/SimulationData/2016_single/2018-01-10/**'", sfq.getChild(2).getText());
+        "WHICH IS STORED AT '/SimulationData/2016_single/2018-01-10/**'",
+        sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
     assertEquals(
-        "IS STORED AT'/SimulationData/2016_single/2018-01-10/**'",
+        "IS STORED AT '/SimulationData/2016_single/2018-01-10/**'",
         whichclause.getChild(1).getText());
 
     final ParseTree satFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, satFilter.getChildCount());
-    assertEquals("IS STORED AT", satFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", satFilter.getChild(0).getText());
     assertEquals("'/SimulationData/2016_single/2018-01-10/**'", satFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -6357,24 +6392,25 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("FIND", sfq.getChild(0).getText());
-    assertEquals("FILE", sfq.getChild(1).getText());
+    assertEquals("FIND ", sfq.getChild(0).getText());
+    assertEquals("FILE ", sfq.getChild(1).getText());
     assertEquals(
-        "WHICHIS STORED AT/SimulationData/2016_single/2018-01-10/**", sfq.getChild(2).getText());
+        "WHICH IS STORED AT /SimulationData/2016_single/2018-01-10/**", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
 
     final ParseTree whichclause = sfq.getChild(2);
-    // 2 children: WHICH, POV
+    // 2 children: WHICH , POV
     assertEquals(2, whichclause.getChildCount());
-    assertEquals("WHICH", whichclause.getChild(0).getText());
+    assertEquals("WHICH ", whichclause.getChild(0).getText());
     assertEquals(
-        "IS STORED AT/SimulationData/2016_single/2018-01-10/**", whichclause.getChild(1).getText());
+        "IS STORED AT /SimulationData/2016_single/2018-01-10/**",
+        whichclause.getChild(1).getText());
 
     final ParseTree satFilter = whichclause.getChild(1).getChild(0);
     assertEquals(2, satFilter.getChildCount());
-    assertEquals("IS STORED AT", satFilter.getChild(0).getText());
+    assertEquals("IS STORED AT ", satFilter.getChild(0).getText());
     assertEquals("/SimulationData/2016_single/2018-01-10/**", satFilter.getChild(1).getText());
 
     assertTrue(sfq.filter instanceof StoredAt);
@@ -6396,8 +6432,7 @@ public class TestCQL {
   }
 
   /** String queryIssue31 = "FIND FILE WHICH IS STORED AT /data/in0.foo"; */
-  // FIXME Remove "expected" annotation.
-  @Test(expected = AssertionError.class)
+  @Test
   public void testIssue31() {
     CQLLexer lexer;
     lexer = new CQLLexer(CharStreams.fromString(this.queryIssue31));
@@ -6410,7 +6445,7 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("WHICHIS STORED AT/data/in0.foo", sfq.getChild(2).getText());
+    assertEquals("WHICH IS STORED AT /data/in0.foo", sfq.getChild(2).getText());
     assertEquals("FILE", sfq.r.toString());
     assertNull(sfq.e);
     assertEquals("StoredAt", sfq.filter.getClass().getSimpleName());
@@ -6441,14 +6476,14 @@ public class TestCQL {
 
     // 4 children: FIND, role, WHICHCLAUSE, EOF
     assertEquals(4, sfq.getChildCount());
-    assertEquals("WITH((p0=v0ORp1=v1)ANDp2=v2)", sfq.getChild(2).getText());
+    assertEquals("WITH ((p0 = v0 OR p1=v1) AND p2=v2)", sfq.getChild(2).getText());
     assertEquals("ENTITY", sfq.r.toString());
     assertEquals("Conjunction", sfq.filter.getClass().getSimpleName());
     final ParseTree whichclause = sfq.getChild(2);
     final ParseTree conjunction = whichclause.getChild(2);
-    assertEquals("(p0=v0ORp1=v1)ANDp2=v2", conjunction.getText());
+    assertEquals("(p0 = v0 OR p1=v1) AND p2=v2", conjunction.getText());
     final ParseTree disjunction = conjunction.getChild(1);
-    assertEquals("p0=v0ORp1=v1", disjunction.getText());
+    assertEquals("p0 = v0 OR p1=v1", disjunction.getText());
     final ParseTree pov = conjunction.getChild(4);
     assertEquals("p2=v2", pov.getText());
   }
@@ -6465,10 +6500,190 @@ public class TestCQL {
 
     System.out.println(sfq.toStringTree(parser));
 
-    // 4 children: FIND, version, role, entity, EOF
+    // 5 children: FIND, version, role, entity,  EOF
     assertEquals(5, sfq.getChildCount());
     assertEquals(VersionFilter.ANY_VERSION, sfq.v);
     assertEquals(Query.Role.ENTITY, sfq.r);
     assertEquals("e1", sfq.e.toString());
   }
+
+  /** String query57a = "FIND ENTITY"; */
+  @Test
+  public void testQuery57a() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query57a));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    // 3 children: FIND, ENTITY, EOF
+    assertEquals(3, sfq.getChildCount());
+    assertEquals(Query.Role.ENTITY, sfq.r);
+    assertNull(sfq.e);
+  }
+
+  /** String query57b = "FIND ENTITY WITH ID"; */
+  @Test
+  public void testQuery57b() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query57b));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    // 4 children: FIND, ENTITY, WHICHCLAUSE, EOF
+    assertEquals(4, sfq.getChildCount());
+    assertEquals(Query.Role.ENTITY, sfq.r);
+    assertNull(sfq.e);
+    assertEquals("WITH ID", sfq.getChild(2).getText());
+  }
+
+  /** String query57c = "FIND ENTITY WITH ID = 123"; */
+  @Test
+  public void testQuery57c() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query57c));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    // 4 children: FIND, ENTITY, WHICHCLAUSE, EOF
+    assertEquals(4, sfq.getChildCount());
+    assertEquals(Query.Role.ENTITY, sfq.r);
+    assertNull(sfq.e);
+    assertEquals("WITH ID = 123", sfq.getChild(2).getText());
+  }
+
+  /** String queryIssue116 = "FIND *"; */
+  @Test
+  public void testIssue116() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.queryIssue116));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    // 3 children: FIND, ENTITY, EOF
+    assertEquals(3, sfq.getChildCount());
+    assertNull(sfq.r);
+    assertTrue(sfq.e.type == Query.Pattern.TYPE_LIKE);
+    assertEquals("%", sfq.e.toString());
+  }
+
+  /** String query54e = "SELECT id FROM ename"; */
+  @Test
+  public void testQuery54e() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query54e));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertEquals(5, sfq.getChildCount());
+    assertEquals("SELECT ", sfq.getChild(0).getText());
+    assertEquals("id ", sfq.getChild(1).getText());
+    assertEquals("FROM ", sfq.getChild(2).getText());
+    assertEquals("ename", sfq.getChild(3).getText());
+    assertEquals(Query.Pattern.TYPE_NORMAL, sfq.e.type);
+    assertEquals("ename", sfq.e.toString());
+    assertNull(sfq.r);
+    assertEquals(Query.Type.FIND, sfq.t);
+    assertNotNull(sfq.s);
+    assertFalse(sfq.s.isEmpty());
+    assertEquals(1, sfq.s.size());
+    assertEquals("id", sfq.s.get(0).toString());
+  }
+
+  /** String query58a = "FIND ENTITY WITH endswith"; */
+  @Test
+  public void testQuery58a() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query58a));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertEquals("POV(endswith,null,null)", sfq.filter.toString());
+  }
+
+  /** String query58b = "FIND ENTITY WITH endswith = val1"; */
+  @Test
+  public void testQuery58b() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query58b));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertEquals("POV(endswith,=,val1)", sfq.filter.toString());
+  }
+
+  /** String query58c = "FIND ENTITY WITH 0with = val1"; */
+  @Test
+  public void testQuery58c() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query58c));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertNull(((POV) sfq.filter).getSubProperty());
+    assertEquals("POV(0with,=,val1)", sfq.filter.toString());
+  }
+
+  /** String query58d = "FIND ENTITY WITH WITH"; */
+  @Test
+  public void testQuery58d() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query58d));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertEquals("POV(withdrawn,=,TRUE)", sfq.filter.toString());
+    assertNull(((POV) sfq.filter).getSubProperty());
+  }
+
+  /** String query58e = "FIND ENTITY WITH pname=with"; */
+  @Test
+  public void testQuery58e() {
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.query58e));
+    final CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+    final CQLParser parser = new CQLParser(tokens);
+    final CqContext sfq = parser.cq();
+
+    System.out.println(sfq.toStringTree(parser));
+
+    assertEquals("POV(pname,=,with)", sfq.filter.toString());
+    assertNull(((POV) sfq.filter).getSubProperty());
+  }
 }