You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2011/01/26 15:34:41 UTC

svn commit: r1063734 [2/2] - /directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestTest.java

Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestTest.java?rev=1063734&r1=1063733&r2=1063734&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestTest.java Wed Jan 26 14:34:41 2011
@@ -39,15 +39,23 @@ import org.apache.directory.shared.asn1.
 import org.apache.directory.shared.asn1.ber.Asn1Container;
 import org.apache.directory.shared.asn1.ber.Asn1Decoder;
 import org.apache.directory.shared.asn1.ber.tlv.TLVStateEnum;
-import org.apache.directory.shared.ldap.codec.AttributeValueAssertion;
 import org.apache.directory.shared.ldap.codec.LdapEncoder;
 import org.apache.directory.shared.ldap.codec.LdapMessageContainer;
 import org.apache.directory.shared.ldap.codec.ResponseCarryingException;
-import org.apache.directory.shared.ldap.codec.decorators.SearchRequestDecorator;
 import org.apache.directory.shared.ldap.codec.search.controls.subentries.Subentries;
 import org.apache.directory.shared.ldap.codec.search.controls.subentries.SubentriesDecorator;
 import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.model.filter.AndNode;
+import org.apache.directory.shared.ldap.model.filter.ApproximateNode;
+import org.apache.directory.shared.ldap.model.filter.EqualityNode;
+import org.apache.directory.shared.ldap.model.filter.ExprNode;
+import org.apache.directory.shared.ldap.model.filter.GreaterEqNode;
+import org.apache.directory.shared.ldap.model.filter.LessEqNode;
+import org.apache.directory.shared.ldap.model.filter.NotNode;
+import org.apache.directory.shared.ldap.model.filter.OrNode;
+import org.apache.directory.shared.ldap.model.filter.PresenceNode;
 import org.apache.directory.shared.ldap.model.filter.SearchScope;
+import org.apache.directory.shared.ldap.model.filter.SubstringNode;
 import org.apache.directory.shared.ldap.model.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.model.message.Control;
 import org.apache.directory.shared.ldap.model.message.Message;
