From cdf0824f7b95989818b85ea579758a7980889b05 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 15 Oct 2014 14:43:02 +0000
Subject: [PATCH] (CR-4811) Converted opendj3 code to use SearchRequest like API

---
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/LDAPv2TestCase.java                                     |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/Requests.java                                                               |   14 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalClientConnection.java                                               |   85 --
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/SearchFilter.java                                                                        |   30 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/authorization/dseecompat/UserAttr.java                                                         |  109 +-
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java                                               |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java                                      |   25 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalSearchOperationTestCase.java                |   38 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProviderTestCase.java  |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProviderTestCase.java              |  154 +--
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java                               |    9 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProviderTestCase.java |   52 -
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java                                           |   12 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/LDAPURL.java                                                                             |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/ChangelogBackendTestCase.java                                 |    5 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/RequestFilteringPolicyTest.java                     |   31 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java                                |   10 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalLDAPSocketTestCase.java                     |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java                |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProviderTestCase.java      |   19 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java                                      |  288 +------
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java               |   15 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java                                                                          |    7 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java                                      |   19 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProviderTestCase.java        |    5 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/admin/AdministrationDataSync.java                                                              |    7 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java                                        |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVLVIndex.java                                         |  619 +++------------
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/VirtualAttributeRuleTestCase.java                                |    2 
 opendj-sdk/opendj3-server-dev/src/messages/messages/replication_es.properties                                                                             |    1 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java                                           |   15 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java                                                  |  105 +-
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/TraditionalWorkQueueTestCase.java                           |   12 
 opendj-sdk/opendj3-server-dev/src/messages/messages/replication_de.properties                                                                             |    1 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java              |  105 +-
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java                                   |    8 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPFilter.java                                                                 |   26 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProviderTestCase.java        |   59 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java            |    3 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProviderTestCase.java |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ProtocolWindowTest.java                                    |   15 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/GroupManagerTestCase.java                                         |   46 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java                             |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java                                    |    3 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/LDAPADListPluginTestCase.java                                  |   38 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java                              |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/config/JMXMBean.java                                                                           |   32 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/LDIFBackendTestCase.java                                      |   39 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java                               |    8 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java                            |   24 
 opendj-sdk/opendj3-server-dev/src/messages/messages/replication_fr.properties                                                                             |    1 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java                                                      |    3 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordPolicyControlTestCase.java                            |    5 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java            |   22 
 opendj-sdk/opendj3-server-dev/src/messages/messages/replication.properties                                                                                |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/BackendConfigManagerTestCase.java                                 |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/WorkflowConfigurationTest.java                                    |   50 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/ResourceLimitsPolicyTest.java                       |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExtensionTestUtils.java                                     |   63 -
 59 files changed, 709 insertions(+), 1,578 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
index 9eb3b56..3e8db08 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
@@ -272,10 +272,9 @@
     try
     {
       SearchRequestProtocolOp protocolOp = new SearchRequestProtocolOp(
-          ByteString.wrap(new byte[]{}), SearchScope.BASE_OBJECT,
-          DereferenceAliasesPolicy.NEVER,
-          0, 0,
-          true, LDAPFilter.decode("(objectClass=*)"), attributes);
+          ByteString.empty(), SearchScope.BASE_OBJECT,
+          DereferenceAliasesPolicy.NEVER, 0, 0, true,
+          LDAPFilter.objectClassPresent(), attributes);
       byte opType;
       LDAPMessage msg =
         new LDAPMessage(DSMLServlet.nextMessageID(), protocolOp, controls);
diff --git a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication.properties b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication.properties
index e3561a3..97fa2f5 100644
--- a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication.properties
+++ b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication.properties
@@ -121,8 +121,6 @@
  conflict information could not be added. Operation: %s, Result: %s
 ERR_CANNOT_RENAME_CONFLICT_ENTRY_58=An error happened trying to \
  rename a conflicting entry. DN: %s, Operation: %s, Result: %s
-ERR_EXCEPTION_RENAME_CONFLICT_ENTRY_59=An Exception happened when \
- trying to rename a conflicting entry. DN: %s, Operation: %s, Stacktrace: %s
 ERR_REPLICATION_COULD_NOT_CONNECT_61=The Replication is configured for \
  suffix %s but was not able to connect to any Replication Server
 ERR_CHANGELOG_ERROR_SENDING_ERROR_65=An unexpected error occurred \
diff --git a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_de.properties b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_de.properties
index 8746e92..e572ffe 100644
--- a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_de.properties
+++ b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_de.properties
@@ -88,7 +88,6 @@
 ERR_BAD_HISTORICAL_56=Eintrag %s hat einige unbekannte historische Informatinoen enthalten. Dadurch k\u00f6nnen Inkonsistenzen f\u00fcr diesen Eintrag auftreten
 ERR_CANNOT_ADD_CONFLICT_ATTRIBUTE_57=Es wurde ein Konflikt entdeckt, aber die Konfliktinformationen konnten nicht hinzugef\u00fcgt werden. Vorgang: %s, Ergebnis: %s
 ERR_CANNOT_RENAME_CONFLICT_ENTRY_58=Bei dem Versuch, einen widerspr\u00fcchlichen Eintrag umzubenennen, ist ein Fehler aufgetreten. DN: %s, Vorgang: %s, Ergebnis: %s
-ERR_EXCEPTION_RENAME_CONFLICT_ENTRY_59=Bei dem Versuch, einen widerspr\u00fcchlichen Eintrag umzubenennen, ist ein Ausnahmefehler aufgetreten. DN: %s, Vorgang: %s, Stacktrace: %s
 ERR_REPLICATION_COULD_NOT_CONNECT_61=Die Replikation ist f\u00fcr Suffix %s konfiguriert, konnte jedoch keine Verbindung zu einem Replikationsserver herstellen
 ERR_CHANGELOG_ERROR_SENDING_ERROR_65=Beim Senden einer Fehlernachricht an %s ist ein unerwarteter Fehler aufgetreten. Diese Verbindung wird geschlossen und erneut ge\u00f6ffnet
 ERR_CHANGELOG_ERROR_SENDING_MSG_66=Beim Senden einer Nachricht an %s ist ein unerwarteter Fehler aufgetreten. Diese Verbindung wird geschlossen und erneut ge\u00f6ffnet
diff --git a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_es.properties b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_es.properties
index 8606cb87..612fd36 100644
--- a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_es.properties
+++ b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_es.properties
@@ -88,7 +88,6 @@
 ERR_BAD_HISTORICAL_56=La entrada %s conten\u00eda informaci\u00f3n hist\u00f3rica desconocida. Es posible que esto genere incoherencias con respecto a esta entrada
 ERR_CANNOT_ADD_CONFLICT_ATTRIBUTE_57=Se detect\u00f3 un conflicto pero no se pudo agregar su informaci\u00f3n. Operaci\u00f3n: %s, Resultado: %s
 ERR_CANNOT_RENAME_CONFLICT_ENTRY_58=Se produjo un error al intentar cambiar el nombre de una entrada contradictoria. DN: %s, Operaci\u00f3n: %s, Resultado: %s 
-ERR_EXCEPTION_RENAME_CONFLICT_ENTRY_59=Se produjo una excepci\u00f3n al intentar cambiar el nombre de una entrada contradictoria. DN: %s, Operaci\u00f3n: %s, Stacktrace: %s
 ERR_REPLICATION_COULD_NOT_CONNECT_61=La repetici\u00f3n est\u00e1 configurada para el sufijo %s, pero no pudo conectarse con ning\u00fan Servidor de repetici\u00f3n
 ERR_CHANGELOG_ERROR_SENDING_ERROR_65=Se ha producido un error inesperado al enviar un mensaje de error a %s. Esta conexi\u00f3n se cerrar\u00e1 y volver\u00e1 a abrirse
 ERR_CHANGELOG_ERROR_SENDING_MSG_66=Se ha producido un error inesperado al enviar un mensaje a %s. Esta conexi\u00f3n se cerrar\u00e1 y volver\u00e1 a abrirse
diff --git a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_fr.properties b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_fr.properties
index fe36cdf..e91bb3e 100644
--- a/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_fr.properties
+++ b/opendj-sdk/opendj3-server-dev/src/messages/messages/replication_fr.properties
@@ -88,7 +88,6 @@
 ERR_BAD_HISTORICAL_56=L'entr\u00e9e %s contenait des informations historiques inconnues, ce qui peut provoquer des incoh\u00e9rences pour cette entr\u00e9e
 ERR_CANNOT_ADD_CONFLICT_ATTRIBUTE_57=Un conflit a \u00e9t\u00e9 d\u00e9tect\u00e9 mais des informations sur ce conflit n'ont pas pu \u00eatre ajout\u00e9es. Op\u00e9ration\u00a0: %s, R\u00e9sultat\u00a0: %s
 ERR_CANNOT_RENAME_CONFLICT_ENTRY_58=Une erreur s'est produite lors de la tentative de renommage d'une entr\u00e9e conflictuelle. DN\u00a0: %s, Op\u00e9ration\u00a0: %s, R\u00e9sultat\u00a0: %s
-ERR_EXCEPTION_RENAME_CONFLICT_ENTRY_59=Une exception s'est produite lors de la tentative de renommage d'une entr\u00e9e conflictuelle. DN\u00a0: %s, Op\u00e9ration\u00a0: %s, Stacktrace\u00a0: %s
 ERR_REPLICATION_COULD_NOT_CONNECT_61=La r\u00e9plication est configur\u00e9e pour le suffixe %s mais n'a pu se connecter \u00e0 aucun serveur de r\u00e9plication
 ERR_CHANGELOG_ERROR_SENDING_ERROR_65=Une erreur inattendue s'est produite lors de l'envoi d'un message d'erreur \u00e0 %s. Cette connexion va \u00eatre ferm\u00e9e, puis rouverte
 ERR_CHANGELOG_ERROR_SENDING_MSG_66=Une erreur inattendue s'est produite lors de l'envoi d'un message \u00e0 %s. Cette connexion va \u00eatre ferm\u00e9e, puis rouverte
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/admin/AdministrationDataSync.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/admin/AdministrationDataSync.java
index b70a0a0..67328d7 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/admin/AdministrationDataSync.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/admin/AdministrationDataSync.java
@@ -46,6 +46,8 @@
 import org.opends.server.types.Modification;
 import org.opends.server.types.SearchResultEntry;
 
+import static org.opends.server.protocols.internal.Requests.*;
+
 /**
  * Check if information found in "cn=admin data" is coherent with
  * cn=config. If and inconsistency is detected, we log a warning
@@ -191,9 +193,8 @@
     // Look for a local server with the Ldap Port.
     try
     {
-      InternalSearchOperation op = internalConnection.processSearch(
-          "cn=Servers,cn=admin data",
-          SearchScope.SINGLE_LEVEL, "objectclass=*");
+      SearchRequest request = newSearchRequest(DN.valueOf("cn=Servers,cn=admin data"), SearchScope.SINGLE_LEVEL);
+      InternalSearchOperation op = internalConnection.processSearch(request);
       if (op.getResultCode() == ResultCode.SUCCESS)
       {
         Entry entry = null;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/authorization/dseecompat/UserAttr.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/authorization/dseecompat/UserAttr.java
index de9cb49..ca94f85 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/authorization/dseecompat/UserAttr.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/authorization/dseecompat/UserAttr.java
@@ -35,11 +35,11 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.types.*;
 
 import static org.opends.messages.AccessControlMessages.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 
 /*
  * TODO Evaluate making this class more efficient.
@@ -59,43 +59,42 @@
      * the "#" token.
      */
     private enum UserAttrType {
-        USERDN, GROUPDN, ROLEDN, URL, VALUE
-    }
+        USERDN, GROUPDN, ROLEDN, URL, VALUE;
 
-    /** Filter used internal search. */
-    private static SearchFilter filter;
+        private static UserAttrType getType(String expr) throws AciException {
+            if("userdn".equalsIgnoreCase(expr)) {
+                return UserAttrType.USERDN;
+            } else if("groupdn".equalsIgnoreCase(expr)) {
+                 return UserAttrType.GROUPDN;
+            } else if("roledn".equalsIgnoreCase(expr)) {
+                return UserAttrType.ROLEDN;
+            } else if("ldapurl".equalsIgnoreCase(expr)) {
+                return UserAttrType.URL;
+            }
+            return UserAttrType.VALUE;
+        }
+    }
 
     /**
      * Used to create an attribute type that can compare the value below in
      * an entry returned from an internal search.
      */
-    private  String attrStr=null;
+    private String attrStr;
 
     /**
      * Used to compare a attribute value returned from a search against this
      * value which might have been defined in the ACI userattr rule.
      */
-    private  String attrVal=null;
+    private String attrVal;
 
     /** Contains the type of the userattr, one of the above enumerations. */
-    private UserAttrType userAttrType=null;
+    private UserAttrType userAttrType;
 
     /** An enumeration representing the bind rule type. */
-    private EnumBindRuleType type=null;
+    private EnumBindRuleType type;
 
     /** The class used to hold the parent inheritance information. */