@@ -145,18 +153,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -187,8 +195,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -199,52 +206,44 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (& (...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode node = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
+        AndNode andNode = ( AndNode ) node;
+        assertNotNull( andNode );
+
+        List<ExprNode> andNodes = andNode.getChildren();
 
         // (& (| (...
-        assertEquals( 2, andFilters.size() );
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
+        assertEquals( 2, andNodes.size() );
+        OrNode orFilter = ( OrNode ) andNodes.get( 0 );
         assertNotNull( orFilter );
 
         // (& (| (obectclass=top) (...
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
-        assertNotNull( equalityMatch );
-
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        List<ExprNode> orNodes = orFilter.getChildren();
+        assertEquals( 2, orNodes.size() );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "top", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", equalityNode.getAttribute() );
+        assertEquals( "top", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (...
-        equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "ou", assertion.getAttributeDesc() );
-        assertEquals( "contacts", assertion.getAssertionValue().getString() );
+        assertEquals( "ou", equalityNode.getAttribute() );
+        assertEquals( "contacts", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! ...
-        NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
-        assertNotNull( notFilter );
+        NotNode notNode = ( NotNode ) andNodes.get( 1 );
+        assertNotNull( notNode );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
-        equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
-        assertNotNull( equalityMatch );
+        equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
+        assertNotNull( equalityNode );
 
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "ttt", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", equalityNode.getAttribute() );
+        assertEquals( "ttt", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -316,17 +315,17 @@ public class SearchRequestTest
                 //      and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, //      or [1] SET of Filter,
                 ( byte ) 0xA8, 0x12, //      approxMatch [8]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x04, 0x03, // attributeDesc AttributeDescription (LDAPString), 
-                't', 'o', 'p', ( byte ) 0xA6, 0x0E, // lessOrEqual [3] AttributeValueAssertion,
-                0x04, 0x02, // AttributeValueAssertion ::= SEQUENCE {
+                't', 'o', 'p', ( byte ) 0xA6, 0x0E, // lessOrEqual [3] Assertion,
+                0x04, 0x02, // Assertion ::= SEQUENCE {
                 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x08, // assertionValue AssertionValue (OCTET STRING) } 
                 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA5, 0x12, // greaterOrEqual [5] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA5, 0x12, // greaterOrEqual [5] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString), 
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x04, 0x03, 't', 't', 't', // assertionValue AssertionValue (OCTET STRING) }
                 // attributes AttributeDescriptionList }
@@ -355,9 +354,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -368,52 +365,44 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (& (...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
+        List<ExprNode> andNodes = andNode.getChildren();
 
         // (& (| (...
-        assertEquals( 2, andFilters.size() );
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
+        assertEquals( 2, andNodes.size() );
+        OrNode orFilter = ( OrNode ) andNodes.get( 0 );
         assertNotNull( orFilter );
 
         // (& (| (objectclass~=top) (...
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
-        AttributeValueAssertionFilter approxMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
-        assertNotNull( approxMatch );
+        List<ExprNode> orNodes = orFilter.getChildren();
+        assertEquals( 2, orNodes.size() );
+        ApproximateNode<?> approxNode = ( ApproximateNode<?> ) orNodes.get( 0 );
+        assertNotNull( approxNode );
 
-        AttributeValueAssertion assertion = approxMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "top", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", approxNode.getAttribute() );
+        assertEquals( "top", approxNode.getValue().getString() );
 
         // (& (| (objectclass~=top) (ou<=contacts) ) (...
-        AttributeValueAssertionFilter lessOrEqual = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
-        assertNotNull( lessOrEqual );
-
-        assertion = lessOrEqual.getAssertion();
-        assertNotNull( assertion );
+        LessEqNode<?> lessOrEqualNode = ( LessEqNode<?> ) orNodes.get( 1 );
+        assertNotNull( lessOrEqualNode );
 
-        assertEquals( "ou", assertion.getAttributeDesc() );
-        assertEquals( "contacts", assertion.getAssertionValue().getString() );
+        assertEquals( "ou", lessOrEqualNode.getAttribute() );
+        assertEquals( "contacts", lessOrEqualNode.getValue().getString() );
 
         // (& (| (objectclass~=top) (ou<=contacts) ) (! ...
-        NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
-        assertNotNull( notFilter );
+        NotNode notNode = ( NotNode ) andNodes.get( 1 );
+        assertNotNull( notNode );
 
         // (& (| (objectclass~=top) (ou<=contacts) ) (! (objectclass>=ttt) ) )
-        AttributeValueAssertionFilter greaterOrEqual = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
+        GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) notNode.getFirstChild();
         assertNotNull( greaterOrEqual );
 
-        assertion = greaterOrEqual.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "ttt", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", greaterOrEqual.getAttribute() );
+        assertEquals( "ttt", greaterOrEqual.getValue().getString() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -497,8 +486,8 @@ public class SearchRequestTest
                 // AttributeDescription ::= LDAPString
                 ( byte ) 0xA2, 0x14, // not [2] Filter,
                 ( byte ) 0xA5, 0x12, // greaterOrEqual [5]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -532,9 +521,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -545,45 +532,43 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (& (...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
+        List<ExprNode> andNodes = andNode.getChildren();
 
         // (& (| (...
-        assertEquals( 2, andFilters.size() );
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
+        assertEquals( 2, andNodes.size() );
+        OrNode orFilter = ( OrNode ) andNodes.get( 0 );
         assertNotNull( orFilter );
 
         // (& (| (objectclass=*) (...
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
+        List<ExprNode> orNodes = orFilter.getChildren();
+        assertEquals( 2, orNodes.size() );
 
-        PresentFilter presentFilter = ( PresentFilter ) orFilters.get( 0 );
-        assertNotNull( presentFilter );
+        PresenceNode presenceNode = ( PresenceNode ) orNodes.get( 0 );
+        assertNotNull( presenceNode );
 
-        assertEquals( "objectclass", presentFilter.getAttributeDescription() );
+        assertEquals( "objectclass", presenceNode.getAttribute() );
 
         // (& (| (objectclass=*) (ou=*) ) (...
-        presentFilter = ( PresentFilter ) orFilters.get( 1 );
-        assertNotNull( presentFilter );
+        presenceNode = ( PresenceNode ) orNodes.get( 1 );
+        assertNotNull( presenceNode );
 
-        assertEquals( "ou", presentFilter.getAttributeDescription() );
+        assertEquals( "ou", presenceNode.getAttribute() );
 
         // (& (| (objectclass=*) (ou=*) ) (! ...
-        NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
-        assertNotNull( notFilter );
+        NotNode notNode = ( NotNode ) andNodes.get( 1 );
+        assertNotNull( notNode );
 
         // (& (| (objectclass=*) (ou=*) ) (! (objectclass>=ttt) ) )
-        AttributeValueAssertionFilter greaterOrEqual = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
+        GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) notNode.getFirstChild();
         assertNotNull( greaterOrEqual );
 
-        AttributeValueAssertion assertion = greaterOrEqual.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "ttt", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", greaterOrEqual.getAttribute() );
+        assertEquals( "ttt", greaterOrEqual.getValue().getString() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -679,9 +664,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 3, searchRequest.getMessageId() );
         assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
@@ -692,10 +675,11 @@ public class SearchRequestTest
         assertEquals( false, searchRequest.getTypesOnly() );
 
         // (objectClass = *)
-        Filter filter = decorator.getCurrentFilter();
-        PresentFilter presentFilter = ( PresentFilter ) filter;
-        assertNotNull( presentFilter );
-        assertEquals( "objectClass", presentFilter.getAttributeDescription() );
+        ExprNode filter = searchRequest.getFilter();
+
+        PresenceNode presenceNode = ( PresenceNode ) filter;
+        assertNotNull( presenceNode );
+        assertEquals( "objectClass", presenceNode.getAttribute() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -785,9 +769,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 3, searchRequest.getMessageId() );
         assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
@@ -798,10 +780,11 @@ public class SearchRequestTest
         assertEquals( false, searchRequest.getTypesOnly() );
 
         // (objectClass = *)
-        Filter filter = decorator.getCurrentFilter();
-        PresentFilter presentFilter = ( PresentFilter ) filter;
-        assertNotNull( presentFilter );
-        assertEquals( "objectClass", presentFilter.getAttributeDescription() );
+        ExprNode filter = searchRequest.getFilter();
+
+        PresenceNode presenceNode = ( PresenceNode ) filter;
+        assertNotNull( presenceNode );
+        assertEquals( "objectClass", presenceNode.getAttribute() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -873,9 +856,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-        SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 3, searchRequest.getMessageId() );
         assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
@@ -886,10 +867,11 @@ public class SearchRequestTest
         assertEquals( false, searchRequest.getTypesOnly() );
 
         // (objectClass = *)
-        Filter filter = decorator.getCurrentFilter();
-        PresentFilter presentFilter = ( PresentFilter ) filter;
-        assertNotNull( presentFilter );
-        assertEquals( "objectClass", presentFilter.getAttributeDescription() );
+        ExprNode filter = searchRequest.getFilter();
+
+        PresenceNode presenceNode = ( PresenceNode ) filter;
+        assertNotNull( presenceNode );
+        assertEquals( "objectClass", presenceNode.getAttribute() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -963,9 +945,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 33, searchRequest.getMessageId() );
         assertEquals( "dc=example,dc=com", searchRequest.getBase().toString() );
@@ -976,40 +956,39 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        OrFilter orFilter = ( OrFilter ) decorator.getCurrentFilter();
-        assertNotNull( orFilter );
-        assertEquals( 5, orFilter.getFilterSet().size() );
+        OrNode orNode = ( OrNode ) searchRequest.getFilter();
+        assertNotNull( orNode );
+        assertEquals( 5, orNode.getChildren().size() );
 
         // uid=akarasulu
-        AttributeValueAssertion assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 0 ) )
-            .getAssertion();
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 0 );
 
-        assertEquals( "uid", assertion.getAttributeDesc() );
-        assertEquals( "akarasulu", assertion.getAssertionValue().getString() );
+        assertEquals( "uid", equalityNode.getAttribute() );
+        assertEquals( "akarasulu", equalityNode.getValue().getString() );
 
         // cn=aok
-        assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 1 ) ).getAssertion();
+        equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 1 );
 
-        assertEquals( "cn", assertion.getAttributeDesc() );
-        assertEquals( "aok", assertion.getAssertionValue().getString() );
+        assertEquals( "cn", equalityNode.getAttribute() );
+        assertEquals( "aok", equalityNode.getValue().getString() );
 
         // ou = Human Resources
-        assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 2 ) ).getAssertion();
+        equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 2 );
 
-        assertEquals( "ou", assertion.getAttributeDesc() );
-        assertEquals( "Human Resources", assertion.getAssertionValue().getString() );
+        assertEquals( "ou", equalityNode.getAttribute() );
+        assertEquals( "Human Resources", equalityNode.getValue().getString() );
 
         // l=Santa Clara
-        assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 3 ) ).getAssertion();
+        equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 3 );
 
-        assertEquals( "l", assertion.getAttributeDesc() );
-        assertEquals( "Santa Clara", assertion.getAssertionValue().getString() );
+        assertEquals( "l", equalityNode.getAttribute() );
+        assertEquals( "Santa Clara", equalityNode.getValue().getString() );
 
         // cn=abok
-        assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 4 ) ).getAssertion();
+        equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 4 );
 
-        assertEquals( "cn", assertion.getAttributeDesc() );
-        assertEquals( "abok", assertion.getAssertionValue().getString() );
+        assertEquals( "cn", equalityNode.getAttribute() );
+        assertEquals( "abok", equalityNode.getValue().getString() );
 
         // The attributes
         List<String> attributes = searchRequest.getAttributes();