-    private ParentInheritance parentInheritance=null;
-
-    static {
-        /*
-         * Set up the filter used to search private and public contexts.
-         */
-        try {
-            filter=SearchFilter.createFilterFromString("(objectclass=*)");
-        } catch (DirectoryException ex) {
-            //TODO should never happen, error message?
-        }
-    }
+    private ParentInheritance parentInheritance;
 
     /**
      * Create an non-USERDN/GROUPDN instance of the userattr keyword class.
@@ -145,7 +144,7 @@
                 WARN_ACI_SYNTAX_INVALID_USERATTR_EXPRESSION.get(expression);
             throw new AciException(message);
         }
-        UserAttrType userAttrType=getType(vals[1]);
+        UserAttrType userAttrType = UserAttrType.getType(vals[1]);
         switch (userAttrType) {
                 case GROUPDN:
                 case USERDN: {
@@ -156,9 +155,7 @@
                 case ROLEDN: {
                   //The roledn keyword is not supported. Throw an exception with
                   //a message if it is seen in the expression.
-                  LocalizableMessage message =
-                      WARN_ACI_SYNTAX_ROLEDN_NOT_SUPPORTED.get(expression);
-                  throw new AciException(message);
+                  throw new AciException(WARN_ACI_SYNTAX_ROLEDN_NOT_SUPPORTED.get(expression));
                 }
          }
          return new UserAttr(vals[0], vals[1], userAttrType, type);
@@ -205,9 +202,10 @@
         EnumEvalResult matched= EnumEvalResult.FALSE;
         boolean undefined=false;
         AttributeType attrType;
-        if((attrType = DirectoryServer.getAttributeType(attrStr)) == null)
+        if((attrType = DirectoryServer.getAttributeType(attrStr)) == null) {
             attrType = DirectoryServer.getDefaultAttributeType(attrStr);
-        final SearchRequest request = newSearchRequest(evalCtx.getClientDN(), SearchScope.BASE_OBJECT, filter);
+        }
+        final SearchRequest request = newSearchRequest(evalCtx.getClientDN(), SearchScope.BASE_OBJECT);
         InternalSearchOperation op = getRootConnection().processSearch(request);
         LinkedList<SearchResultEntry> result = op.getSearchEntries();
         if (!result.isEmpty()) {
@@ -225,41 +223,6 @@
     }
 
     /**
-     * Parses the substring after the '#' character to determine the userattr
-     * type.
-     * @param expr The string with the substring.
-     * @return An enumeration containing the type.
-     * @throws AciException If the substring contains an invalid type (roledn
-     * or groupdn).
-     */
-    private static UserAttrType getType(String expr) throws AciException {
-        UserAttrType userAttrType;
-        if(expr.equalsIgnoreCase("userdn"))
-            userAttrType=UserAttrType.USERDN;
-        else if(expr.equalsIgnoreCase("groupdn")) {
-             userAttrType=UserAttrType.GROUPDN;
-      /*
-            LocalizableMessage message = WARN_ACI_SYNTAX_INVALID_USERATTR_KEYWORD.get(
-                "The groupdn userattr" +
-                    "keyword is not supported.");
-            throw new AciException(message);
-        */
-        } else if(expr.equalsIgnoreCase("roledn")) {
-            userAttrType=UserAttrType.ROLEDN;
-            /*
-            LocalizableMessage message = WARN_ACI_SYNTAX_INVALID_USERATTR_KEYWORD.get(
-                "The roledn userattr" +
-                    "keyword is not supported.");
-            throw new AciException(message);
-            */
-        } else if(expr.equalsIgnoreCase("ldapurl"))
-            userAttrType=UserAttrType.URL;
-        else
-            userAttrType=UserAttrType.VALUE;
-        return userAttrType;
-    }
-
-    /**
      * Evaluate an URL userattr type. Look into the resource entry for the
      * specified attribute and values. Assume it is an URL. Decode it an try
      * and match it against the client entry attribute.
@@ -270,8 +233,9 @@
         EnumEvalResult matched= EnumEvalResult.FALSE;
         boolean undefined=false;
         AttributeType attrType;
-        if((attrType = DirectoryServer.getAttributeType(attrStr)) == null)
+        if((attrType = DirectoryServer.getAttributeType(attrStr)) == null) {
             attrType = DirectoryServer.getDefaultAttributeType(attrStr);
+        }
         List<Attribute> attrs=evalCtx.getResourceEntry().getAttribute(attrType);
         if(!attrs.isEmpty()) {
             for(Attribute a : attrs) {
@@ -320,11 +284,12 @@
         AttributeType attrType=parentInheritance.getAttributeType();
         DN baseDN=parentInheritance.getBaseDN();
         if(baseDN != null) {
-            if (evalCtx.getResourceEntry().hasAttribute(attrType))
+            if (evalCtx.getResourceEntry().hasAttribute(attrType)) {
                 matched=GroupDN.evaluate(evalCtx.getResourceEntry(),
                         evalCtx,attrType, baseDN);
+            }
         } else {
-        for(int i=0;((i < numLevels) && !stop); i++ ) {
+        for(int i=0;(i < numLevels && !stop); i++ ) {
             //The ROLEDN keyword will always enter this statement. The others
             //might. For the add operation, the resource itself (level 0)
             //must never be allowed to give access.
@@ -335,14 +300,16 @@
                     matched =
                             evalEntryAttr(evalCtx.getResourceEntry(),
                                     evalCtx,attrType);
-                    if(matched.equals(EnumEvalResult.TRUE))
+                    if(matched.equals(EnumEvalResult.TRUE)) {
                         stop=true;
+                    }
                 }
             } else {
                 DN pDN = getDNParentLevel(levels[i], evalCtx.getResourceDN());
-                if(pDN == null)
+                if(pDN == null) {
                     continue;
-                final SearchRequest request = newSearchRequest(pDN, SearchScope.BASE_OBJECT, filter)
+                }
+                final SearchRequest request = newSearchRequest(pDN, SearchScope.BASE_OBJECT)
                     .addAttribute(parentInheritance.getAttrTypeStr());
                 InternalSearchOperation op = getRootConnection().processSearch(request);
                 LinkedList<SearchResultEntry> result = op.getSearchEntries();
@@ -350,8 +317,9 @@
                     Entry e = result.getFirst();
                     if(e.hasAttribute(attrType)) {
                         matched = evalEntryAttr(e, evalCtx, attrType);
-                        if(matched.equals(EnumEvalResult.TRUE))
+                        if(matched.equals(EnumEvalResult.TRUE)) {
                             stop=true;
+                        }
                     }
                 }
             }
@@ -370,8 +338,9 @@
      */
     private DN getDNParentLevel(int l, DN dn) {
         int rdns=dn.size();
-        if(l > rdns)
+        if(l > rdns) {
             return null;
+        }
         DN theDN=dn;
         for(int i=0; i < l;i++) {
             theDN=theDN.parent();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/config/JMXMBean.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/config/JMXMBean.java
index cb16e87..a2a709d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/config/JMXMBean.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/config/JMXMBean.java
@@ -69,7 +69,6 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InvokableMethod;
-import org.opends.server.types.LDAPException;
 
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.protocols.internal.Requests.*;
@@ -486,10 +485,10 @@
       if (clientConnection instanceof JmxClientConnection) {
         op = ((JmxClientConnection)clientConnection).processSearch(
             ByteString.valueOf(configEntryDN.toString()),
-                SearchScope.BASE_OBJECT, getTrueFilter());
+                SearchScope.BASE_OBJECT, LDAPFilter.objectClassPresent());
       }
       else if (clientConnection instanceof InternalClientConnection) {
-        SearchRequest request = newSearchRequest(configEntryDN, SearchScope.BASE_OBJECT, "(objectclass=*)");
+        SearchRequest request = newSearchRequest(configEntryDN, SearchScope.BASE_OBJECT);
         op = ((InternalClientConnection) clientConnection).processSearch(request);
       }
       // BUG : op may be null
@@ -516,20 +515,6 @@
     }
   }
 
-  private LDAPFilter getTrueFilter()
-  {
-    try
-    {
-      return LDAPFilter.decode("(objectclass=*)");
-    }
-    catch (LDAPException e)
-    {
-      // can never happen
-      logger.traceException(e);
-      return null;
-    }
-  }
-
   /**
    * Set the value of a specific attribute of the Dynamic MBean.  In this case,
    * it will always throw {@code InvalidAttributeValueException} because setting
@@ -578,18 +563,11 @@
     if (clientConnection instanceof JmxClientConnection) {
       op = ((JmxClientConnection)clientConnection).processSearch(
           ByteString.valueOf(configEntryDN.toString()),
-              SearchScope.BASE_OBJECT, getTrueFilter());
+              SearchScope.BASE_OBJECT, LDAPFilter.objectClassPresent());
     }
     else if (clientConnection instanceof InternalClientConnection) {
-      try
-      {
-        SearchRequest request = newSearchRequest(configEntryDN, SearchScope.BASE_OBJECT, "(objectclass=*)");
-        op = ((InternalClientConnection) clientConnection).processSearch(request);
-      }
-      catch (DirectoryException e)
-      {
-        logger.traceException(e);
-      }
+      SearchRequest request = newSearchRequest(configEntryDN, SearchScope.BASE_OBJECT);
+      op = ((InternalClientConnection) clientConnection).processSearch(request);
     }
 
     if (op == null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
index ad5ec2a..a5a4bfb 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
@@ -281,17 +281,7 @@
                    PasswordPolicyStateExtendedOperationHandlerCfg config)
          throws ConfigException, InitializationException
   {
-    // Construct the filter that will be used to retrieve user entries.
-    try
-    {
-      userFilter = SearchFilter.createFilterFromString("(objectClass=*)");
-    }
-    catch (Exception e)
-    {
-      // This should never happen.
-      logger.traceException(e);
-    }
-
+    userFilter = SearchFilter.objectClassPresent();
 
     // Construct the set of request attributes.
     requestAttributes = new LinkedHashSet<String>(2);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalClientConnection.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
index 16761c8..a16781e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
@@ -34,9 +34,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ResultCode;
-import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.ConnectionHandler;
 import org.opends.server.core.*;
@@ -1989,85 +1987,6 @@
                            modifyDNRecord.getNewSuperiorDN());
   }
 
-
-
-  /**
-   * Processes an internal search operation with the provided
-   * information.  It will not dereference any aliases, will not
-   * request a size or time limit, and will retrieve all user
-   * attributes.
-   *
-   * @param  rawBaseDN     The base DN for the search.
-   * @param  scope         The scope for the search.
-   * @param  filterString  The string representation of the filter for
-   *                       the search.
-   *
-   * @return  A reference to the internal search operation that was
-   *          processed and contains information about the result of
-   *          the processing as well as lists of the matching entries
-   *          and search references.
-   *
-   * @throws  DirectoryException  If the provided filter string cannot
-   *                              be decoded as a search filter.
-   */
-  public InternalSearchOperation processSearch(String rawBaseDN,
-                                      SearchScope scope,
-                                      String filterString)
-         throws DirectoryException
-  {
-    return processSearch(Requests.newSearchRequest(rawBaseDN, scope, filterString), null);
-  }
-
-
-
-  /**
-   * Processes an internal search operation with the provided
-   * information.
-   *
-   * @param  rawBaseDN       The base DN for the search.
-   * @param  scope           The scope for the search.
-   * @param  derefPolicy     The alias dereferencing policy for the
-   *                         search.
-   * @param  sizeLimit       The size limit for the search.
-   * @param  timeLimit       The time limit for the search.
-   * @param  typesOnly       The typesOnly flag for the search.
-   * @param  filter          The filter for the search.
-   * @param  attributes      The set of requested attributes for the
-   *                         search.
-   * @param  controls        The set of controls to include in the
-   *                         request.
-   * @param  searchListener  The internal search listener that should
-   *                         be used to handle the matching entries
-   *                         and references.
-   *
-   * @return  A reference to the internal search operation that was
-   *          processed and contains information about the result of
-   *          the processing.
-   */
-  public InternalSearchOperation
-              processSearch(ByteString rawBaseDN,
-                            SearchScope scope,
-                            DereferenceAliasesPolicy derefPolicy,
-                            int sizeLimit, int timeLimit,
-                            boolean typesOnly, RawFilter filter,
-                            Set<String> attributes,
-                            List<Control> controls,
-                            InternalSearchListener searchListener)
-  {
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(this, nextOperationID(),
-                                     nextMessageID(), controls,
-                                     rawBaseDN, scope, derefPolicy,
-                                     sizeLimit, timeLimit,
-                                     typesOnly, filter, attributes,
-                                     searchListener);
-
-    searchOperation.run();
-    return searchOperation;
-  }
-
-
-
   /**
    * Processes an internal search operation with the provided
    * information.
@@ -2098,6 +2017,10 @@
    */
   public InternalSearchOperation processSearch(final SearchRequest request, InternalSearchListener searchListener)
   {
+    // FIXME uncomment this after we move to the SDK:
+    // if (Filter.objectClassPresent().equals(filter)) {
+    // filter = Filter.alwaysTrue();
+    // }
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(this, nextOperationID(), nextMessageID(),
              request.getControls(), request.getName(), request.getScope(),
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/Requests.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/Requests.java
index f7e3c3e..c7fe01d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/Requests.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/Requests.java
@@ -163,6 +163,20 @@
         return newSearchRequest(name, scope, SearchFilter.createFilterFromString(filter));
     }
 
+    /**
+     * Return a new search request object.
+     *
+     * @param name
+     *          the dn
+     * @param scope
+     *          the search scope
+     * @return a new search request object
+     * @see #newSearchRequest(DN, SearchScope, SearchFilter, String...)
+     */
+    public static SearchRequest newSearchRequest(final DN name, final SearchScope scope) {
+        return newSearchRequest(name, scope, SearchFilter.objectClassPresent());
+    }
+
     private Requests() {
         // Prevent instantiation.
     }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPFilter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPFilter.java
index 350916e..0e17491 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPFilter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPFilter.java
@@ -27,11 +27,11 @@
 package org.opends.server.protocols.ldap;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.StringTokenizer;
-import java.util.Collection;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -57,6 +57,8 @@
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
+  private static LDAPFilter objectClassPresent;
+
   // The set of subAny elements for substring filters.
   private ArrayList<ByteString> subAnyElements;
 
@@ -2076,5 +2078,25 @@
         break;
     }
   }
-}
 
+  /**
+   * Returns the {@code objectClass} presence filter {@code (objectClass=*)}.
+   *
+   * @return The {@code objectClass} presence filter {@code (objectClass=*)}.
+   */
+  public static LDAPFilter objectClassPresent()
+  {
+    if (objectClassPresent == null)
+    {
+      try
+      {
+        objectClassPresent = LDAPFilter.decode("(objectclass=*)");
+      }
+      catch (LDAPException canNeverHappen)
+      {
+        logger.traceException(canNeverHappen);
+      }
+    }
+    return objectClassPresent;
+  }
+}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index 6e6fa72..ce77320 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -44,7 +44,6 @@
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
@@ -83,6 +82,9 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
+import org.opends.server.types.ObjectClass;
+import org.opends.server.types.Operation;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.operation.*;
 import org.opends.server.util.LDIFReader;
@@ -650,19 +652,10 @@
               + "entry " + getBaseDNString());
     }
 
-    InternalSearchOperation search;
-    try
-    {
-      // Search the domain root entry that is used to save the generation id
-      SearchRequest request = newSearchRequest(getBaseDN(), SearchScope.BASE_OBJECT, "(objectclass=*)")
-          .addAttribute(REPLICATION_GENERATION_ID, REPLICATION_FRACTIONAL_EXCLUDE, REPLICATION_FRACTIONAL_INCLUDE);
-      search = conn.processSearch(request);
-    }
-    catch (DirectoryException e)
-    {
-      // Can not happen
-      return false;
-    }
+    // Search the domain root entry that is used to save the generation id
+    SearchRequest request = newSearchRequest(getBaseDN(), SearchScope.BASE_OBJECT)
+        .addAttribute(REPLICATION_GENERATION_ID, REPLICATION_FRACTIONAL_EXCLUDE, REPLICATION_FRACTIONAL_INCLUDE);
+    InternalSearchOperation search = conn.processSearch(request);
 
     if (search.getResultCode() != ResultCode.SUCCESS
         && search.getResultCode() != ResultCode.NO_SUCH_OBJECT)
@@ -2153,15 +2146,22 @@
        return;
      }
 
-    LDAPFilter filter = LDAPFilter.createEqualityFilter(DS_SYNC_CONFLICT,
-        ByteString.valueOf(freedDN.toString()));
+    SearchFilter filter;
+    try
+    {
+      filter = LDAPFilter.createEqualityFilter(DS_SYNC_CONFLICT,
+          ByteString.valueOf(freedDN.toString())).toSearchFilter();
+    }
+    catch (DirectoryException e)
+    {
+      // can not happen?
+      logger.traceException(e);
+      return;
+    }
 
-     InternalSearchOperation searchOp =  conn.processSearch(
-       ByteString.valueOf(getBaseDNString()),
-       SearchScope.WHOLE_SUBTREE,
-       DereferenceAliasesPolicy.NEVER,
-       0, 0, false, filter,
-       USER_AND_REPL_OPERATIONAL_ATTRS, null, null);
+    SearchRequest request = newSearchRequest(getBaseDN(), SearchScope.WHOLE_SUBTREE, filter)
+        .addAttribute(USER_AND_REPL_OPERATIONAL_ATTRS);
+    InternalSearchOperation searchOp =  conn.processSearch(request);
 
      Entry entryToRename = null;
      CSN entryToRenameCSN = null;
@@ -2549,20 +2549,13 @@
     {
       return null;
     }
-    try
+    final SearchRequest request = newSearchRequest(dn, SearchScope.BASE_OBJECT)
+        .addAttribute(ENTRYUUID_ATTRIBUTE_NAME);
+    final InternalSearchOperation search = getRootConnection().processSearch(request);
+    final SearchResultEntry resultEntry = getFirstResult(search);
+    if (resultEntry != null)
     {
-      final SearchRequest request = newSearchRequest(dn, SearchScope.BASE_OBJECT, "(objectclass=*)")
-          .addAttribute(ENTRYUUID_ATTRIBUTE_NAME);
-      final InternalSearchOperation search = getRootConnection().processSearch(request);
-      final SearchResultEntry resultEntry = getFirstResult(search);
-      if (resultEntry != null)
-      {
-        return getEntryUUID(resultEntry);
-      }
-    }
-    catch (DirectoryException e)
-    {
-      // never happens because the filter is always valid.
+      return getEntryUUID(resultEntry);
     }
     return null;
   }
@@ -2994,37 +2987,27 @@
      */
     boolean conflict = false;
 