@@ -1137,9 +1116,8 @@ public class SearchRequestTest
         }
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
 
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 4, searchRequest.getMessageId() );
         assertEquals( 2, searchRequest.getControls().size() );
@@ -1162,9 +1140,10 @@ public class SearchRequestTest
         assertEquals( 0, searchRequest.getTimeLimit() );
         assertEquals( false, searchRequest.getTypesOnly() );
 
-        Filter filter = decorator.getCurrentFilter();
-        assertTrue( filter instanceof PresentFilter );
-        assertEquals( "objectClass", ( ( PresentFilter ) filter ).getAttributeDescription() );
+        ExprNode filter = searchRequest.getFilter();
+
+        assertTrue( filter instanceof PresenceNode );
+        assertEquals( "objectClass", ( ( PresenceNode ) filter ).getAttribute() );
 
         // Check the encoding
         try
@@ -1253,8 +1232,8 @@ public class SearchRequestTest
                 0x2A, // or [1] SET of Filter,
                 ( byte ) 0xA3,
                 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -1263,8 +1242,8 @@ public class SearchRequestTest
                 ( byte ) 0xA3,
                 0x14, // equalityMatch
                 // [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x08, '2', '.', '5', '.', '4',
                 '.',
                 '1',
@@ -1281,8 +1260,8 @@ public class SearchRequestTest
                 // Filter,
                 ( byte ) 0xA3,
                 0x1D, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x16, 'o', 'r', 'g', 'a', 'n', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'a', 'l', 'U', 'n', 'i', 't',
                 'N', 'a', 'm', 'e',
@@ -1316,9 +1295,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -1329,52 +1306,45 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (& (...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
+        List<ExprNode> andNodes = andNode.getChildren();
 
         // (& (| (...
-        assertEquals( 2, andFilters.size() );
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
+        assertEquals( 2, andNodes.size() );
+        OrNode orFilter = ( OrNode ) andNodes.get( 0 );
         assertNotNull( orFilter );
 
         // (& (| (obectclass=top) (...
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
-        assertNotNull( equalityMatch );
+        List<ExprNode> orNodes = orFilter.getChildren();
+        assertEquals( 2, orNodes.size() );
+        
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "top", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", equalityNode.getAttribute() );
+        assertEquals( "top", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (...
-        equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "2.5.4.11", assertion.getAttributeDesc() );
-        assertEquals( "contacts", assertion.getAssertionValue().getString() );
+        assertEquals( "2.5.4.11", equalityNode.getAttribute() );
+        assertEquals( "contacts", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! ...
-        NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
-        assertNotNull( notFilter );
+        NotNode notNode = ( NotNode ) andNodes.get( 1 );
+        assertNotNull( notNode );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
-        equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
+        assertNotNull( equalityNode );
 
-        assertEquals( "organizationalUnitName", assertion.getAttributeDesc() );
-        assertEquals( "ttt", assertion.getAssertionValue().getString() );
+        assertEquals( "organizationalUnitName", equalityNode.getAttribute() );
+        assertEquals( "ttt", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -1442,9 +1412,8 @@ public class SearchRequestTest
         }
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
 
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 4, searchRequest.getMessageId() );
         assertEquals( 1, searchRequest.getControls().size() );
@@ -1464,9 +1433,10 @@ public class SearchRequestTest
         assertEquals( 0, searchRequest.getTimeLimit() );
         assertEquals( false, searchRequest.getTypesOnly() );
 
-        Filter filter = decorator.getCurrentFilter();
-        assertTrue( filter instanceof PresentFilter );
-        assertEquals( "objectClass", ( ( PresentFilter ) filter ).getAttributeDescription() );
+        ExprNode filter = searchRequest.getFilter();
+
+        assertTrue( filter instanceof PresenceNode );
+        assertEquals( "objectClass", ( ( PresenceNode ) filter ).getAttribute() );
 
         // Check the encoding
         try
@@ -1590,18 +1560,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -1632,9 +1602,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "", searchRequest.getBase().toString() );
@@ -1645,52 +1613,45 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (& (...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
+        List<ExprNode> andNodes = andNode.getChildren();
 
         // (& (| (...
-        assertEquals( 2, andFilters.size() );
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
+        assertEquals( 2, andNodes.size() );
+        OrNode orFilter = ( OrNode ) andNodes.get( 0 );
         assertNotNull( orFilter );
 
         // (& (| (obectclass=top) (...
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
-        assertNotNull( equalityMatch );
+        List<ExprNode> orNodes = orFilter.getChildren();
+        assertEquals( 2, orNodes.size() );
+        
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "top", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", equalityNode.getAttribute() );
+        assertEquals( "top", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (...
-        equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "ou", assertion.getAttributeDesc() );
-        assertEquals( "contacts", assertion.getAssertionValue().getString() );
+        assertEquals( "ou", equalityNode.getAttribute() );
+        assertEquals( "contacts", equalityNode.getValue().getString() );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! ...
-        NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
-        assertNotNull( notFilter );
+        NotNode notNode = ( NotNode ) andNodes.get( 1 );
+        assertNotNull( notNode );
 
         // (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
-        equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
+        assertNotNull( equalityNode );
 
-        assertEquals( "objectclass", assertion.getAttributeDesc() );
-        assertEquals( "ttt", assertion.getAssertionValue().getString() );
+        assertEquals( "objectclass", equalityNode.getAttribute() );
+        assertEquals( "ttt", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -1760,18 +1721,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -1884,18 +1845,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -2004,18 +1965,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -2124,18 +2085,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -2247,18 +2208,18 @@ public class SearchRequestTest
                 // and [0] SET OF Filter,
                 ( byte ) 0xA1, 0x24, // or [1] SET of Filter,
                 ( byte ) 0xA3, 0x12, // equalityMatch [3]
-                // AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                // Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
-                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
                 // assertionValue AssertionValue (OCTET STRING) }
                 0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
-                ( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x12, // equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 // attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
                 // assertionValue AssertionValue (OCTET STRING) }
@@ -2665,9 +2626,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 4, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -2678,14 +2637,12 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // >=
-        Filter filter = decorator.getCurrentFilter();
-        AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
-        assertNotNull( greaterThanFilter );
+        GreaterEqNode<?> greaterOrEqual = (GreaterEqNode<?>)searchRequest.getFilter();
 
-        AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
+        assertNotNull( greaterOrEqual );
 
-        assertEquals( "test", assertion.getAttributeDesc() );
-        assertEquals( "", assertion.getAssertionValue().getString() );
+        assertEquals( "test", greaterOrEqual.getAttribute() );
+        assertEquals( "", greaterOrEqual.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -2759,9 +2716,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 4, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -2772,14 +2727,12 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // >=
-        Filter filter = decorator.getCurrentFilter();
-        AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
-        assertNotNull( greaterThanFilter );
+        GreaterEqNode<?> greaterOrEqual = (GreaterEqNode<?>)searchRequest.getFilter();
 
-        AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
+        assertNotNull( greaterOrEqual );
 
-        assertEquals( "test", assertion.getAttributeDesc() );
-        assertEquals( "", assertion.getAssertionValue().getString() );
+        assertEquals( "test", greaterOrEqual.getAttribute() );
+        assertEquals( "", greaterOrEqual.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -2853,9 +2806,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 4, searchRequest.getMessageId() );
         assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
@@ -2866,14 +2817,12 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // >=
-        Filter filter = decorator.getCurrentFilter();
-        AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
-        assertNotNull( greaterThanFilter );
+        GreaterEqNode<?> greaterOrEqual = (GreaterEqNode<?>)searchRequest.getFilter();
 
-        AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
+        assertNotNull( greaterOrEqual );
 
-        assertEquals( "test", assertion.getAttributeDesc() );
-        assertEquals( "", assertion.getAssertionValue().getString() );
+        assertEquals( "test", greaterOrEqual.getAttribute() );
+        assertEquals( "", greaterOrEqual.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
 
@@ -3104,9 +3053,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 2, searchRequest.getMessageId() );
         assertEquals( "dc=pgpkeys", searchRequest.getBase().toString() );
@@ -3117,29 +3064,27 @@ public class SearchRequestTest
         assertEquals( false, searchRequest.getTypesOnly() );
 
         // And 
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        SubstringFilter substringFilter = ( SubstringFilter ) andFilters.get( 0 );
-        assertNotNull( substringFilter );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
-        assertEquals( "pgpuserid", substringFilter.getType() );
-        assertEquals( "vgjokjev@netcetera.com.mk", substringFilter.getInitialSubstrings() );
-        assertEquals( 0, substringFilter.getAnySubstrings().size() );
-        assertEquals( null, substringFilter.getFinalSubstrings() );
+        SubstringNode substringNode = ( SubstringNode ) andNodes.get( 0 );
+        assertNotNull( substringNode );
 
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
-        assertNotNull( equalityMatch );
+        assertEquals( "pgpuserid", substringNode.getAttribute() );
+        assertEquals( "vgjokjev@netcetera.com.mk", substringNode.getInitial() );
+        assertEquals( 0, substringNode.getAny().size() );
+        assertEquals( null, substringNode.getFinal() );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "pgpdisabled", assertion.getAttributeDesc() );
-        assertEquals( "0", assertion.getAssertionValue().getString() );
+        assertEquals( "pgpdisabled", equalityNode.getAttribute() );
+        assertEquals( "0", equalityNode.getValue().getString() );
 
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
@@ -3194,8 +3139,8 @@ public class SearchRequestTest
                 0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
                 // filter Filter,
                 ( byte ) 0xA3, 0x06, // Filter ::= CHOICE {
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 // attributes AttributeDescriptionList }
@@ -3220,9 +3165,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3233,15 +3176,12 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (a=b)
-        Filter filter = decorator.getCurrentFilter();
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) filter;
-        assertNotNull( equalityMatch );
+        EqualityNode<?> equalityNode = (EqualityNode<?>)searchRequest.getFilter();
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3300,8 +3240,8 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x08, // Filter ::= CHOICE {
                 ( byte ) 0xA3, 0x06,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 // attributes AttributeDescriptionList }
@@ -3326,9 +3266,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3339,22 +3277,20 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 1, andFilters.size() );
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        // (&(a=b))
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
-        assertNotNull( equalityMatch );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 1, andNodes.size() );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        // (&(a=b))
+        EqualityNode<?> equalityNode = (EqualityNode<?>)andNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3413,13 +3349,13 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x10, // Filter ::= CHOICE {
                 ( byte ) 0xA3, 0x06,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 ( byte ) 0xA3, 0x06,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
                 // attributes AttributeDescriptionList }
@@ -3444,9 +3380,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3457,32 +3391,27 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        // (&(a=b)...
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
-        assertNotNull( equalityMatch );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        // (&(a=b)...
+        EqualityNode<?> equalityNode = (EqualityNode<?>)andNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         // (&(a=b)(c=d))
-        equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
-        assertNotNull( equalityMatch );
+        equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "c", assertion.getAttributeDesc() );
-        assertEquals( "d", assertion.getAssertionValue().getString() );
+        assertEquals( "c", equalityNode.getAttribute() );
+        assertEquals( "d", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3541,8 +3470,8 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x0A, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -3566,9 +3495,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3579,29 +3506,27 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 1, andFilters.size() );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 1, andNodes.size() );
 
         // (&(&(..
-        AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
-        assertNotNull( andFilter2 );
+        AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
+        assertNotNull( andNode2 );
 
-        List<Filter> andFilters2 = andFilter2.getAndFilter();
-        assertEquals( 1, andFilters2.size() );
+        List<ExprNode> andNodes2 = andNode2.getChildren();
+        assertEquals( 1, andNodes2.size() );
 
         // (&(&(a=b)))
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
-        assertNotNull( equalityMatch );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
+        assertNotNull( equalityNode );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3661,13 +3586,13 @@ public class SearchRequestTest
                 ( byte ) 0xA0, 0x12, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA0, 0x10, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA3, 0x06,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 ( byte ) 0xA3, 0x06,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -3691,9 +3616,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3704,39 +3627,34 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 1, andFilters.size() );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 1, andNodes.size() );
 
         // (&(&(..