-    // Find an rename child entries.
-    try
+    // Find and rename child entries.
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.SINGLE_LEVEL)
+        .addAttribute(ENTRYUUID_ATTRIBUTE_NAME, HISTORICAL_ATTRIBUTE_NAME);
+    InternalSearchOperation op = conn.processSearch(request);
+    if (op.getResultCode() == ResultCode.SUCCESS)
     {
-      final SearchRequest request = newSearchRequest(entryDN, SearchScope.SINGLE_LEVEL, "(objectClass=*)")
-          .addAttribute(ENTRYUUID_ATTRIBUTE_NAME, HISTORICAL_ATTRIBUTE_NAME);
-      InternalSearchOperation op = conn.processSearch(request);
-      if (op.getResultCode() == ResultCode.SUCCESS)
+      for (SearchResultEntry entry : op.getSearchEntries())
       {
-        for (SearchResultEntry entry : op.getSearchEntries())
-        {
-          /*
-           * Check the ADD and ModRDN date of the child entry
-           * (All of them, not only the one that are newer than the DEL op)
-           * and keep the entry as a conflicting entry.
-           */
-          conflict = true;
-          renameConflictEntry(conflictOp, entry.getName(), getEntryUUID(entry));
-        }
-      }
-      else
-      {
-        // log error and information for the REPAIR tool.
-        logger.error(ERR_CANNOT_RENAME_CONFLICT_ENTRY,
-            entryDN, conflictOp, op.getResultCode());
+        /*
+         * Check the ADD and ModRDN date of the child entry
+         * (All of them, not only the one that are newer than the DEL op)
+         * and keep the entry as a conflicting entry.
+         */
+        conflict = true;
+        renameConflictEntry(conflictOp, entry.getName(), getEntryUUID(entry));
       }
     }
-    catch (DirectoryException e)
+    else
     {
       // log error and information for the REPAIR tool.
-      logger.error(ERR_EXCEPTION_RENAME_CONFLICT_ENTRY,
-          entryDN, conflictOp, stackTraceToSingleLineString(e));
+      logger.error(ERR_CANNOT_RENAME_CONFLICT_ENTRY, entryDN, conflictOp, op.getResultCode());
     }
 
     return conflict;
@@ -3318,7 +3301,7 @@
      * Search the database entry that is used to periodically
      * save the generation id
      */
-    final SearchRequest request = newSearchRequest(getBaseDN(), SearchScope.BASE_OBJECT, "(objectclass=*)")
+    final SearchRequest request = newSearchRequest(getBaseDN(), SearchScope.BASE_OBJECT)
         .addAttribute(REPLICATION_GENERATION_ID);
     InternalSearchOperation search = conn.processSearch(request);
     if (search.getResultCode() == ResultCode.NO_SUCH_OBJECT)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java
index 16e0ae6..7ce0805 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -549,8 +549,7 @@
     {
       Set<DN> baseDNs = Collections.singleton(DN.valueOf(""));
       Set<DN> groupDNs = Collections.emptySet();
-      Set<SearchFilter> filters = Collections.singleton(
-          SearchFilter.createFilterFromString("(objectclass=*)"));
+      Set<SearchFilter> filters = Collections.singleton(SearchFilter.objectClassPresent());
 
       // To avoid the configuration in cn=config just
       // create a rule and register it into the DirectoryServer
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/LDAPURL.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/LDAPURL.java
index 3e71a63..bad19ef 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/LDAPURL.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/LDAPURL.java
@@ -198,13 +198,13 @@
       this.scope = scope;
     }
 
-    if (rawFilter == null)
+    if (rawFilter != null)
     {
-      this.rawFilter = "(objectClass=*)";
+      this.rawFilter = rawFilter;
     }
     else
     {
-      this.rawFilter = rawFilter;
+      setFilter(SearchFilter.objectClassPresent());
     }
 
     if (extensions == null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/SearchFilter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/SearchFilter.java
index 20b1277..64bc99e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/SearchFilter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/SearchFilter.java
@@ -28,13 +28,13 @@
 package org.opends.server.types;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import java.util.LinkedHashSet;
-import java.util.Collection;
-import java.util.Collections;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -64,6 +64,8 @@
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
+  private static SearchFilter objectClassPresent;
+
   // The attribute type for this filter.
   private final AttributeType attributeType;
 
@@ -4092,5 +4094,25 @@
       }
     }
   }
-}
 
+  /**
+   * Returns the {@code objectClass} presence filter {@code (objectClass=*)}.
+   *
+   * @return The {@code objectClass} presence filter {@code (objectClass=*)}.
+   */
+  public static SearchFilter objectClassPresent()
+  {
+    if (objectClassPresent == null)
+    {
+      try
+      {
+        objectClassPresent = SearchFilter.createFilterFromString("(objectclass=*)");
+      }
+      catch (DirectoryException canNeverHappen)
+      {
+        logger.traceException(canNeverHappen);
+      }
+    }
+    return objectClassPresent;
+  }
+}
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/ChangelogBackendTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/ChangelogBackendTestCase.java
index 975e023..ca9c71f 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/ChangelogBackendTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/ChangelogBackendTestCase.java
@@ -598,9 +598,10 @@
   public void searchingWithoutPrivilegeShouldFail() throws Exception
   {
     AuthenticationInfo nonPrivilegedUser = new AuthenticationInfo();
-
     InternalClientConnection conn = new InternalClientConnection(nonPrivilegedUser);
-    InternalSearchOperation op = conn.processSearch("cn=changelog", SearchScope.WHOLE_SUBTREE, "(objectclass=*)");
+
+    SearchRequest request = Requests.newSearchRequest(DN.valueOf("cn=changelog"), SearchScope.WHOLE_SUBTREE);
+    InternalSearchOperation op = conn.processSearch(request);
 
     assertEquals(op.getResultCode(), ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
     assertEquals(op.getErrorMessage().toMessage(), NOTE_SEARCH_CHANGELOG_INSUFFICIENT_PRIVILEGES.get());
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/LDIFBackendTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/LDIFBackendTestCase.java
index 52cb22e..4b5edd5 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/LDIFBackendTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/LDIFBackendTestCase.java
@@ -43,6 +43,7 @@
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.tasks.LdifFileWriter;
 import org.opends.server.tasks.TasksTestCase;
 import org.opends.server.tools.LDAPModify;
@@ -54,6 +55,7 @@
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -527,8 +529,8 @@
   @Test
   public void testBaseSearch() throws Exception
   {
-    InternalSearchOperation searchOperation =
-        getRootConnection().processSearch("o=ldif", SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.valueOf("o=ldif"), SearchScope.BASE_OBJECT);
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
   }
@@ -545,7 +547,7 @@
   public void testBaseSearchNonMatchingFilter() throws Exception
   {
     InternalSearchOperation searchOperation =
-        getRootConnection().processSearch("o=ldif", SearchScope.BASE_OBJECT, "(o=not ldif)");
+        getRootConnection().processSearch(newSearchRequest("o=ldif", SearchScope.BASE_OBJECT, "(o=not ldif)"));
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 0);
   }
@@ -561,10 +563,9 @@
   @Test
   public void testBaseSearchNoSuchEntry() throws Exception
   {
-    InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch("o=nonexistent2,o=nonexistent1,o=ldif",
-                            SearchScope.BASE_OBJECT, "(objectClass=*)");
+    DN dn = DN.valueOf("o=nonexistent2,o=nonexistent1,o=ldif");
+    SearchRequest request = newSearchRequest(dn, SearchScope.BASE_OBJECT);
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.NO_SUCH_OBJECT);
     assertEquals(searchOperation.getMatchedDN(), DN.valueOf("o=ldif"));
   }
@@ -577,13 +578,10 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @Test
-  public void testSingleLevelSearch()
-         throws Exception
+  public void testSingleLevelSearch() throws Exception
   {
-    InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch("o=ldif", SearchScope.SINGLE_LEVEL,
-                         "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.valueOf("o=ldif"), SearchScope.SINGLE_LEVEL);
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
   }
@@ -598,10 +596,8 @@
   @Test
   public void testSubtreeSearch() throws Exception
   {
-    InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch("o=ldif", SearchScope.WHOLE_SUBTREE,
-                            "(uid=user.1)");
+    SearchRequest request = newSearchRequest("o=ldif", SearchScope.WHOLE_SUBTREE, "(uid=user.1)");
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
   }
@@ -617,10 +613,8 @@
   @Test
   public void testSubordinateSubtreeSearch() throws Exception
   {
-    InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch("o=ldif", SearchScope.SUBORDINATES,
-                            "(uid=user.1)");
+    SearchRequest request = newSearchRequest("o=ldif", SearchScope.SUBORDINATES, "(uid=user.1)");
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
   }
@@ -633,8 +627,7 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @Test
-  public void testHasSubordinates()
-         throws Exception
+  public void testHasSubordinates() throws Exception
   {
     Backend<?> b = DirectoryServer.getBackend("ldifRoot");
     assertNotNull(b);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
index 07954cc..bebd446 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
@@ -382,8 +382,7 @@
   {
     InternalClientConnection conn = getRootConnection();
     DN baseDN = DN.valueOf("o=bogus,cn=schema");
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    SearchFilter filter = SearchFilter.objectClassPresent();
 
     for (SearchScope scope : SearchScope.values())
     {
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
index 2df659f..376aef7 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -42,7 +42,6 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.types.*;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.Attributes;
@@ -64,6 +63,7 @@
 import static org.forgerock.opendj.ldap.ModificationType.*;
 import static org.mockito.Mockito.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.types.Attributes.*;
 import static org.testng.Assert.*;
 
@@ -578,33 +578,34 @@
   public void testSearchScope() throws Exception {
     InternalClientConnection conn = getRootConnection();
 
-    InternalSearchOperation search = conn.processSearch("dc=test,dc=com", SearchScope.BASE_OBJECT, "(objectClass=*)");
+    DN dn = DN.valueOf("dc=test,dc=com");
+    InternalSearchOperation search = conn.processSearch(newSearchRequest(dn, SearchScope.BASE_OBJECT));
     List<SearchResultEntry> result = search.getSearchEntries();
 
     assertEquals(result.size(), 1);
-    assertEquals(result.get(0).getName().toString(), "dc=test,dc=com");
+    assertEquals(result.get(0).getName(), dn);
 
-    search = conn.processSearch("dc=test,dc=com", SearchScope.BASE_OBJECT, "(ou=People)");
+    search = conn.processSearch(newSearchRequest(dn, SearchScope.BASE_OBJECT, "(ou=People)"));
     result = search.getSearchEntries();
 
     assertEquals(result.size(), 0);
 
-    search = conn.processSearch("dc=test,dc=com", SearchScope.SINGLE_LEVEL, "(objectClass=*)");
+    search = conn.processSearch(newSearchRequest(dn, SearchScope.SINGLE_LEVEL));
     result = search.getSearchEntries();
 
     assertEquals(result.size(), 1);
     assertEquals(result.get(0).getName().toString(),
         "ou=People,dc=test,dc=com");
 
-    search = conn.processSearch("dc=test,dc=com", SearchScope.SUBORDINATES, "(objectClass=*)");
+    search = conn.processSearch(newSearchRequest(dn, SearchScope.SUBORDINATES));
     result = search.getSearchEntries();
 
     assertEquals(result.size(), 13);
     for (Entry entry : result) {
-      assertThat(entry.getName().toString()).isNotEqualTo("dc=test,dc=com");
+      assertThat(entry.getName()).isNotEqualTo(dn);
     }
 
-    search = conn.processSearch("dc=test,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=*)");
+    search = conn.processSearch(newSearchRequest(dn, SearchScope.WHOLE_SUBTREE));
     result = search.getSearchEntries();
 
     assertEquals(result.size(), 14);
@@ -1486,7 +1487,7 @@
     ) throws Exception
   {
     InternalClientConnection conn = getRootConnection();
-    SearchFilter filter = SearchFilter.createFilterFromString("(objectClass=*)");
+    SearchFilter filter = SearchFilter.objectClassPresent();
 
     // Test is performed with each and every scope
     for (SearchScope scope: SearchScope.values())
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVLVIndex.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVLVIndex.java
index 03d3ae0..6edc458 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVLVIndex.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVLVIndex.java
@@ -27,11 +27,11 @@
 package org.opends.server.backends.jeb;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.TreeSet;
 
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.DirectoryServerTestCase;
@@ -42,15 +42,19 @@
 import org.opends.server.controls.VLVRequestControl;
 import org.opends.server.controls.VLVResponseControl;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.Requests;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.*;
+import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import static org.assertj.core.api.Assertions.*;
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -362,40 +366,15 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetOneOffset()
-      throws Exception
+  public void testInternalSearchByOffsetOneOffset() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, 1, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, 1, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
-    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, bigger
-    expectedDNOrder.add(albertSmithDN);     // Albert, smaller sn
-
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder());
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -407,29 +386,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -442,6 +407,25 @@
     assertEquals(vlvResponse.getContentCount(), 10);
   }
 
+  private ArrayList<DN> getDNs(InternalSearchOperation internalSearch)
+  {
+    ArrayList<DN> results = new ArrayList<DN>();
+    for (Entry e : internalSearch.getSearchEntries())
+    {
+      results.add(e.getName());
+    }
+    return results;
+  }
+
+  private List<DN> expectedDNOrder()
+  {
+    return Arrays.asList(
+        aaccfJohnsonDN,    // Aaccf
+        aaronZimmermanDN,  // Aaron
+        albertZimmermanDN, // Albert, bigger
+        albertSmithDN);    // Albert, smaller sn
+  }
+
   /**
    * Tests performing an internal search using the VLV control to retrieve a
    * subset of the entries using an offset of zero, which should be treated like
@@ -450,40 +434,15 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetZeroOffset()
-      throws Exception
+  public void testInternalSearchByOffsetZeroOffset() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, 0, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, 0, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
-    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, bigger
-    expectedDNOrder.add(albertSmithDN);     // Albert, smaller sn
-
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder());
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -495,29 +454,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -538,25 +483,12 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetThreeOffset()
-      throws Exception
+  public void testInternalSearchByOffsetThreeOffset() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, 3, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, 3, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
     ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
@@ -565,13 +497,7 @@
     expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
     expectedDNOrder.add(margaretJonesDN);   // Maggie
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -583,29 +509,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -625,25 +537,12 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetNegativeOffset()
-      throws Exception
+  public void testInternalSearchByOffsetNegativeOffset() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, -1, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, -1, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
 
     // It will be successful because it's not a critical control.
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
@@ -656,14 +555,7 @@
     {
       if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
     }
 
@@ -679,25 +571,12 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetNegativeStartPosition()
-      throws Exception
+  public void testInternalSearchByOffsetNegativeStartPosition() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(3, 3, 1, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(3, 3, 1, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
 
     // It will be successful because it's not a critical control.
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
@@ -710,14 +589,7 @@
     {
       if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
     }
 
@@ -732,25 +604,12 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetStartPositionTooHigh()
-      throws Exception
+  public void testInternalSearchByOffsetStartPositionTooHigh() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(3, 3, 30, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(3, 3, 30, 0));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
 
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
@@ -759,13 +618,7 @@
     expectedDNOrder.add(zorroDN);           // No first name
     expectedDNOrder.add(suffixDN);          // No sort attributes
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -775,14 +628,7 @@
     {
       if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
     }
 
@@ -800,25 +646,13 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByOffsetIncompleteAfterCount()
-      throws Exception
+  public void testInternalSearchByOffsetIncompleteAfterCount() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 4, 7, 0));
 
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 4, 7, 0));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
     ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
@@ -827,13 +661,7 @@
     expectedDNOrder.add(zorroDN);           // No first name
     expectedDNOrder.add(suffixDN);          // No sort attributes
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -845,29 +673,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -880,6 +694,24 @@
     assertEquals(vlvResponse.getContentCount(), 10);
   }
 
+  private VLVResponseControl asVLVResponseControl(Control c) throws DirectoryException
+  {
+    if(c instanceof LDAPControl)
+    {
+      return VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl) c).getValue());
+    }
+    return (VLVResponseControl) c;
+  }
+
+  private ServerSideSortResponseControl asServerSideSortResponseControl(Control c) throws DirectoryException
+  {
+    if(c instanceof LDAPControl)
+    {
+      return ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl) c).getValue());
+    }
+    return (ServerSideSortResponseControl) c;
+  }
+
   /**
    * Tests performing an internal search using the VLV control to retrieve a
    * subset of the entries using an assertion value before any actual value in
@@ -888,40 +720,16 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByValueBeforeAll()
-      throws Exception
+  public void testInternalSearchByValueBeforeAll() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, ByteString.valueOf("a")));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
 
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, ByteString.valueOf("a")));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
-    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder());
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -933,29 +741,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -976,41 +770,16 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByValueMatchesFirst()
-      throws Exception
+  public void testInternalSearchByValueMatchesFirst() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, ByteString.valueOf("aaccf")));
 
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3,
-                                              ByteString.valueOf("aaccf")));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
-    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder());
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -1022,29 +791,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -1065,26 +820,13 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByValueMatchesThird()
-      throws Exception
+  public void testInternalSearchByValueMatchesThird() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, ByteString.valueOf("albert")));
 
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3,
-                                              ByteString.valueOf("albert")));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
     ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
@@ -1093,13 +835,7 @@
     expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
     expectedDNOrder.add(margaretJonesDN);   // Maggie
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -1111,29 +847,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -1154,26 +876,13 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByValueMatchesThirdWithBeforeCount()
-      throws Exception
+  public void testInternalSearchByValueMatchesThirdWithBeforeCount() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(1, 3, ByteString.valueOf("albert")));
 
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(1, 3,
-                                              ByteString.valueOf("albert")));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
     ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
@@ -1183,13 +892,7 @@
     expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
     expectedDNOrder.add(margaretJonesDN);   // Maggie
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -1201,29 +904,15 @@
     {
       if (c.getOID().equals(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          sortResponse = ServerSideSortResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          sortResponse = (ServerSideSortResponseControl)c;
-        }
+        sortResponse = asServerSideSortResponseControl(c);
       }
       else if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
       else
       {
-        fail("Response control with unexpected OID " + c.getOID());
+        Assert.fail("Response control with unexpected OID " + c.getOID());
       }
     }
 
@@ -1244,25 +933,12 @@
    * @throws  Exception  If an unexpected problem occurred.
    */
   @Test( dependsOnMethods = { "testAdd" } )
-  public void testInternalSearchByValueAfterAll()
-      throws Exception
+  public void testInternalSearchByValueAfterAll() throws Exception
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-
-    ArrayList<Control> requestControls = new ArrayList<Control>();
-    requestControls.add(new ServerSideSortRequestControl(sortOrder));
-    requestControls.add(new VLVRequestControl(0, 3, ByteString.valueOf("zz")));
-
-    InternalSearchOperation internalSearch =
-        new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                    InternalClientConnection.nextMessageID(), requestControls,
-                                    DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE,
-                                    DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                                    SearchFilter.createFilterFromString("(objectClass=*)"),
-                                    null, null);
-
-    internalSearch.run();
+    final SearchRequest request = Requests.newSearchRequest(DN.valueOf("dc=vlvtest,dc=com"), SearchScope.WHOLE_SUBTREE)
+        .addControl(new ServerSideSortRequestControl(sortOrder))
+        .addControl(new VLVRequestControl(0, 3, ByteString.valueOf("zz")));
+    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
 
     // It will be successful because the control isn't critical.
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
@@ -1272,13 +948,7 @@
     expectedDNOrder.add(zorroDN);           // No first name
     expectedDNOrder.add(suffixDN);          // No sort attributes
 
-    ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
-    for (Entry e : internalSearch.getSearchEntries())
-    {
-      returnedDNOrder.add(e.getName());
-    }
-
-    assertEquals(returnedDNOrder, expectedDNOrder);
+    assertThat(getDNs(internalSearch)).isEqualTo(expectedDNOrder);
 
     List<Control> responseControls = internalSearch.getResponseControls();
     assertNotNull(responseControls);
@@ -1288,14 +958,7 @@
     {
       if (c.getOID().equals(OID_VLV_RESPONSE_CONTROL))
       {
-        if(c instanceof LDAPControl)
-        {
-          vlvResponse = VLVResponseControl.DECODER.decode(c.isCritical(), ((LDAPControl)c).getValue());
-        }
-        else
-        {
-          vlvResponse = (VLVResponseControl)c;
-        }
+        vlvResponse = asVLVResponseControl(c);
       }
     }
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordPolicyControlTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordPolicyControlTestCase.java
index f5cbbb4..f5abb42 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordPolicyControlTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordPolicyControlTestCase.java
@@ -1580,9 +1580,8 @@
       SearchRequestProtocolOp searchRequest =
            new SearchRequestProtocolOp(ByteString.valueOf("o=test"),
                                        SearchScope.BASE_OBJECT,
-                                       DereferenceAliasesPolicy.NEVER, 0,
-                                       0, false,
-                                       LDAPFilter.decode("(objectClass=*)"),
+                                       DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                       LDAPFilter.objectClassPresent(),
                                        new LinkedHashSet<String>());
 
       List<Control> controls = new ArrayList<Control>();
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
index 4400bc5..3d532bc 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
@@ -548,7 +548,7 @@
 
     //Create a persistent search request.
     Set<PersistentSearchChangeType> changeTypes = EnumSet.of(ADD, DELETE, MODIFY, MODIFY_DN);
-    SearchRequest request = newSearchRequest("o=test", SearchScope.BASE_OBJECT, "(objectClass=*)")
+    SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.BASE_OBJECT)
         .setTypesOnly(true)
         .addAttribute("cn")
         .addControl(new PersistentSearchControl(changeTypes, true, true));
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/BackendConfigManagerTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/BackendConfigManagerTestCase.java
index f82756b..4544b25 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/BackendConfigManagerTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/BackendConfigManagerTestCase.java
@@ -266,7 +266,7 @@
 
     InternalClientConnection conn = getRootConnection();
     // Make sure that both entries exist.
-    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE);
     InternalSearchOperation internalSearch = conn.processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
     assertEquals(internalSearch.getSearchEntries().size(), 2);
@@ -337,7 +337,7 @@
 
 
     // Verify that we can see both entries with a subtree search.
-    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE);
     InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
     assertEquals(internalSearch.getSearchEntries().size(), 2);
@@ -429,7 +429,7 @@
 
     InternalClientConnection conn = getRootConnection();
     // Verify that a subtree search can see all three entries.
-    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(parentBaseDN, SearchScope.WHOLE_SUBTREE);
     assertSearchResultsSize(request, 3);
 
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/GroupManagerTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/GroupManagerTestCase.java
index 303ef5d..3e42541 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/GroupManagerTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/GroupManagerTestCase.java
@@ -62,6 +62,7 @@
 import org.opends.server.types.SearchFilter;
 import org.forgerock.opendj.ldap.SearchScope;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -1415,12 +1416,10 @@
     // group operations correctly.
     InternalClientConnection conn0 = new InternalClientConnection(DN.rootDN());
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(conn0, InternalClientConnection.nextOperationID(),
-                  InternalClientConnection.nextMessageID(), null, DN.rootDN(),
-                  SearchScope.BASE_OBJECT,
+         new InternalSearchOperation(conn0, nextOperationID(), nextMessageID(), null, 
+                  DN.rootDN(), SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
-                  null);
+                  SearchFilter.objectClassPresent(), null, null);
 
     assertFalse(conn0.isMemberOf(group1, null));
     assertFalse(conn0.isMemberOf(group2, null));
@@ -1441,12 +1440,11 @@
     // group operations correctly.
     InternalClientConnection conn1 = new InternalClientConnection(user1DN);
     searchOperation =
-         new InternalSearchOperation(conn1, InternalClientConnection.nextOperationID(),
-                  InternalClientConnection.nextMessageID(), null, DN.rootDN(),
+         new InternalSearchOperation(conn1, nextOperationID(),
+                  nextMessageID(), null, DN.rootDN(),
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0,  false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
-                  null);
+                  SearchFilter.objectClassPresent(), null, null);
 
     assertTrue(conn1.isMemberOf(group1, null));
     assertFalse(conn1.isMemberOf(group2, null));
@@ -1471,12 +1469,11 @@
     // group operations correctly.
     InternalClientConnection conn2 = new InternalClientConnection(user2DN);
     searchOperation =
-         new InternalSearchOperation(conn2, InternalClientConnection.nextOperationID(),
-                  InternalClientConnection.nextMessageID(), null, DN.rootDN(),
+         new InternalSearchOperation(conn2, nextOperationID(),
+                  nextMessageID(), null, DN.rootDN(),
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0,  false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
-                  null);
+                  SearchFilter.objectClassPresent(), null, null);
 
     assertTrue(conn2.isMemberOf(group1, null));
     assertTrue(conn2.isMemberOf(group2, null));
@@ -1501,12 +1498,11 @@
     // group operations correctly.
     InternalClientConnection conn3 = new InternalClientConnection(user3DN);
     searchOperation =
-         new InternalSearchOperation(conn3, InternalClientConnection.nextOperationID(),
-                  InternalClientConnection.nextMessageID(), null, DN.rootDN(),
+         new InternalSearchOperation(conn3, nextOperationID(),
+                  nextMessageID(), null, DN.rootDN(),
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0,  false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
-                  null);
+                  SearchFilter.objectClassPresent(), null, null);
 
     assertFalse(conn3.isMemberOf(group1, null));
     assertTrue(conn3.isMemberOf(group2, null));
@@ -1639,10 +1635,8 @@
 
 
     // Perform a filtered iteration across the member DNs.
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-    memberList = groupInstance.getMembers(DN.valueOf("o=test"),
-                                          SearchScope.WHOLE_SUBTREE, filter);
+    memberList = groupInstance.getMembers(
+        DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE, SearchFilter.objectClassPresent());
     while (memberList.hasMoreMembers())
     {
       try
@@ -1668,9 +1662,8 @@
 
 
     // Perform a filtered iteration across the member entries.
-    filter = SearchFilter.createFilterFromString("(objectClass=*)");
-    memberList = groupInstance.getMembers(DN.valueOf("o=test"),
-                                          SearchScope.WHOLE_SUBTREE, filter);
+    memberList = groupInstance.getMembers(
+        DN.valueOf("o=test"), SearchScope.WHOLE_SUBTREE, SearchFilter.objectClassPresent());
     while (memberList.hasMoreMembers())
     {
       try
@@ -2261,9 +2254,8 @@
     memberSet.add(user1DN);
     memberSet.add(user2DN);
 
-    MemberList memberList =
-         groupInstance.getMembers(DN.rootDN(), SearchScope.WHOLE_SUBTREE,
-              SearchFilter.createFilterFromString("(objectClass=*)"));
+    MemberList memberList = groupInstance.getMembers(
+        DN.rootDN(), SearchScope.WHOLE_SUBTREE, SearchFilter.objectClassPresent());
     assertNotNull(memberList);
     while (memberList.hasMoreMembers())
     {
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
index e038963..37632e4 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
@@ -40,7 +40,6 @@
 import org.opends.server.controls.MatchedValuesFilter;
 import org.opends.server.controls.SubentriesControl;
 import org.opends.server.plugins.InvocationCounterPlugin;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.Requests;
 import org.opends.server.protocols.internal.SearchRequest;
@@ -175,14 +174,10 @@
   @Override
   protected Operation[] createTestOperations() throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     return new Operation[]
     {
-         new SearchOperationBasis(conn,
-                             InternalClientConnection.nextOperationID(),
-                             InternalClientConnection.nextMessageID(),
+         new SearchOperationBasis(
+                             getRootConnection(), nextOperationID(), nextMessageID(),
                              new ArrayList<Control>(),
                              ByteString.valueOf(BASE),
                              SearchScope.WHOLE_SUBTREE,
@@ -190,7 +185,7 @@
                              -1,
                              -1,
                              false,
-                             LDAPFilter.decode("(objectclass=*)"),
+                             LDAPFilter.objectClassPresent(),
                              null)
     };
   }
@@ -331,24 +326,7 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=*)"),
-              null, null);
-
+    InternalSearchOperation searchOperation = newInternalSearchOperation(LDAPFilter.objectClassPresent());
     searchOperation.run();
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getEntriesSent(), 4);
@@ -361,24 +339,8 @@
   @Test
   public void testSearchInternalUnspecifiedAttributes() throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              null, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"));
     Entry resultEntry = searchInternalForSingleEntry(searchOperation);
 
     assertEquals(resultEntry.getObjectClasses(), testEntry.getObjectClasses());
@@ -394,14 +356,9 @@
   public void testSearchInternalUnspecifiedAttributesOmitValues()
        throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf(BASE),
               SearchScope.WHOLE_SUBTREE,
@@ -424,26 +381,8 @@
   @Test
   public void testSearchInternalAllOperationalAttributes() throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    LinkedHashSet<String> attributes = new LinkedHashSet<String>();
-    attributes.add("+");
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              attributes, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"), "+");
     Entry resultEntry = searchInternalForSingleEntry(searchOperation);
 
     assertEquals(resultEntry.getObjectClasses().size(), 0);
@@ -455,27 +394,8 @@
   public void testSearchInternalAllUserAndOperationalAttributes()
        throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    LinkedHashSet<String> attributes = new LinkedHashSet<String>();
-    attributes.add("*");
-    attributes.add("+");
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              attributes, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"), "*", "+");
     Entry resultEntry = searchInternalForSingleEntry(searchOperation);
 
     assertEquals(resultEntry.getObjectClasses(), testEntry.getObjectClasses());
@@ -490,27 +410,8 @@
   public void testSearchInternalAllUserAttributesPlusSelectedOperational()
        throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    LinkedHashSet<String> attributes = new LinkedHashSet<String>();
-    attributes.add("*");
-    attributes.add("createtimestamp");
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              attributes, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"), "*", "createtimestamp");
     Entry resultEntry = searchInternalForSingleEntry(searchOperation);
 
     assertEquals(resultEntry.getObjectClasses(), testEntry.getObjectClasses());
@@ -526,27 +427,8 @@
   public void testSearchInternalSelectedAttributes()
        throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    LinkedHashSet<String> attributes = new LinkedHashSet<String>();
-    attributes.add("uid");
-    attributes.add("createtimestamp");
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              attributes, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"), "uid", "createtimestamp");
     Entry resultEntry = searchInternalForSingleEntry(searchOperation);
 
     assertEquals(resultEntry.getObjectClasses().size(), 0);
@@ -554,6 +436,17 @@
     assertEquals(resultEntry.getOperationalAttributes().size(), 1);
   }
 
+  private InternalSearchOperation newInternalSearchOperation(LDAPFilter filter, String... attributes)
+  {
+    return new InternalSearchOperation(
+        getRootConnection(), nextOperationID(), nextMessageID(),
+        new ArrayList<Control>(),
+        ByteString.valueOf(BASE),
+        SearchScope.WHOLE_SUBTREE,
+        DereferenceAliasesPolicy.NEVER, Integer.MAX_VALUE, Integer.MAX_VALUE, false,
+        filter, new LinkedHashSet<String>(Arrays.asList(attributes)), null);
+  }
+
   @Test
   public void testSearchExternalUnspecifiedAttributes() throws Exception
   {
@@ -828,24 +721,8 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=inetorgperson)"),
-              null, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=inetorgperson)"));
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
@@ -876,14 +753,8 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+    InternalSearchOperation searchOperation = new InternalSearchOperation(
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf(BASE),
               SearchScope.SINGLE_LEVEL,
@@ -914,24 +785,8 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=ldapsubentry)"),
-              null, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(objectclass=ldapsubentry)"));
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
@@ -944,14 +799,9 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               Collections.singletonList((Control)new SubentriesControl(true, true)),
               ByteString.valueOf(BASE),
               SearchScope.WHOLE_SUBTREE,
@@ -959,7 +809,7 @@
               Integer.MAX_VALUE,
               Integer.MAX_VALUE,
               false,
-              LDAPFilter.decode("(objectclass=*)"),
+              LDAPFilter.objectClassPresent(),
               null, null);
 
     searchOperation.run();
@@ -974,17 +824,13 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    InternalSearchOperation searchOperation = new InternalSearchOperation(conn,
-        InternalClientConnection.nextOperationID(),
-        InternalClientConnection.nextMessageID(),
+    InternalSearchOperation searchOperation = new InternalSearchOperation(
+        getRootConnection(), nextOperationID(), nextMessageID(),
         Collections.singletonList((Control) new LDAPControl(
             OID_LDUP_SUBENTRIES, true)), ByteString.valueOf(BASE),
         SearchScope.WHOLE_SUBTREE, DereferenceAliasesPolicy.NEVER,
         Integer.MAX_VALUE, Integer.MAX_VALUE, false,
-        LDAPFilter.decode("(objectclass=*)"), null, null);
+        LDAPFilter.objectClassPresent(), null, null);
 
     searchOperation.run();
 