-        AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
-        assertNotNull( andFilter2 );
+        AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
+        assertNotNull( andNode2 );
 
-        List<Filter> andFilters2 = andFilter2.getAndFilter();
-        assertEquals( 2, andFilters2.size() );
+        List<ExprNode> andNodes2 = andNode2.getChildren();
+        assertEquals( 2, andNodes2.size() );
 
         // (&(&(a=b)...
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
-        assertNotNull( equalityMatch );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
+        assertNotNull( equalityNode );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         // (&(&(a=b)(c=d)
-        equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 1 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) andNodes2.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "c", assertion.getAttributeDesc() );
-        assertEquals( "d", assertion.getAssertionValue().getString() );
+        assertEquals( "c", equalityNode.getAttribute() );
+        assertEquals( "d", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3795,13 +3713,13 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x12, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
-                ( byte ) 0xA3, 0x06, //      equalityMatch [3] AttributeValueAssertion,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06, //      equalityMatch [3] Assertion,
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -3825,9 +3743,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3838,39 +3754,34 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
+
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
         // (&(&(..
-        AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
-        assertNotNull( andFilter2 );
+        AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
+        assertNotNull( andNode2 );
 
-        List<Filter> andFilters2 = andFilter2.getAndFilter();
-        assertEquals( 1, andFilters2.size() );
+        List<ExprNode> andNodes2 = andNode2.getChildren();
+        assertEquals( 1, andNodes2.size() );
 
         // (&(&(a=b))...
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
-        assertNotNull( equalityMatch );
-
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         // (&(&(a=b))(c=d))
-        equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "c", assertion.getAttributeDesc() );
-        assertEquals( "d", assertion.getAssertionValue().getString() );
+        assertEquals( "c", equalityNode.getAttribute() );
+        assertEquals( "d", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -3929,17 +3840,17 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x1A, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA0, 0x10, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
-                ( byte ) 0xA3, 0x06, //      equalityMatch [3] AttributeValueAssertion,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06, //      equalityMatch [3] Assertion,
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'e', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'f', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -3963,9 +3874,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -3976,49 +3885,42 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
+
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
         // (&(&(..
-        AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
-        assertNotNull( andFilter2 );
+        AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
+        assertNotNull( andNode2 );
 
-        List<Filter> andFilters2 = andFilter2.getAndFilter();
-        assertEquals( 2, andFilters2.size() );
+        List<ExprNode> andNodes2 = andNode2.getChildren();
+        assertEquals( 2, andNodes2.size() );
 
         // (&(&(a=b)...
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
-        assertNotNull( equalityMatch );
-
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         // (&(&(a=b)(c=d)...
-        equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 1 );
-        assertNotNull( equalityMatch );
+        equalityNode = ( EqualityNode<?> ) andNodes2.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "c", assertion.getAttributeDesc() );
-        assertEquals( "d", assertion.getAssertionValue().getString() );
+        assertEquals( "c", equalityNode.getAttribute() );
+        assertEquals( "d", equalityNode.getValue().getString() );
 
         // (&(&(a=b)(c=d))(e=f))