@@ -998,45 +844,15 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(&(cn=*)(objectclass=ldapsubentry))"),
-              null, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(&(cn=*)(objectclass=ldapsubentry))"));
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getEntriesSent(), 1);
     assertEquals(searchOperation.getErrorMessage().length(), 0);
 
-    searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(&(&(cn=*)(objectclass=ldapsubentry)))"),
-              null, null);
-
+    searchOperation = newInternalSearchOperation(LDAPFilter.decode("(&(&(cn=*)(objectclass=ldapsubentry)))"));
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
@@ -1049,24 +865,8 @@
   {
     InvocationCounterPlugin.resetAllCounters();
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(BASE),
-              SearchScope.WHOLE_SUBTREE,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(|(objectclass=ldapsubentry)(objectclass=top))"),
-              null, null);
-
+        newInternalSearchOperation(LDAPFilter.decode("(|(objectclass=ldapsubentry)(objectclass=top))"));
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
@@ -1080,14 +880,10 @@
     InvocationCounterPlugin.resetAllCounters();
 
     TestCaseUtils.initializeTestBackend(true);
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
 
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf("ou=nonexistent,o=test"),
               SearchScope.WHOLE_SUBTREE,
@@ -1095,7 +891,7 @@
               Integer.MAX_VALUE,
               Integer.MAX_VALUE,
               false,
-              LDAPFilter.decode("(objectclass=*)"),
+              LDAPFilter.objectClassPresent(),
               null, null);
 
     searchOperation.run();
@@ -1202,7 +998,7 @@
         "cn: Test User",
         "userPassword: password");
 
-    final SearchRequest request = Requests.newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+    final SearchRequest request = Requests.newSearchRequest(userDN, SearchScope.BASE_OBJECT);
     request.setTypesOnly(typesOnly);
     switch (filterType)
     {
@@ -1403,7 +1199,7 @@
         "cn;lang-fr: Test Usager",
         "userPassword: password");
 
-    SearchRequest request = Requests.newSearchRequest(userDNString, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    SearchRequest request = Requests.newSearchRequest(userDN, SearchScope.BASE_OBJECT)
         .addAttribute(requestedAttributes);
     InternalSearchOperation search = getRootConnection().processSearch(request);
     assertEquals(search.getResultCode(), ResultCode.SUCCESS);
@@ -1472,7 +1268,7 @@
           Integer.MAX_VALUE,
           Integer.MAX_VALUE,
           false,
-          LDAPFilter.decode("(objectclass=*)"),
+          LDAPFilter.objectClassPresent(),
           attributes);
 
     SearchResultEntryProtocolOp entry =
@@ -1531,15 +1327,9 @@
 
     assertEquals(err,0);
 
-    //Search for the entries.
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              conn,
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf("dc=example,dc=com"),
               SearchScope.SINGLE_LEVEL,
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
index fb78212..b67b4fa 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SubentryManagerTestCase.java
@@ -30,24 +30,21 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Set;
 
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.LDAPAttribute;
-import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.protocols.ldap.LDAPModification;
 import org.opends.server.tools.LDAPDelete;
 import org.opends.server.tools.LDAPModify;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
@@ -64,6 +61,7 @@
 import static org.forgerock.opendj.ldap.ModificationType.*;
 import static org.opends.server.TestCaseUtils.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -362,21 +360,12 @@
   @Test
   public void testCollectiveAttributeSubentries() throws Exception
   {
-    Set<String> attributes = newSet("collectiveAttributeSubentries");
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(
-              getRootConnection(), nextOperationID(), nextMessageID(),
-              new ArrayList<Control>(),
-              ByteString.valueOf(testEntry.getName().toString()),
-              SearchScope.BASE_OBJECT,
-              DereferenceAliasesPolicy.NEVER,
-              Integer.MAX_VALUE,
-              Integer.MAX_VALUE,
-              false,
-              LDAPFilter.decode("(objectclass=*)"),
-              attributes, null);
+    SearchRequest request = newSearchRequest(testEntry.getName(), SearchScope.BASE_OBJECT)
+        .setSizeLimit(Integer.MAX_VALUE)
+        .setTimeLimit(Integer.MAX_VALUE)
+        .addAttribute("collectiveAttributeSubentries");
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
 
-    searchOperation.run();
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getEntriesSent(), 1);
     AttributeType attrType = DirectoryServer.getAttributeType("collectiveattributesubentries");
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/WorkflowConfigurationTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/WorkflowConfigurationTest.java
index 6454441..4083ae2 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/WorkflowConfigurationTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/WorkflowConfigurationTest.java
@@ -29,8 +29,8 @@
 import java.util.ArrayList;
 
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ModificationType;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.api.Backend;
@@ -39,17 +39,21 @@
 import org.opends.server.core.networkgroups.NetworkGroup;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.LDAPAttribute;
-import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.protocols.ldap.LDAPModification;
-import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.opends.server.types.Control;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.RawModification;
 import org.opends.server.util.StaticUtils;
 import org.opends.server.util.UtilTestCase;
 import org.opends.server.workflowelement.localbackend.LocalBackendWorkflowElement;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.StaticUtils.*;
 import static org.testng.Assert.*;
 
@@ -61,6 +65,7 @@
  * With the manual configuration mode, all the network groups, workflows
  * and workflow elements must be defined in the configuration file.
  */
+@SuppressWarnings("javadoc")
 public class WorkflowConfigurationTest extends UtilTestCase
 {
   // The base DN of the config backend
@@ -93,8 +98,7 @@
    * @throws Exception if the environment could not be set up.
    */
   @BeforeClass
-  public void setUp()
-    throws Exception
+  public void setUp() throws Exception
   {
     // Start the server so that we can update the configuration and execute
     // some LDAP operations
@@ -221,23 +225,11 @@
       ResultCode  expectedResultCode
       ) throws Exception
   {
-    InternalSearchOperation searchOperation = new InternalSearchOperation(
-       InternalClientConnection.getRootConnection(),
-       InternalClientConnection.nextOperationID(),
-       InternalClientConnection.nextMessageID(),
-       new ArrayList<Control>(),
-       ByteString.valueOf(baseDN),
-       scope,
-       DereferenceAliasesPolicy.NEVER,
-       Integer.MAX_VALUE,
-       Integer.MAX_VALUE,
-       false,
-       LDAPFilter.decode("(objectClass=*)"),
-       null, null);
-
-    searchOperation.run();
+    SearchRequest request = newSearchRequest(DN.valueOf(baseDN), scope)
+        .setSizeLimit(Integer.MAX_VALUE)
+        .setTimeLimit(Integer.MAX_VALUE);
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), expectedResultCode);
-
     return searchOperation;
   }
 
@@ -289,7 +281,7 @@
       throws Exception
   {
     // Get the backend
-    Backend backend = DirectoryServer.getBackend(backendID);
+    Backend<?> backend = DirectoryServer.getBackend(backendID);
     assertNotNull(backend);
 
     // Create the workflow element that wraps the local backend
@@ -361,10 +353,8 @@
    * Create a base entry for a new suffix.
    *
    * @param baseDN     the DN of the new base entry
-   * @param backendID  the identifier of the backend
    */
-  private void createBaseEntry(String baseDN, String backendID)
-      throws Exception
+  private void createBaseEntry(String baseDN) throws Exception
   {
     Entry entry = StaticUtils.createEntry(DN.valueOf(baseDN));
 
@@ -440,7 +430,7 @@
    * @return the newly created backend
    * @throws  Exception  If an unexpected problem occurs.
    */
-  private static Backend dsconfigCreateMemoryBackend(
+  private static Backend<?> dsconfigCreateMemoryBackend(
       String  backendID,
       String  baseDN,
       boolean createBaseEntry
@@ -454,7 +444,7 @@
         "--set", "writability-mode:enabled",
         "--set", "enabled:true");
 
-    Backend backend = DirectoryServer.getBackend(backendID);
+    Backend<?> backend = DirectoryServer.getBackend(backendID);
     if (createBaseEntry)
     {
       Entry e = createEntry(DN.valueOf(baseDN));
@@ -576,7 +566,7 @@
     // Add a new suffix to the test backend and check that the new
     // suffix is accessible (we are in auto mode).
     addSuffix(testBaseDN2, testBackendID2);
-    createBaseEntry(testBaseDN2, testBackendID2);
+    createBaseEntry(testBaseDN2);
     checkBackendIsAccessible(testBaseDN2);
 
     // Remove the suffix and check that the removed suffix is no
@@ -595,7 +585,7 @@
     // the workflow is automatically created when a new suffix is added.
     addSuffix(testBaseDN3, testBackendID2);
     createWorkflow(testBaseDN3, testBackendID2);
-    createBaseEntry(testBaseDN3, testBackendID2);
+    createBaseEntry(testBaseDN3);
     checkBackendIsAccessible(testBaseDN3);
 
     // Finally remove the new workflow and suffix and check that the suffix
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
index 4b345cc..d839587 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/NetworkGroupTest.java
@@ -38,6 +38,7 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.core.*;
 import org.opends.server.protocols.internal.InternalClientConnection;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.types.*;
 import org.opends.server.util.StaticUtils;
 import org.opends.server.workflowelement.WorkflowElement;
@@ -48,6 +49,7 @@
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -1041,7 +1043,8 @@
       int expectedNamingContexts
       ) throws Exception
   {
-    SearchOperation search = connection.processSearch("", SearchScope.SINGLE_LEVEL, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.SINGLE_LEVEL);
+    SearchOperation search = connection.processSearch(request);
 
     // Check the number of found naming context
     assertEquals(search.getResultCode(), shouldExist ? ResultCode.SUCCESS : ResultCode.NO_SUCH_OBJECT);
@@ -1060,7 +1063,8 @@
    */
   private void searchEntry(String baseDN, boolean shouldExist) throws Exception
   {
-    SearchOperation search = getRootConnection().processSearch(baseDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.valueOf(baseDN), SearchScope.BASE_OBJECT);
+    SearchOperation search = getRootConnection().processSearch(request);
 
     // Compare the result code with the expected one
     assertEquals(search.getResultCode(), shouldExist ? ResultCode.SUCCESS : ResultCode.NO_SUCH_OBJECT);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/RequestFilteringPolicyTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/RequestFilteringPolicyTest.java
index a02b8f1..88fa981 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/RequestFilteringPolicyTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/RequestFilteringPolicyTest.java
@@ -63,6 +63,7 @@
 import static org.forgerock.opendj.ldap.SearchScope.*;
 import static org.opends.server.admin.std.meta.RequestFilteringQOSPolicyCfgDefn.AllowedOperations.*;
 import static org.opends.server.admin.std.meta.RequestFilteringQOSPolicyCfgDefn.AllowedSearchScopes.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.CollectionUtils.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
@@ -293,8 +294,9 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch("dc=example,dc=com", BASE_OBJECT, searchFilter);
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search =
+        conn.processSearch(newSearchRequest("dc=example,dc=com", BASE_OBJECT, searchFilter));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -319,8 +321,9 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch("dc=example,dc=com", BASE_OBJECT, searchFilter);
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search =
+        conn.processSearch(newSearchRequest("dc=example,dc=com", BASE_OBJECT, searchFilter));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -347,8 +350,8 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch("dc=example,dc=com", searchScope, "objectclass=*");
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search = conn.processSearch(newSearchRequest(DN.valueOf("dc=example,dc=com"), searchScope));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -375,8 +378,8 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch(searchSubtree, WHOLE_SUBTREE, "objectclass=*");
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search = conn.processSearch(newSearchRequest(DN.valueOf(searchSubtree), WHOLE_SUBTREE));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -403,8 +406,8 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch(searchSubtree, WHOLE_SUBTREE, "objectclass=*");
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search = conn.processSearch(newSearchRequest(DN.valueOf(searchSubtree), WHOLE_SUBTREE));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -438,8 +441,8 @@
 
     });
 
-    InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
-    InternalSearchOperation search = conn.processSearch(searchSubtree, WHOLE_SUBTREE, "objectclass=*");
+    InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
+    InternalSearchOperation search = conn.processSearch(newSearchRequest(DN.valueOf(searchSubtree), WHOLE_SUBTREE));
     assertEquals(policy.isAllowed(search, messages), success);
   }
 
@@ -467,7 +470,7 @@
 
      });
 
-     InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
+     InternalClientConnection conn = new InternalClientConnection(DN.rootDN());
      PreParseOperation op = null;
 
      switch (type) {
@@ -511,7 +514,7 @@
                  "uid=usr.1,ou=people,dc=example,dc=com", true);
          break;
        case SEARCH:
-         op = conn.processSearch("dc=example,dc=com", WHOLE_SUBTREE, "uid>=user.1");
+         op = conn.processSearch(newSearchRequest("dc=example,dc=com", WHOLE_SUBTREE, "uid>=user.1"));
          break;
        case UNBIND:
          return;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/ResourceLimitsPolicyTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/ResourceLimitsPolicyTest.java
index 200bba4..0862c93 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/ResourceLimitsPolicyTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/networkgroups/ResourceLimitsPolicyTest.java
@@ -38,13 +38,13 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.types.DN;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import static org.mockito.Mockito.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -205,7 +205,7 @@
     InternalClientConnection conn = new InternalClientConnection(DN.NULL_DN);
     limits.addConnection(conn);
 
-    final SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.BASE_OBJECT, "(objectclass=*)");
+    final SearchRequest request = newSearchRequest(DN.valueOf("dc=example,dc=com"), SearchScope.BASE_OBJECT);
     final InternalSearchOperation search1 = conn.processSearch(request);
     assertOperationIsAllowed(limits, conn, search1, true,
         "First operation should be allowed");
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
index bc848ea..0e29a3f 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
@@ -60,15 +60,14 @@
 import org.opends.server.protocols.internal.Requests;
 import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.LDAPFilter;
-import org.opends.server.protocols.ldap.LDAPModification;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.Attributes;
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
-import org.opends.server.types.RawAttribute;
-import org.opends.server.types.RawModification;
+import org.opends.server.types.Modification;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.VirtualAttributeRule;
 import org.opends.server.util.StaticUtils;
@@ -77,6 +76,8 @@
 
 import static java.util.Collections.*;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.util.CollectionUtils.*;
 import static org.testng.Assert.*;
 
 /**
@@ -602,9 +603,8 @@
   public void testOptimisticConcurrency() throws Exception
   {
     // Use an internal connection.
-    String userDN = "uid=test.user,ou=People,o=test";
-    InternalClientConnection conn = InternalClientConnection
-        .getRootConnection();
+    DN userDN = DN.valueOf("uid=test.user,ou=People,o=test");
+    InternalClientConnection conn = getRootConnection();
 
     // Create a test backend containing the user entry to be modified.
     TestCaseUtils.initializeTestBackend(true);
@@ -629,15 +629,13 @@
     // @formatter:on
 
     // Read the user entry and get the etag.
-    Entry e1 = readEntry(conn, userDN);
+    Entry e1 = readEntry(userDN);
     String etag1 = e1.parseAttribute(ETAG).asString();
     assertNotNull(etag1);
 
     // Apply a change using the assertion control for optimistic concurrency.
-    List<RawModification> mods = Collections
-        .<RawModification> singletonList(new LDAPModification(
-            ModificationType.REPLACE, RawAttribute.create(DESCRIPTION,
-                "first modify")));
+    Attribute attr = Attributes.create(DESCRIPTION, "first modify");
+    List<Modification> mods = newArrayList(new Modification(ModificationType.REPLACE, attr));
     List<Control> ctrls = Collections
         .<Control> singletonList(new LDAPAssertionRequestControl(true,
             LDAPFilter.createEqualityFilter(ETAG, ByteString.valueOf(etag1))));
@@ -646,7 +644,7 @@
 
     // Reread the entry and check that the description has been added and that
     // the etag has changed.
-    Entry e2 = readEntry(conn, userDN);
+    Entry e2 = readEntry(userDN);
 
     String etag2 = e2.parseAttribute(ETAG).asString();
     assertNotNull(etag2);
@@ -657,15 +655,13 @@
     assertEquals(description2, "first modify");
 
     // Simulate a concurrent update: perform another update using the old etag.
-    mods = Collections.<RawModification> singletonList(new LDAPModification(
-        ModificationType.REPLACE, RawAttribute.create(DESCRIPTION,
-            "second modify")));
+    Attribute attr2 = Attributes.create(DESCRIPTION, "second modify");
+    mods = newArrayList(new Modification(ModificationType.REPLACE, attr2));
     modifyOperation = conn.processModify(userDN, mods, ctrls);
     assertEquals(modifyOperation.getResultCode(), ResultCode.ASSERTION_FAILED);
 
-    // Reread the entry and check that the description and etag have not
-    // changed.
-    Entry e3 = readEntry(conn, userDN);
+    // Reread the entry and check that the description and etag have not changed
+    Entry e3 = readEntry(userDN);
 
     String etag3 = e3.parseAttribute(ETAG).asString();
     assertNotNull(etag3);
@@ -688,11 +684,8 @@
   @Test
   public void testPreReadControl() throws Exception
   {
-    String userDN = "uid=test.user,ou=People,o=test";
-
-    // Use an internal connection.
-    InternalClientConnection conn = InternalClientConnection
-        .getRootConnection();
+    DN userDN = DN.valueOf("uid=test.user,ou=People,o=test");
+    InternalClientConnection conn = getRootConnection();
 
     // Create a test backend containing the user entry to be modified.
     TestCaseUtils.initializeTestBackend(true);
@@ -718,23 +711,20 @@
     // @formatter:on
 
     // Read the user entry and get the etag.
-    Entry e1 = readEntry(conn, userDN);
+    Entry e1 = readEntry(userDN);
     String etag1 = e1.parseAttribute(ETAG).asString();
     assertNotNull(etag1);
 
     // Apply a change using the pre and post read controls.
-    List<RawModification> mods = Collections
-        .<RawModification> singletonList(new LDAPModification(
-            ModificationType.REPLACE, RawAttribute.create(DESCRIPTION,
-                "modified value")));
-    List<Control> ctrls = singletonList((Control) new LDAPPreReadRequestControl(
-        true, singleton(ETAG)));
+    Attribute attr = Attributes.create(DESCRIPTION, "modified value");
+    List<Modification> mods = newArrayList(new Modification(ModificationType.REPLACE, attr));
+    List<Control> ctrls = singletonList((Control) new LDAPPreReadRequestControl(true, singleton(ETAG)));
     ModifyOperation modifyOperation = conn.processModify(userDN, mods, ctrls);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
 
     // Reread the entry and check that the description has been added and that
     // the etag has changed.
-    Entry e2 = readEntry(conn, userDN);
+    Entry e2 = readEntry(userDN);
 
     String etag2 = e2.parseAttribute(ETAG).asString();
     assertNotNull(etag2);
@@ -772,11 +762,8 @@
   @Test
   public void testPostReadControl() throws Exception
   {
-    String userDN = "uid=test.user,ou=People,o=test";
-
-    // Use an internal connection.
-    InternalClientConnection conn = InternalClientConnection
-        .getRootConnection();
+    DN userDN = DN.valueOf("uid=test.user,ou=People,o=test");
+    InternalClientConnection conn = getRootConnection();
 
     // Create a test backend containing the user entry to be modified.
     TestCaseUtils.initializeTestBackend(true);
@@ -802,23 +789,20 @@
     // @formatter:on
 
     // Read the user entry and get the etag.
-    Entry e1 = readEntry(conn, userDN);
+    Entry e1 = readEntry(userDN);
     String etag1 = e1.parseAttribute(ETAG).asString();
     assertNotNull(etag1);
 
     // Apply a change using the pre and post read controls.
-    List<RawModification> mods = Collections
-        .<RawModification> singletonList(new LDAPModification(
-            ModificationType.REPLACE, RawAttribute.create(DESCRIPTION,
-                "modified value")));
-    List<Control> ctrls = singletonList((Control) new LDAPPostReadRequestControl(
-        true, singleton(ETAG)));
+    Attribute attr = Attributes.create(DESCRIPTION, "modified value");
+    List<Modification> mods = newArrayList(new Modification(ModificationType.REPLACE, attr));
+    List<Control> ctrls = singletonList((Control) new LDAPPostReadRequestControl(true, singleton(ETAG)));
     ModifyOperation modifyOperation = conn.processModify(userDN, mods, ctrls);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
 
     // Reread the entry and check that the description has been added and that
     // the etag has changed.
-    Entry e2 = readEntry(conn, userDN);
+    Entry e2 = readEntry(userDN);
 
     String etag2 = e2.parseAttribute(ETAG).asString();
     assertNotNull(etag2);
@@ -829,28 +813,29 @@
     assertEquals(description2, "modified value");
 
     // Now check that the post-read is the same as the initial etag.
-    LDAPPostReadResponseControl postReadControl = null;
-    for (Control control : modifyOperation.getResponseControls())
-    {
-      if (control instanceof LDAPPostReadResponseControl)
-      {
-        postReadControl = (LDAPPostReadResponseControl) control;
-        break;
-      }
-    }
-    assertNotNull(postReadControl);
+    LDAPPostReadResponseControl postReadControl = getLDAPPostReadResponseControl(modifyOperation);
     String etagPostRead =
         postReadControl.getSearchEntry().parseAttribute(ETAG).asString();
     assertEquals(etagPostRead, etag2);
   }
 
-
-
-  private Entry readEntry(InternalClientConnection conn, String userDN)
-      throws DirectoryException
+  private LDAPPostReadResponseControl getLDAPPostReadResponseControl(ModifyOperation modifyOperation)
   {
-    SearchRequest request = Requests.newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)", "*", ETAG);
-    InternalSearchOperation searchOperation = conn.processSearch(request);
+    for (Control control : modifyOperation.getResponseControls())
+    {
+      if (control instanceof LDAPPostReadResponseControl)
+      {
+        return (LDAPPostReadResponseControl) control;
+      }
+    }
+    fail("Expected the ModifyOperation to have a LDAPPostReadResponseControl");
+    return null;
+  }
+
+  private Entry readEntry(DN userDN) throws DirectoryException
+  {
+    SearchRequest request = Requests.newSearchRequest(userDN, SearchScope.BASE_OBJECT).addAttribute("*", ETAG);
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
     Entry e = searchOperation.getSearchEntries().get(0);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
index f61b2f0..ec8f3c1 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
@@ -310,7 +310,7 @@
   public void testSearchEntryDNAttrRealAttrsOnly(DN entryDN)
          throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("entrydn")
         .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
@@ -336,7 +336,7 @@
   public void testSearchEntryDNAttrVirtualAttrsOnly(DN entryDN)
          throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("entrydn")
         .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProviderTestCase.java
index 5f3426d..d28a6b2 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProviderTestCase.java
@@ -27,21 +27,16 @@
 package org.opends.server.extensions;
 
 import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.*;
 import org.testng.annotations.BeforeClass;
@@ -49,6 +44,7 @@
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 import static org.testng.Assert.*;
@@ -344,26 +340,12 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @Test(dataProvider = "testEntryDNs")
-  public void testSearchEntryUUIDAttrRealAttrsOnly(DN entryDN)
-         throws Exception
+  public void testSearchEntryUUIDAttrRealAttrsOnly(DN entryDN) throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-    LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
-    attrList.add("entryuuid");
-
-    LinkedList<Control> requestControls = new LinkedList<Control>();
-    requestControls.add(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
-
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                     InternalClientConnection.nextMessageID(), requestControls,
-                                     entryDN, SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false, filter, attrList, null);
-    searchOperation.run();
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute("entryuuid")
+        .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
@@ -384,26 +366,13 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @Test(dataProvider = "testEntryDNs")
-  public void testSearchEntryUUIDAttrVirtualAttrsOnly(DN entryDN)
-         throws Exception
+  public void testSearchEntryUUIDAttrVirtualAttrsOnly(DN entryDN) throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-    LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
-    attrList.add("entryuuid");
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute("entryuuid")
+        .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
 
-    LinkedList<Control> requestControls = new LinkedList<Control>();
-    requestControls.add(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
-
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-         new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
-                                     InternalClientConnection.nextMessageID(), requestControls,
-                                     entryDN, SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false, filter, attrList, null);
-    searchOperation.run();
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
@@ -416,7 +385,7 @@
   /**
    * Tests the {@code isMultiValued} method.
    */