-        equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
-        assertNotNull( equalityMatch );
+        equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
 
-        assertEquals( "e", assertion.getAttributeDesc() );
-        assertEquals( "f", assertion.getAssertionValue().getString() );
+        assertEquals( "e", equalityNode.getAttribute() );
+        assertEquals( "f", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -4076,18 +3978,18 @@ public class SearchRequestTest
                 0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
                 // filter Filter,
                 ( byte ) 0xA0, 0x1A, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06, //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06, //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 ( byte ) 0xA1, 0x10, // Filter ::= CHOICE { or             [1] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'e', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'f', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -4111,9 +4013,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -4124,49 +4024,41 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode exprNode = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        AndNode andNode = ( AndNode ) exprNode;
+        assertNotNull( andNode );
 
-        // (&(a=b)..
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
-        assertNotNull( equalityMatch );
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        // (&(a=b)..
+        EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "a", assertion.getAttributeDesc() );
-        assertEquals( "b", assertion.getAssertionValue().getString() );
+        assertEquals( "a", equalityNode.getAttribute() );
+        assertEquals( "b", equalityNode.getValue().getString() );
 
         // (&(a=b)(|(...
-        OrFilter orFilter = ( OrFilter ) andFilters.get( 1 );
-        assertNotNull( orFilter );
+        OrNode orNode = ( OrNode ) andNodes.get( 1 );
+        assertNotNull( orNode );
 