-  @Test()
+  @Test
   public void testIsMultiValued()
   {
     EntryUUIDVirtualAttributeProvider provider =
@@ -431,29 +400,16 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testGetValues()
-         throws Exception
+  @Test
+  public void testGetValues() throws Exception
   {
     String uuidString = UUID.nameUUIDFromBytes(getBytes("o=test")).toString();
 
     EntryUUIDVirtualAttributeProvider provider =
          new EntryUUIDVirtualAttributeProvider();
 
-    Entry entry = TestCaseUtils.makeEntry(
-      "dn: o=test",
-      "objectClass: top",
-      "objectClass: organization",
-      "o: test");
-    entry.processVirtualAttributes();
-
-    VirtualAttributeRule rule =
-         new VirtualAttributeRule(entryUUIDType, provider,
-                  Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
-                  Collections.<DN>emptySet(),
-                  Collections.<SearchFilter>emptySet(),
-                  VirtualAttributeCfgDefn.ConflictBehavior.
-                       VIRTUAL_OVERRIDES_REAL);
+    Entry entry = makeEntry();
+    VirtualAttributeRule rule = getRule(provider);
 
     Attribute values = provider.getValues(entry, rule);
     assertNotNull(values);
@@ -469,96 +425,70 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testHasAnyValue()
-         throws Exception
+  @Test
+  public void testHasAnyValue() throws Exception
   {
     EntryUUIDVirtualAttributeProvider provider =
          new EntryUUIDVirtualAttributeProvider();
 
-    Entry entry = TestCaseUtils.makeEntry(
-      "dn: o=test",
-      "objectClass: top",
-      "objectClass: organization",
-      "o: test");
-    entry.processVirtualAttributes();
-
-    VirtualAttributeRule rule =
-         new VirtualAttributeRule(entryUUIDType, provider,
-                  Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
-                  Collections.<DN>emptySet(),
-                  Collections.<SearchFilter>emptySet(),
-                  VirtualAttributeCfgDefn.ConflictBehavior.
-                       VIRTUAL_OVERRIDES_REAL);
-
+    Entry entry = makeEntry();
+    VirtualAttributeRule rule = getRule(provider);
     assertTrue(provider.hasValue(entry, rule));
   }
 
-
-
   /**
    * Tests the {@code hasValue} method variant that takes a specific value when
    * the provided value is a match.
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testHasMatchingValue()
-         throws Exception
+  @Test
+  public void testHasMatchingValue() throws Exception
   {
     String uuidString = UUID.nameUUIDFromBytes(getBytes("o=test")).toString();
 
     EntryUUIDVirtualAttributeProvider provider =
          new EntryUUIDVirtualAttributeProvider();
 
-    Entry entry = TestCaseUtils.makeEntry(
-      "dn: o=test",
-      "objectClass: top",
-      "objectClass: organization",
-      "o: test");
-    entry.processVirtualAttributes();
-
-    VirtualAttributeRule rule =
-         new VirtualAttributeRule(entryUUIDType, provider,
-                  Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
-                  Collections.<DN>emptySet(),
-                  Collections.<SearchFilter>emptySet(),
-                  VirtualAttributeCfgDefn.ConflictBehavior.
-                       VIRTUAL_OVERRIDES_REAL);
-
+    Entry entry = makeEntry();
+    VirtualAttributeRule rule = getRule(provider);
     assertTrue(provider.hasValue(entry, rule, ByteString.valueOf(uuidString)));
   }
 
-
-
   /**
    * Tests the {@code hasValue} method variant that takes a specific value when
    * the provided value is not a match.
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testHasNonMatchingValue()
-         throws Exception
+  @Test
+  public void testHasNonMatchingValue() throws Exception
   {
     EntryUUIDVirtualAttributeProvider provider =
          new EntryUUIDVirtualAttributeProvider();
 
+    Entry entry = makeEntry();
+    VirtualAttributeRule rule = getRule(provider);
+    assertFalse(provider.hasValue(entry, rule, ByteString.valueOf("wrong")));
+  }
+
+  private Entry makeEntry() throws Exception
+  {
     Entry entry = TestCaseUtils.makeEntry(
       "dn: o=test",
       "objectClass: top",
       "objectClass: organization",
       "o: test");
     entry.processVirtualAttributes();
+    return entry;
+  }
 
-    VirtualAttributeRule rule =
-         new VirtualAttributeRule(entryUUIDType, provider,
-                  Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
-                  Collections.<DN>emptySet(),
-                  Collections.<SearchFilter>emptySet(),
-                  VirtualAttributeCfgDefn.ConflictBehavior.
-                       VIRTUAL_OVERRIDES_REAL);
-
-    assertFalse(provider.hasValue(entry, rule, ByteString.valueOf("wrong")));
+  private VirtualAttributeRule getRule(EntryUUIDVirtualAttributeProvider provider)
+  {
+    return new VirtualAttributeRule(entryUUIDType, provider,
+              Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
+              Collections.<DN>emptySet(),
+              Collections.<SearchFilter>emptySet(),
+              VirtualAttributeCfgDefn.ConflictBehavior.VIRTUAL_OVERRIDES_REAL);
   }
 }
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExtensionTestUtils.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExtensionTestUtils.java
index 9ca15c8..25e5bd4 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExtensionTestUtils.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExtensionTestUtils.java
@@ -28,13 +28,13 @@
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.schema.SchemaConstants;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -47,79 +47,54 @@
   public static void testSearchEmptyAttrs(DN entryDN,
       AttributeType attributeType) throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertFalse(e.hasAttribute(attributeType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT);
+    assertAttributeFound(request, attributeType, false);
   }
 
   public static void testSearchNoAttrs(DN entryDN, AttributeType attributeType)
       throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
-            .addAttribute(SchemaConstants.NO_ATTRIBUTES);
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertFalse(e.hasAttribute(attributeType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute(SchemaConstants.NO_ATTRIBUTES);
+    assertAttributeFound(request, attributeType, false);
   }
 
   public static void testSearchAllUserAttrs(DN entryDN,
       AttributeType attributeType) throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("*");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertFalse(e.hasAttribute(attributeType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT).addAttribute("*");
+    assertAttributeFound(request, attributeType, false);
   }
 
   public static void testSearchAllOperationalAttrs(DN entryDN,
       AttributeType attributeType) throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("+");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertTrue(e.hasAttribute(attributeType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT).addAttribute("+");
+    assertAttributeFound(request, attributeType, true);
   }
 
   public static void testSearchAttr(DN entryDN, String attrName,
       AttributeType attributeType) throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute(attrName);
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertTrue(e.hasAttribute(attributeType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT).addAttribute(attrName);
+    assertAttributeFound(request, attributeType, true);
   }
 
   public static void testSearchExcludeAttr(DN entryDN,
       AttributeType attributeType) throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("objectClass");
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT).addAttribute("objectClass");
+    assertAttributeFound(request, attributeType, false);
+  }
+
+  private static void assertAttributeFound(final SearchRequest request, AttributeType attributeType, boolean expected)
+  {
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
     assertNotNull(e);
-    assertFalse(e.hasAttribute(attributeType));
+    assertEquals(e.hasAttribute(attributeType), expected);
   }
 
 }
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProviderTestCase.java
index 44e6c5a..515e9e2 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProviderTestCase.java
@@ -27,25 +27,20 @@
 package org.opends.server.extensions;
 
 import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn;
 import org.opends.server.api.VirtualAttributeProvider;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.Requests;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.SearchFilter;
@@ -56,6 +51,7 @@
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -368,24 +364,10 @@
   public void testSearchGovStructRuleAttrRealAttrsOnly(DN entryDN)
          throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-    LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
-    attrList.add("governingStructureRuleType");
-
-    LinkedList<Control> requestControls = new LinkedList<Control>();
-    requestControls.add(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
-
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-        new InternalSearchOperation(conn, InternalClientConnection
-            .nextOperationID(), InternalClientConnection
-            .nextMessageID(), requestControls, entryDN,
-            SearchScope.BASE_OBJECT,
-            DereferenceAliasesPolicy.NEVER, 0, 0, false, filter,
-            attrList, null);
-    searchOperation.run();
+    final SearchRequest request = Requests.newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute("governingStructureRuleType")
+        .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
@@ -409,24 +391,10 @@
   public void testSearchGovStructRuleAttrVirtualAttrsOnly(DN entryDN)
          throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-    LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
-    attrList.add("governingStructureRule");
-
-    LinkedList<Control> requestControls = new LinkedList<Control>();
-    requestControls.add(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
-
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-        new InternalSearchOperation(conn, InternalClientConnection
-            .nextOperationID(), InternalClientConnection
-            .nextMessageID(), requestControls, entryDN,
-            SearchScope.BASE_OBJECT,
-            DereferenceAliasesPolicy.NEVER, 0, 0, false, filter,
-            attrList, null);
-    searchOperation.run();
+    final SearchRequest request = Requests.newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute("governingStructureRule")
+        .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
+    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProviderTestCase.java
index 19146ab..21916d6 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProviderTestCase.java
@@ -397,7 +397,7 @@
   public void testSearchhasSubordinatesAttrRealAttrsOnly(DN entryDN, boolean hasSubs)
          throws Exception
   {
-    SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("hasSubordinates")
         .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
@@ -424,8 +424,7 @@
   public void testSearchhasSubordinatesAttrVirtualAttrsOnly(DN entryDN, boolean hasSubs)
          throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    SearchFilter filter = SearchFilter.objectClassPresent();
     LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
     attrList.add("hasSubordinates");
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
index 3d25aee..3239ee3 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
@@ -2768,8 +2768,7 @@
     try
     {
       connection = factory.getConnection();
-      connection.search(searchBindDN, SearchScope.WHOLE_SUBTREE,
-          SearchFilter.createFilterFromString("(objectClass=*)"));
+      connection.search(searchBindDN, SearchScope.WHOLE_SUBTREE, SearchFilter.objectClassPresent());
       fail("Search attempt should have timed out");
     }
     catch (final DirectoryException e)
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProviderTestCase.java
index d86ee28..c383d5f 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProviderTestCase.java
@@ -35,14 +35,17 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.protocols.ldap.LDAPControl;
-import org.opends.server.types.*;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -353,12 +356,7 @@
     final SearchRequest request =
         newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(numSubordinates=" + count + ")")
             .addAttribute("numSubordinates");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertTrue(e.hasAttribute(numSubordinatesType));
+    assertNumSubordinatesAttributeFound(request, true);
   }
 
   /**
@@ -395,19 +393,12 @@
   public void testSearchnumSubordinatesAttrRealAttrsOnly(DN entryDN, int count)
          throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("numSubordinates")
         .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertFalse(e.hasAttribute(numSubordinatesType));
+    assertNumSubordinatesAttributeFound(request, false);
   }
 
-
-
   /**
    * Performs an internal search to retrieve the specified entry, ensuring that
    * the numSubordinates attribute is included when that attribute is specifically
@@ -422,15 +413,10 @@
   public void testSearchnumSubordinatesAttrVirtualAttrsOnly(DN entryDN, int count)
          throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("numSubordinates")
-            .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertTrue(e.hasAttribute(numSubordinatesType));
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
+        .addAttribute("numSubordinates")
+        .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
+    assertNumSubordinatesAttributeFound(request, true);
   }
 
   /**
@@ -450,12 +436,7 @@
     final SearchRequest request =
         newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(numSubordinates>=" + count + ")")
             .addAttribute("numSubordinates");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getSearchEntries().size(), 1);
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e);
-    assertTrue(e.hasAttribute(numSubordinatesType));
+    assertNumSubordinatesAttributeFound(request, true);
   }
 
   /**
@@ -475,19 +456,21 @@
     final SearchRequest request =
         newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(numSubordinates<=" + count + ")")
             .addAttribute("numSubordinates");
+    assertNumSubordinatesAttributeFound(request, true);
+  }
+
+  private void assertNumSubordinatesAttributeFound(final SearchRequest request, boolean expected)
+  {
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getSearchEntries().size(), 1);
 
     Entry e = searchOperation.getSearchEntries().get(0);
     assertNotNull(e);
-    assertTrue(e.hasAttribute(numSubordinatesType));
+    assertEquals(e.hasAttribute(numSubordinatesType), expected);
   }
 
-
-  /**
-   * Tests the {@code isMultiValued} method.
-   */
-  @Test()
+  /** Tests the {@code isMultiValued} method. */
+  @Test
   public void testIsMultiValued()
   {
     assertFalse(new NumSubordinatesVirtualAttributeProvider().isMultiValued());
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProviderTestCase.java
index 0c37c94..f48866b 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProviderTestCase.java
@@ -202,7 +202,7 @@
     throws Exception
   {
     // Process the search request
-    SearchRequest request = newSearchRequest(notExpired.getName(), SearchScope.BASE_OBJECT, "(objectclass=*)")
+    SearchRequest request = newSearchRequest(notExpired.getName(), SearchScope.BASE_OBJECT)
         .addAttribute(attributeName, "pwdpolicysubentry");
     InternalSearchOperation search = getRootConnection().processSearch(request);
     assertEquals(search.getResultCode(), ResultCode.SUCCESS);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProviderTestCase.java
index e55924d..47c6dbd 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProviderTestCase.java
@@ -337,8 +337,7 @@
   public void testSearchStructuralOCAttrRealAttrsOnly(DN entryDN)
          throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    SearchFilter filter = SearchFilter.objectClassPresent();
     LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
     attrList.add("structuralObjectClass");
 
@@ -378,8 +377,7 @@
   public void testSearchStructuralOCAttrVirtualAttrsOnly(DN entryDN)
          throws Exception
   {
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    SearchFilter filter = SearchFilter.objectClassPresent();
     LinkedHashSet<String> attrList = new LinkedHashSet<String>(1);
     attrList.add("structuralObjectClass");
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProviderTestCase.java
index b6ef65e..16a208a 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProviderTestCase.java
@@ -36,7 +36,6 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
@@ -49,6 +48,7 @@
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 
@@ -310,7 +310,7 @@
   public void testSearchSubschemaSubentryAttrRealAttrsOnly(DN entryDN)
          throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("subschemaSubentry")
         .addControl(new LDAPControl(OID_REAL_ATTRS_ONLY, true));
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
@@ -337,7 +337,7 @@
   public void testSearchSubschemaSubentryAttrVirtualAttrsOnly(DN entryDN)
          throws Exception
   {
-    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(entryDN, SearchScope.BASE_OBJECT)
         .addAttribute("subschemaSubentry")
         .addControl(new LDAPControl(OID_VIRTUAL_ATTRS_ONLY, true));
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
@@ -353,7 +353,7 @@
   /**
    * Tests the {@code isMultiValued} method.
    */
-  @Test()
+  @Test
   public void testIsMultiValued()
   {
     assertFalse(new SubschemaSubentryVirtualAttributeProvider().isMultiValued());
@@ -366,7 +366,7 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
+  @Test
   public void testGetValues()
          throws Exception
   {
@@ -402,7 +402,7 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
+  @Test
   public void testHasAnyValue()
          throws Exception
   {
@@ -435,7 +435,7 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
+  @Test
   public void testHasMatchingValue()
          throws Exception
   {
@@ -468,9 +468,8 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testHasNonMatchingValue()
-         throws Exception
+  @Test
+  public void testHasNonMatchingValue() throws Exception
   {
     SubschemaSubentryVirtualAttributeProvider provider =
          new SubschemaSubentryVirtualAttributeProvider();
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/TraditionalWorkQueueTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/TraditionalWorkQueueTestCase.java
index 43d8052..1a3e64c 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/TraditionalWorkQueueTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/TraditionalWorkQueueTestCase.java
@@ -191,10 +191,8 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    List<Control> requestControls =
-         DelayPreOpPlugin.createDelayControlList(5000);
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    List<Control> requestControls = DelayPreOpPlugin.createDelayControlList(5000);
+    SearchFilter filter = SearchFilter.objectClassPresent();
     LinkedHashSet<String> attrs = new LinkedHashSet<String>();
 
     InternalClientConnection conn =
@@ -228,10 +226,8 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    List<Control> requestControls =
-         DelayPreOpPlugin.createDelayControlList(5000);
-    SearchFilter filter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
+    List<Control> requestControls = DelayPreOpPlugin.createDelayControlList(5000);
+    SearchFilter filter = SearchFilter.objectClassPresent();
     LinkedHashSet<String> attrs = new LinkedHashSet<String>();
 
     InternalClientConnection conn =
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
index 72bdf88..ffac805 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
@@ -38,13 +38,13 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.tools.LDAPModify;
 import org.opends.server.types.*;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -121,7 +121,7 @@
               .nextMessageID(), null, DN.valueOf(ruleDN),
               SearchScope.BASE_OBJECT,
               DereferenceAliasesPolicy.NEVER, 0, 0, false,
-              SearchFilter.createFilterFromString("(objectClass=*)"),
+              SearchFilter.objectClassPresent(),
               null, null);
 
       for (VirtualAttributeRule rule : DirectoryServer
@@ -187,7 +187,7 @@
               .nextMessageID(), null, DN.valueOf(ruleDN),
               SearchScope.BASE_OBJECT,
               DereferenceAliasesPolicy.NEVER, 0, 0, false,
-              SearchFilter.createFilterFromString("(objectClass=*)"),
+              SearchFilter.objectClassPresent(),
               null, null);
 
       for (VirtualAttributeRule rule : DirectoryServer
@@ -261,7 +261,7 @@
     InternalClientConnection conn = getRootConnection();
     try
     {
-      final SearchRequest request = newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+      final SearchRequest request = newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList =
@@ -329,7 +329,7 @@
     InternalClientConnection conn = getRootConnection();
     try
     {
-      final SearchRequest request = newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+      final SearchRequest request = newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList =
@@ -398,7 +398,7 @@
     InternalClientConnection conn = getRootConnection();
     try
     {
-      final SearchRequest request = newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+      final SearchRequest request = newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList =
@@ -466,7 +466,7 @@
     InternalClientConnection conn = getRootConnection();
     try
     {
-      final SearchRequest request = newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+      final SearchRequest request = newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList =
@@ -533,7 +533,7 @@
     InternalClientConnection conn = getRootConnection();
     try
     {
-      final SearchRequest request = newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)");
+      final SearchRequest request = newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList =
@@ -605,13 +605,11 @@
       "userPassword: test",
       "description: " + realValue);
 
-    InternalClientConnection conn =
-      InternalClientConnection.getRootConnection();
-
+    InternalClientConnection conn = getRootConnection();
     try
     {
       final SearchRequest request =
-          newSearchRequest(userDN, SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("description");
+          newSearchRequest(DN.valueOf(userDN), SearchScope.BASE_OBJECT).addAttribute("description");
       InternalSearchOperation searchOperation = conn.processSearch(request);
 
       List<Attribute> attrList = searchOperation.getSearchEntries().get(0).getAttribute(descriptionType);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
index bb63422..6d6c492 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
@@ -42,13 +42,13 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.types.*;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -879,8 +879,8 @@
    */
   private void cleanUp() throws Exception
   {
-    final SearchRequest request =
-        newSearchRequest("ou=Groups,dc=example,dc=com", SearchScope.SINGLE_LEVEL, "(objectClass=*)");
+    DN dn = DN.valueOf("ou=Groups,dc=example,dc=com");
+    final SearchRequest request = newSearchRequest(dn, SearchScope.SINGLE_LEVEL);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     for (Entry e : searchOperation.getSearchEntries())
     {
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
index 6957f18..71c95db 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
@@ -35,7 +35,7 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
+import org.opends.server.types.DN;
 import org.opends.server.types.SearchResultEntry;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -44,6 +44,7 @@
 
 import static org.forgerock.opendj.ldap.SearchScope.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -78,8 +79,8 @@
   @Test
   public void testWithSubtreeMonitorSearch() throws Exception
   {
-    InternalSearchOperation op = getRootConnection().processSearch(
-        "cn=monitor", WHOLE_SUBTREE, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.valueOf("cn=monitor"), WHOLE_SUBTREE);
+    InternalSearchOperation op = getRootConnection().processSearch(request);
     assertEquals(op.getResultCode(), ResultCode.SUCCESS,
         "Failed to search cn=monitor subtree. Got error message: " + op.getErrorMessage());
   }
@@ -116,9 +117,8 @@
   public void testWithBaseObjectMonitorSearch(String monitorName) throws Exception
   {
     // could be more than one level
-    final String monitorDN = "cn="+monitorName+",cn=monitor";
-    InternalSearchOperation op = getRootConnection().processSearch(
-        monitorDN, BASE_OBJECT, "(objectClass=*)");
+    final DN monitorDN = DN.valueOf("cn=" + monitorName + ",cn=monitor");
+    InternalSearchOperation op = getRootConnection().processSearch(newSearchRequest(monitorDN, BASE_OBJECT));
     assertEquals(op.getResultCode(), ResultCode.SUCCESS,
         "Failed to read " + monitorDN + " entry. Got error message: " + op.getErrorMessage());
   }
@@ -132,17 +132,17 @@
   public void testWithSubtreeAndBaseMonitorSearch() throws Exception
   {
     final InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation op = conn.processSearch(
-        "cn=monitor", WHOLE_SUBTREE, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(DN.valueOf("cn=monitor"), WHOLE_SUBTREE);
+    InternalSearchOperation op = getRootConnection().processSearch(request);
     assertEquals(op.getResultCode(), ResultCode.SUCCESS,
         "Failed to search cn=monitor subtree. Got error message: " + op.getErrorMessage());
 
     for (SearchResultEntry sre : op.getSearchEntries())
     {
-      final SearchRequest request = newSearchRequest(sre.getName(), BASE_OBJECT, "(objectClass=*)");
-      final InternalSearchOperation readOp = conn.processSearch(request);
-      assertEquals(readOp.getResultCode(), ResultCode.SUCCESS,
-          "Failed to read " + sre.getName() + " entry. Got error message: " + readOp.getErrorMessage());
+      final SearchRequest request2 = newSearchRequest(sre.getName(), BASE_OBJECT);
+      final InternalSearchOperation op2 = conn.processSearch(request2);
+      assertEquals(op2.getResultCode(), ResultCode.SUCCESS,
+          "Failed to read " + sre.getName() + " entry. Got error message: " + op2.getErrorMessage());
     }
   }
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/LDAPADListPluginTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/LDAPADListPluginTestCase.java
index e839c0d..291d4f9 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/LDAPADListPluginTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/LDAPADListPluginTestCase.java
@@ -40,6 +40,7 @@
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
+import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
@@ -131,8 +132,7 @@
    * @throws  Exception  If an unexpected problem occurs.
    */
   @DataProvider(name = "invalidConfigs")
-  public Object[][] getInvalidConfigs()
-         throws Exception
+  public Object[][] getInvalidConfigs() throws Exception
   {
     ArrayList<Entry> entries = new ArrayList<Entry>();
     Entry e = TestCaseUtils.makeEntry(
@@ -212,13 +212,8 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    final SearchRequest request = newSearchRequest("o=test", SearchScope.BASE_OBJECT, "(objectClass=*)");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
-    assertFalse(searchOperation.getSearchEntries().isEmpty());
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e.getAttribute("o"));
+    final SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.BASE_OBJECT);
+    assertAttributeOExists(request);
   }
 
 
@@ -235,14 +230,9 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    SearchRequest request = newSearchRequest("o=test", SearchScope.BASE_OBJECT, "(objectClass=*)")
+    SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.BASE_OBJECT)
         .addAttribute("o");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
-    assertFalse(searchOperation.getSearchEntries().isEmpty());
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e.getAttribute("o"));
+    assertAttributeOExists(request);
   }
 
 
@@ -259,14 +249,9 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    final SearchRequest request = newSearchRequest("o=test", SearchScope.BASE_OBJECT, "(objectClass=*)")
+    final SearchRequest request = newSearchRequest(DN.valueOf("o=test"), SearchScope.BASE_OBJECT)
         .addAttribute("@organization");
-    InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
-    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
-    assertFalse(searchOperation.getSearchEntries().isEmpty());
-
-    Entry e = searchOperation.getSearchEntries().get(0);
-    assertNotNull(e.getAttribute("o"));
+    assertAttributeOExists(request);
   }
 
 
@@ -284,7 +269,12 @@
     TestCaseUtils.initializeTestBackend(true);
 
     final SearchRequest request =
-        newSearchRequest("o=test", SearchScope.BASE_OBJECT, "(objectClass=*)").addAttribute("@undefined");
+        newSearchRequest(DN.valueOf("o=test"), SearchScope.BASE_OBJECT).addAttribute("@undefined");
+    assertAttributeOExists(request);
+  }
+
+  private void assertAttributeOExists(final SearchRequest request)
+  {
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
index bcd9fc8..c9a4482 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
@@ -715,7 +715,7 @@
   @Test
   public void testProcessSearch1() throws Exception
   {
-    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
@@ -733,7 +733,7 @@
   @Test
   public void testProcessSearch2() throws Exception
   {
-    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
@@ -754,7 +754,7 @@
   {
     TestInternalSearchListener searchListener = new TestInternalSearchListener();
 
-    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request, searchListener);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchListener.getSearchEntries().isEmpty());
@@ -772,7 +772,7 @@
   @Test
   public void testProcessSearch4() throws Exception
   {
-    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
@@ -790,7 +790,7 @@
   @Test
   public void testProcessSearch5() throws Exception
   {
-    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
@@ -812,7 +812,7 @@
     TestInternalSearchListener searchListener =
          new TestInternalSearchListener();
 
-    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    final SearchRequest request = newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request, searchListener);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchListener.getSearchEntries().isEmpty());
@@ -831,7 +831,8 @@
          throws Exception
   {
     InternalClientConnection conn = getRootConnection();
-    InternalSearchOperation searchOperation = conn.processSearch("", SearchScope.BASE_OBJECT, "(objectClass=*)");
+    InternalSearchOperation searchOperation =
+        conn.processSearch(newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT));
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
     assertTrue(searchOperation.getSearchReferences().isEmpty());
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalLDAPSocketTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalLDAPSocketTestCase.java
index b1e72c9..439a5b7 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalLDAPSocketTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalLDAPSocketTestCase.java
@@ -602,7 +602,7 @@
                                      SearchScope.BASE_OBJECT,
                                      DereferenceAliasesPolicy.NEVER,
                                      0, 0, false,
-                                     LDAPFilter.decode("(objectClass=*)"),
+                                     LDAPFilter.objectClassPresent(),
                                      new LinkedHashSet<String>());
     writer.writeMessage(new LDAPMessage(2, searchRequest));
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalSearchOperationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalSearchOperationTestCase.java
index cd0378a..5b91b68 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalSearchOperationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalSearchOperationTestCase.java
@@ -78,7 +78,7 @@
                                 nextMessageID(), new ArrayList<Control>(),
                                 ByteString.empty(), SearchScope.BASE_OBJECT,
                                 DereferenceAliasesPolicy.NEVER, 0, 0,
-                                false, LDAPFilter.decode("(objectClass=*)"),
+                                false, LDAPFilter.objectClassPresent(),
                                 new LinkedHashSet<String>(), null);
   }
 
@@ -99,7 +99,7 @@
                                 nextMessageID(), new ArrayList<Control>(),
                                 ByteString.empty(), SearchScope.BASE_OBJECT,
                                 DereferenceAliasesPolicy.NEVER, 0, 0,
-                                false, LDAPFilter.decode("(objectClass=*)"),
+                                false, LDAPFilter.objectClassPresent(),
                                 new LinkedHashSet<String>(),
                                 new TestInternalSearchListener());
   }
@@ -116,15 +116,12 @@
   public void testConstructor2WithoutListener()
          throws Exception
   {
-    SearchFilter searchFilter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-
     InternalClientConnection conn = getRootConnection();
     new InternalSearchOperation(conn, nextOperationID(),
                                 nextMessageID(), new ArrayList<Control>(),
                                 DN.rootDN(), SearchScope.BASE_OBJECT,
-                                DereferenceAliasesPolicy.NEVER, 0, 0,
-                                false, searchFilter,
+                                DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                SearchFilter.objectClassPresent(),
                                 new LinkedHashSet<String>(), null);
   }
 
@@ -140,15 +137,12 @@
   public void testConstructor2WithListener()
          throws Exception
   {
-    SearchFilter searchFilter =
-         SearchFilter.createFilterFromString("(objectClass=*)");
-
     InternalClientConnection conn = getRootConnection();
     new InternalSearchOperation(conn, nextOperationID(),
                                 nextMessageID(), new ArrayList<Control>(),
                                 DN.rootDN(), SearchScope.BASE_OBJECT,
                                 DereferenceAliasesPolicy.NEVER, 0, 0,
-                                false, searchFilter,
+                                false, SearchFilter.objectClassPresent(),
                                 new LinkedHashSet<String>(),
                                 new TestInternalSearchListener());
   }
@@ -164,7 +158,7 @@
   @Test()
   public void testGetSearchEntriesAndReferences() throws Exception
   {
-    SearchRequest request = Requests.newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = Requests.newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT);
     InternalSearchOperation searchOperation = getRootConnection().processSearch(request);
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertFalse(searchOperation.getSearchEntries().isEmpty());
@@ -188,9 +182,8 @@
                                      new ArrayList<Control>(),
                                      ByteString.empty(),
                                      SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false,
-                                     LDAPFilter.decode("(objectClass=*)"),
+                                     DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                     LDAPFilter.objectClassPresent(),
                                      new LinkedHashSet<String>(), null);
 
     Entry e = TestCaseUtils.makeEntry("dn: ",
@@ -217,9 +210,8 @@
                                      new ArrayList<Control>(),
                                      ByteString.empty(),
                                      SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false,
-                                     LDAPFilter.decode("(objectClass=*)"),
+                                     DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                     LDAPFilter.objectClassPresent(),
                                      new LinkedHashSet<String>(),
                                      new TestInternalSearchListener());
 
@@ -247,9 +239,8 @@
                                      new ArrayList<Control>(),
                                      ByteString.empty(),
                                      SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false,
-                                     LDAPFilter.decode("(objectClass=*)"),
+                                     DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                     LDAPFilter.objectClassPresent(),
                                      new LinkedHashSet<String>(), null);
 
     SearchResultReference reference =
@@ -275,9 +266,8 @@
                                      new ArrayList<Control>(),
                                      ByteString.empty(),
                                      SearchScope.BASE_OBJECT,
-                                     DereferenceAliasesPolicy.NEVER, 0,
-                                     0, false,
-                                     LDAPFilter.decode("(objectClass=*)"),
+                                     DereferenceAliasesPolicy.NEVER, 0, 0, false,
+                                     LDAPFilter.objectClassPresent(),
                                      new LinkedHashSet<String>(),
                                      new TestInternalSearchListener());
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
index 65f044f..fffe578 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
@@ -482,10 +482,8 @@
     assertEquals(conn.hasPrivilege(Privilege.JMX_READ, null), hasPrivilege);
 
     ByteString dn = ByteString.valueOf("cn=config");
-    LDAPFilter filter = new LDAPFilter(SearchFilter
-        .createFilterFromString("(objectClass=*)"));
-    InternalSearchOperation searchOperation = conn.processSearch(dn,
-        SearchScope.BASE_OBJECT, filter);
+    LDAPFilter filter = LDAPFilter.objectClassPresent();
+    InternalSearchOperation searchOperation = conn.processSearch(dn, SearchScope.BASE_OBJECT, filter);
     if (hasPrivilege)
     {
       assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
@@ -1257,7 +1255,7 @@
                   conn.nextMessageID(), controls, targetDN,
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
+                  SearchFilter.objectClassPresent(), null,
                   null);
     searchOperation.run();
 
@@ -1464,7 +1462,7 @@
                   conn.nextMessageID(), controls, targetDN,
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
+                  SearchFilter.objectClassPresent(), null,
                   null);
     searchOperation.run();
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/LDAPv2TestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/LDAPv2TestCase.java
index aee5049..9f1dd46 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/LDAPv2TestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/LDAPv2TestCase.java
@@ -482,7 +482,7 @@
            new SearchRequestProtocolOp(ByteString.empty(),
                     SearchScope.BASE_OBJECT,
                     DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                    LDAPFilter.decode("(objectClass=*)"), null);
+                    LDAPFilter.objectClassPresent(), null);
       ArrayList<Control> controls = new ArrayList<Control>(1);
       controls.add(new LDAPControl(OID_MANAGE_DSAIT_CONTROL, true));
       message = new LDAPMessage(2, searchRequest, controls);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
index 68b3528..bd97c90 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
@@ -34,8 +34,8 @@
 import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
-import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
+import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.types.LDAPException;
 import org.testng.annotations.Test;
 
@@ -55,15 +55,10 @@
   private int sizeLimit = Integer.MAX_VALUE;
   private int timeLimit = Integer.MAX_VALUE;
   private boolean typesOnly = true;
-  private LDAPFilter filter;
+  private LDAPFilter filter = LDAPFilter.objectClassPresent();
   private LinkedHashSet<String> attributes = new LinkedHashSet<String>(
       Arrays.asList("description", "cn", "cn;optionA"));
 
-  public TestSearchProtocolOp() throws Exception
-  {
-    filter = LDAPFilter.decode("(objectClass=*)");
-  }
-
   /**
    * Create a test search request protocol op.
    * @return A test search request protocol op.
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
index fc36654..89213cf 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
@@ -266,7 +266,7 @@
     long startMillisecs = System.currentTimeMillis();
     do
     {
-      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT, "(objectclass=*)");
+      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = connection.processSearch(request);
       Entry resultEntry = searchOperation.getSearchEntries().getFirst();
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ProtocolWindowTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ProtocolWindowTest.java
index f1e0bd1..fca2db0 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ProtocolWindowTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ProtocolWindowTest.java
@@ -27,12 +27,13 @@
 package org.opends.server.replication;
 
 import java.net.SocketTimeoutException;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import java.util.List;
 import java.util.NoSuchElementException;
 
 import org.assertj.core.api.Assertions;
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
@@ -44,14 +45,18 @@
 import org.opends.server.replication.server.ReplServerFakeConfiguration;
 import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.replication.service.ReplicationBroker;
-import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+import org.opends.server.types.Operation;
+import org.opends.server.types.OperationType;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import static org.opends.server.TestCaseUtils.*;
 import static org.forgerock.opendj.ldap.SearchScope.*;
+import static org.opends.server.TestCaseUtils.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -195,7 +200,7 @@
 
   private int searchNbMonitorEntries(String filterString) throws Exception
   {
-    InternalSearchOperation op = connection.processSearch("cn=monitor", WHOLE_SUBTREE, filterString);
+    InternalSearchOperation op = connection.processSearch(newSearchRequest("cn=monitor", WHOLE_SUBTREE, filterString));
     assertEquals(op.getResultCode(), ResultCode.SUCCESS);
     return op.getEntriesSent();
   }
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java
index 89dc52a..31b8753 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java
@@ -458,7 +458,7 @@
       throws Exception
   {
     // Search for matching entries in config backend
-    InternalSearchOperation op = connection.processSearch("cn=config", WHOLE_SUBTREE, filter);
+    InternalSearchOperation op = connection.processSearch(newSearchRequest("cn=config", WHOLE_SUBTREE, filter));
     assertEquals(op.getResultCode(), ResultCode.SUCCESS, op.getErrorMessage() .toString());
 
     // Check that no entries have been found
@@ -517,7 +517,7 @@
     {
       if (count++>0)
         Thread.sleep(100);
-      op = connection.processSearch("cn=replication,cn=monitor", WHOLE_SUBTREE, monitorFilter);
+      op = connection.processSearch(newSearchRequest("cn=replication,cn=monitor", WHOLE_SUBTREE, monitorFilter));
     }
     while (op.getSearchEntries().isEmpty() && (count<100));
     assertFalse(op.getSearchEntries().isEmpty(), "Could not read monitoring information");
@@ -652,7 +652,7 @@
     long startMillisecs = System.currentTimeMillis();
     do
     {
-      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT, "(objectclass=*)");
+      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = connection.processSearch(request);
       if (searchOperation.getSearchEntries().isEmpty())
       {
@@ -748,7 +748,7 @@
     TaskState taskState = null;
     do
     {
-      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT, "(objectclass=*)");
+      final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT);
       InternalSearchOperation searchOperation = connection.processSearch(request);
       resultEntry = searchOperation.getSearchEntries().getFirst();
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java
index bfad9b2..1857e85 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tasks/TasksTestCase.java
@@ -39,7 +39,6 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
-import static org.opends.server.protocols.internal.Requests.*;
 import org.opends.server.types.AttributeParser;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
@@ -47,6 +46,7 @@
 
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -73,7 +73,7 @@
                  "Add of the task definition was not successful");
 
     // Wait until the task completes.
-    final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT, "(objectclass=*)");
+    final SearchRequest request = newSearchRequest(taskEntry.getName(), SearchScope.BASE_OBJECT);
     Entry resultEntry = null;
     String completionTime = null;
     long startMillisecs = System.currentTimeMillis();
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
index a93a4d7..c8347b9 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
@@ -67,6 +67,8 @@
 import org.opends.server.core.SchemaConfigManager;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
+import org.opends.server.protocols.internal.Requests;
+import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.BindRequestProtocolOp;
 import org.opends.server.protocols.ldap.BindResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -82,6 +84,7 @@
 
 import static org.forgerock.opendj.ldap.ResultCode.*;
 import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.internal.Requests.*;
 import static org.testng.Assert.*;
 
 /**
@@ -372,8 +375,8 @@
   {
     assertEquals(conn.hasPrivilege(Privilege.CONFIG_READ, null), hasPrivilege);
 
-    InternalSearchOperation searchOperation = conn.processSearch(
-        "cn=config", SearchScope.BASE_OBJECT, "(objectClass=*)");
+    SearchRequest request = Requests.newSearchRequest(DN.valueOf("cn=config"), SearchScope.BASE_OBJECT);
+    InternalSearchOperation searchOperation = conn.processSearch(request);
     assertPrivilege(searchOperation.getResultCode(), hasPrivilege);
   }
 
@@ -395,8 +398,8 @@
   {
     assertEquals(conn.hasPrivilege(Privilege.UNINDEXED_SEARCH, null), hasPrivilege);
 
-    InternalSearchOperation searchOperation = conn.processSearch(
-        "dc=unindexed,dc=jeb", SearchScope.WHOLE_SUBTREE, "(carLicense=test*)");
+    SearchRequest request = newSearchRequest("dc=unindexed,dc=jeb", SearchScope.WHOLE_SUBTREE, "(carLicense=test*)");
+    InternalSearchOperation searchOperation = conn.processSearch(request);
     assertPrivilege(searchOperation.getResultCode(), hasPrivilege);
   }
 
@@ -1287,7 +1290,7 @@
                   nextOperationID(), nextMessageID(), controls, targetDN,
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
+                  SearchFilter.objectClassPresent(), null,
                   null);
     searchOperation.run();
     assertProxyPrivilege(searchOperation.getResultCode(), hasProxyPrivilege);
@@ -1438,7 +1441,7 @@
                   nextMessageID(), controls, targetDN,
                   SearchScope.BASE_OBJECT,
                   DereferenceAliasesPolicy.NEVER, 0, 0, false,
-                  SearchFilter.createFilterFromString("(objectClass=*)"), null,
+                  SearchFilter.objectClassPresent(), null,
                   null);
     searchOperation.run();
     assertProxyPrivilege(searchOperation.getResultCode(), hasProxyPrivilege);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/VirtualAttributeRuleTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/VirtualAttributeRuleTestCase.java
index 6e2a69c..4db18ea 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/VirtualAttributeRuleTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/VirtualAttributeRuleTestCase.java
@@ -111,7 +111,7 @@
 
 
     LinkedHashSet<SearchFilter> filterSet1 = new LinkedHashSet<SearchFilter>(1);
-    filterSet1.add(SearchFilter.createFilterFromString("(objectClass=*)"));
+    filterSet1.add(SearchFilter.objectClassPresent());
 
     LinkedHashSet<SearchFilter> filterSet2 = new LinkedHashSet<SearchFilter>(1);
     filterSet2.add(SearchFilter.createFilterFromString("(o=test)"));

--
Gitblit v1.10.0