-        List<Filter> orFilters = orFilter.getOrFilter();
-        assertEquals( 2, orFilters.size() );
+        List<ExprNode> orNodes = orNode.getChildren();
+        assertEquals( 2, orNodes.size() );
 
         // (&(a=b)(|(c=d)...
-        equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
-        assertNotNull( equalityMatch );
-
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
+        equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
+        assertNotNull( equalityNode );
 
-        assertEquals( "c", assertion.getAttributeDesc() );
-        assertEquals( "d", assertion.getAssertionValue().getString() );
+        assertEquals( "c", equalityNode.getAttribute() );
+        assertEquals( "d", equalityNode.getValue().getString() );
 
         // (&(a=b)(|(c=d)(e=f)))
-        equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
-        assertNotNull( equalityMatch );
+        equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
+        assertNotNull( equalityNode );
 
-        assertion = equalityMatch.getAssertion();
-        assertNotNull( assertion );
-
-        assertEquals( "e", assertion.getAttributeDesc() );
-        assertEquals( "f", assertion.getAssertionValue().getString() );
+        assertEquals( "e", equalityNode.getAttribute() );
+        assertEquals( "f", equalityNode.getValue().getString() );
 
         List<String> attributes = searchRequest.getAttributes();
         assertEquals( 0, attributes.size() );
@@ -4225,14 +4117,14 @@ public class SearchRequestTest
                 // filter Filter,
                 ( byte ) 0xA0, 0x14, // Filter ::= CHOICE { and             [0] SET OF Filter,
                 ( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'a', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'b', //      assertionValue AssertionValue (OCTET STRING) } 
                 ( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and             [0] SET OF Filter,
-                ( byte ) 0xA3, 0x06,//      equalityMatch [3] AttributeValueAssertion,
-                //      equalityMatch [3] AttributeValueAssertion,
-                // AttributeValueAssertion ::= SEQUENCE {
+                ( byte ) 0xA3, 0x06,//      equalityMatch [3] Assertion,
+                //      equalityMatch [3] Assertion,
+                // Assertion ::= SEQUENCE {
                 0x04, 0x01, 'c', //      attributeDesc AttributeDescription (LDAPString),
                 0x04, 0x01, 'd', //      assertionValue AssertionValue (OCTET STRING) } 
                 0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
@@ -4256,9 +4148,7 @@ public class SearchRequestTest
 
         assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
 
-                SearchRequestDecorator decorator = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequestDecorator();
-        SearchRequest searchRequest = decorator.getSearchRequest();
-
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
         assertEquals( "a=b", searchRequest.getBase().toString() );
@@ -4269,46 +4159,41 @@ public class SearchRequestTest
         assertEquals( true, searchRequest.getTypesOnly() );
 
         // (&(...
-        Filter filter = decorator.getCurrentFilter();
-        AndFilter andFilter = ( AndFilter ) filter;
-        assertNotNull( andFilter );
+        ExprNode filter = searchRequest.getFilter();
 
-        List<Filter> andFilters = andFilter.getAndFilter();
-        assertEquals( 2, andFilters.size() );
+        AndNode andNode = ( AndNode ) filter;
+        assertNotNull( andNode );
+
+        List<ExprNode> andNodes = andNode.getChildren();
+        assertEquals( 2, andNodes.size() );
 
         // (&(&(..
-        AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
-        assertNotNull( andFilter2 );
+        AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
+        assertNotNull( andNode2 );
 
-        List<Filter> andFilters2 = andFilter2.getAndFilter();
-        assertEquals( 1, andFilters2.size() );
+        List<ExprNode> andNodes2 = andNode2.getChildren();
+        assertEquals( 1, andNodes2.size() );
 
         // (&(&(a=b)...
-        AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
-        assertNotNull( equalityMatch );
-
-        AttributeValueAssertion assertion = equalityMatch.getAssertion();

[... 415 lines stripped ...]