From fc73d78af5096c60e8c66fec481c4c4061e7a7d0 Mon Sep 17 00:00:00 2001
From: smaguin <smaguin@localhost>
Date: Thu, 19 Jun 2008 11:45:36 +0000
Subject: [PATCH] client used by single tests

---
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/build.ksh                    |   39 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Client.java                       |  324 ++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Server.java                          |   46 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Server.java                   |   46 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/secureUserpasswordModify.xml |  330 ++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/tasks/tasks.xml                                       |  223 +++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/run.ksh                           |   50 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Client.java                   |  498 +++++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.xml                         |  342 ++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Client.java                          |  488 +++++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Server.java                       |   47 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/build.ksh                         |   39 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.jar                         |    0 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Client.java              |  489 +++++++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/build.ksh                                |   39 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/run.ksh                      |   50 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Worker.java                       |  135 +
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Server.java              |   46 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Worker.java              |  165 ++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/run.ksh                                  |   50 
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Worker.java                   |  182 ++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Worker.java                          |  159 ++
 opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/secureModifyEntries.xml           |  340 ++++
 23 files changed, 4,127 insertions(+), 0 deletions(-)

diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/build.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/build.ksh
new file mode 100755
index 0000000..367e089
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/build.ksh
@@ -0,0 +1,39 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+export CLASSPATH=$CLASSPATH:.
+
+mkdir -p $COMPILDIR
+echo "Compiling classes..."
+javac src/*.java -d $COMPILDIR
+[ $? -ne 0 ] && return 1
+echo "Creating jarfile"
+cd $COMPILDIR
+jar cvf secureModifyEntries.jar *.class
+[ $? -ne 0 ] && return 1
+echo "Cleanup"
+rm -f *.class
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/run.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/run.ksh
new file mode 100644
index 0000000..95effcf
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/run.ksh
@@ -0,0 +1,50 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+suffix="dc=com"
+hostname=nott
+maxDuration=50
+nb_threads=1
+NB_MAX_mod=100
+keystorePath=/tmp/sylvie
+LDAPSport=1235
+
+bindDN="cn=directory manager"
+bindPW=password
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar Client $@
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore -Djava.security.debug=ALL -Djava.security.auth.debug=ALL -Djavax.net.debug=ALL -Djavax.security.sasl.level=FINEST Client $@
+
+## SSL
+java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp secureModifyEntries.jar -Djavax.net.ssl.keyStore=$keystorePath/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=$keystorePath/keystore  -Djavax.security.sasl.level=FINEST -Dport=$LDAPSport -DmaxDuration=$maxDuration -DNB_MAX_mod=$NB_MAX_mod -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname Client $@
+#
+
+
+## CLEAR
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore  -Djavax.security.sasl.level=FINEST -Dport=1111 -DmaxDuration=$maxDuration -DNB_MAX_mod=$NB_MAX_mod -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname -DbindDN="$bindDN" -DbindPW=$bindPW Client $@
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/secureModifyEntries.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/secureModifyEntries.xml
new file mode 100644
index 0000000..21cb5bc
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/secureModifyEntries.xml
@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="secureModifyEntries"/>
+
+  <!-- ************************************************************ -->
+  <function name="secureModifyEntries" scope="local">
+    
+    <function-map-args>
+      <function-arg-def name="workingDir" type="required"/>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Preamble   =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      
+  
+      <script>
+        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
+        
+        outFile = '%s/client_secureModifyEntries_id%s.txt' % \
+                  (client.getLogDir(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxOp = cParams[3][1]
+        except IndexError:
+          nbMaxOp = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        try:
+          protocol = cParams[5][1]
+        except IndexError:
+          protocol = NOT_DEFINED
+        try:
+          authentication = cParams[6][1]
+        except IndexError:
+          authentication = NOT_DEFINED
+        try:
+          certAlias = cParams[7][1]
+        except IndexError:
+          certAlias = NOT_DEFINED
+        try:
+          operation = cParams[8][1]
+        except IndexError:
+          operation = NOT_DEFINED
+        try:
+          delaySec = cParams[9][1]
+        except IndexError:
+          delaySec = NOT_DEFINED          
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 120
+          
+            # keystorePath
+            keystorePath = "%s/CERT_%s_%s/config" % (client.getLogDir(),client.getName(),client.getId())
+            
+            parms=[]
+            if (protocol == 'ssl'):
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPSPort()))
+            else:
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+                       
+            parms.append('-Dsuffix="%s"' % baseDn)
+            
+            parms.append('-Dnb_threads=%s -DNB_MAX_mod=%s -DmaxDuration=%s' % (nbCnx,nbMaxOp,duration))
+            parms.append('-Dprotocol="%s"' % protocol)
+            if attributeName != NOT_DEFINED:
+              parms.append('-DattributeName="%s"' % attributeName)
+            parms.append('-Dauthentication="%s"' % authentication)
+            
+            parms.append('-DbindDN="%s"' % DIRECTORY_INSTANCE_DN)
+            parms.append('-DbindPW="%s"' % DIRECTORY_INSTANCE_PSWD)
+                          
+            parms.append('-Doperation="%s"' % operation)
+            if delaySec != NOT_DEFINED:
+              parms.append('-DdelaySec="%s"' % delaySec) 
+            parms = ' '.join(parms)
+      </script>
+        
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+        
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir ]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ========== Run the client ========== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'run',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'Do ldapmodify on %s:%s' % \
+                        (serverInstance.getHost(),serverInstance.getLDAPSPort())
+          }
+          </call>
+       
+          <script>
+            cParam = '-client -Xmx1G -Xms1G'
+            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '%s -cp %s/secureModifyEntries.jar' % (cParam,compilDir)
+            cParam = '%s -Djavax.net.ssl.keyStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.net.ssl.trustStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.security.sasl.level=FINEST' % cParam
+            cParam = '%s -Djavax.net.ssl.trustStorePassword=password' % cParam
+            cParam = '%s -Djavax.net.ssl.keyStorePassword=password' % cParam
+            cParam = '%s %s Client' % (cParam,parms)
+            
+            titleName = '%s: run %s on %s' % \
+                        (client.getHost(),client.getName(),
+                         serverInstance.getName())
+          </script>
+         <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'DEBUG %s' % cParam
+          }
+          </call>
+          <process name="'%s' % titleName">
+            <location>client.getHost()</location>
+            <command>'%s/bin/java' % JAVA_HOME</command>
+            <parms>cParam </parms>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout>outFile</stdout>
+            <returnstdout/>
+          </process>
+          <!-- TBD : result should be STAXResult[0][1] : problem when
+                     javaexception, with carac " and < >-->
+          <call function="'checkRC'">
+            { 'returncode' : RC ,
+              'result'     : '',
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          <!-- ========== Postamble ========== -->
+          <call function="'writeMessage'">
+          {'content' : 'Output file %s' % outFile,
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+         
+          
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+         
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>   
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Client.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Client.java
new file mode 100644
index 0000000..dc3f4ad
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Client.java
@@ -0,0 +1,498 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+
+
+public class Client {
+    
+    
+    static int NB_MAX_mod=100;
+    static int nb_mod_started=0;
+    static int nb_mod_done=0;
+    static int total_nb_mod=0;
+    static int nb_threads=3;
+    static int nb_thread_ready=0;
+
+    static Random random;   
+    static String hostname ;
+    static int portnumber;
+    static String bindDN;
+    static String bindPW;
+    static String suffix;
+    static Server server;
+    static String authentication;
+    static String protocol;
+    static String operation;
+    static String attributeName;
+    static String time= new String ("0 sec.");
+    static long timeTostopTest=0;
+    static long maxDuration=0;
+    static long duration=0;
+    static long startup=0;
+    static ArrayList<String> DNList;
+    static long delayCnx=1000;
+    static long delaySec=1;
+  
+    
+    public Client()
+    {
+            
+        random= new Random();
+        DNList=new ArrayList<String>();
+
+        try {
+
+            /*
+             * bind as directory manager to get the full list of DN
+             * create a list of DN
+             */
+            Hashtable envLdap = set_properties_LDAP_simpleBind();
+            
+	    DirContext ctx = null;
+            ctx = new InitialDirContext(envLdap);
+
+	    // Search options
+	    String filter = "(objectclass=inetorgperson)";
+            String[] attrs = { "uid"};
+
+	    SearchControls constraints = new SearchControls();
+            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            constraints.setReturningAttributes(attrs);
+
+	    NamingEnumeration results = ctx.search(suffix, filter, constraints);
+	    Exception exc = null;
+	    int count = 0;
+
+	    try {
+		while (results != null && results.hasMore()) {
+                    SearchResult res = (SearchResult) results.next();
+                    DNList.add (res.getNameInNamespace());       
+                  
+		    count++;
+		}
+                
+                DNList.trimToSize();
+                if ( DNList.size() == 0) {
+                  println("ERROR", "No entry found in \"" + suffix + "\"");
+                  System.exit(1);
+                }
+	    } catch (Exception ex) {
+		exc = ex;
+	    }
+	    if ( exc != null ) {
+		throw exc;
+            }
+       	} catch (Exception e) {
+
+	    println ("INFO", "Failed to establish connection ");
+	    e.printStackTrace();
+	    System.exit(1);
+        }
+        
+        try {
+        
+
+	    // execute the threads
+            for (int i=0; i < nb_threads; i++ ) {
+                Worker w = new Worker(this, server);
+            }
+            println ("INFO", nb_threads + " threads connected to server " + server );
+            //println ("INFO", "Will search using filter \"(" + attr + " = <value> )\" (MAX =" + NB_MAX_mod + ")" );
+
+	    // Wait until all the threads have initialized their context 
+	    // and are ready to bind
+            try {
+                while ( nb_thread_ready() < nb_threads) {
+		    // wait
+		}
+		// All the threads are ready, wake up all the threads
+		synchronized(this) {
+		    nb_thread_ready=0;
+                    notifyAll();
+		}
+            }
+            catch ( Exception e1 ) {
+		System.out.println ("E1");
+		e1.printStackTrace();
+            }
+
+            int seconds=0;
+            // initialize startup
+            long t1=System.currentTimeMillis();
+            
+            // work until Max duration is reached
+            while (true) {
+
+                long new_t1=System.currentTimeMillis();
+
+		// end of the  system test. Exit
+                if ( ( timeTostopTest != 0 ) && ( new_t1 > timeTostopTest ) ) { 
+                  
+                    // inform all the threads it's the end
+                    synchronized (this) {
+			nb_mod_started=NB_MAX_mod;
+		    }
+                    break; 
+                }
+                
+		// status every delayCnx
+                if ( (new_t1 - t1) >= delayCnx) {
+
+                    println("INFO",  (nb_mod_done/delaySec) + "  mod/sec.");
+
+		    // inform all the threads the max nb searchs has been reached
+		    synchronized (this) {
+			nb_mod_started=NB_MAX_mod;
+		    }
+
+		    // Wait all the threads to close their cnx and sleep
+		    try {
+			total_nb_mod+=nb_mod_done;
+			while ( nb_thread_ready() < nb_threads) {
+			    // wait
+			}
+			// All the threads are ready, wake up all the threads
+			synchronized(this) {
+			    nb_thread_ready=0;
+			    nb_mod_started=0;
+			    nb_mod_done=0;
+
+			    notifyAll();
+			}
+		    } 
+		    catch ( Exception e1 ) {
+			System.out.println ("E1");
+			e1.printStackTrace();
+		    }
+
+                    if ( (seconds++) >= 9 ) {
+                        duration=((new_t1-startup)/1000);
+                        println("INFO",  "Avg rate: " + (total_nb_mod/duration) + " mod/sec. after " + getTime(duration));
+                        seconds=0;
+                    }
+                    t1=new_t1;
+                }
+            }
+            println ("INFO", "End of the client");
+            System.exit(0);
+        }
+        catch( Exception e ) {
+
+            e.printStackTrace();
+            System.exit(1);
+        }
+        
+        
+    }
+    
+
+/* =========================================
+ * MAIN
+ * ======================================= */
+
+    public static void main( String[] args )
+
+    {
+      
+        startup=System.currentTimeMillis();
+
+	// ===========================================
+        // Get the arguments specified for each option.
+	//
+
+	// Ldap port
+	String sport = System.getProperty("port"); 
+	portnumber = Integer.parseInt(sport);
+
+	// BaseDN
+	suffix = System.getProperty("suffix"); 
+	println ("INFO" , "suffix " + suffix);
+	
+	// nb_threads
+	String snb_threads = System.getProperty("nb_threads"); 
+	nb_threads = Integer.parseInt(snb_threads);
+	
+	println ("INFO" , "nb_threads " + snb_threads);
+	
+	// test duration
+	String sMaxDuration = System.getProperty("maxDuration"); 
+	maxDuration = Long.parseLong(sMaxDuration);
+	println ("INFO" , "maxDuration " + maxDuration);
+        
+	// credential for simple bind
+	bindDN = System.getProperty("bindDN"); 
+	bindPW = System.getProperty("bindPW"); 
+	println ("INFO" , "bindDN " + bindDN);
+	
+	// Max number of searchs
+	String sNB_MAX_mod = System.getProperty("NB_MAX_mod"); 
+	NB_MAX_mod = Integer.parseInt(sNB_MAX_mod);
+	println ("INFO" , "sNB_MAX_mod " + sNB_MAX_mod);
+	
+	// attribute to modify or add 
+	attributeName = System.getProperty("attributeName");
+	println ("INFO" , "attributeName " + attributeName);        
+
+        // operation to perform: modify or add 
+	operation = System.getProperty("operation");
+	println ("INFO" , "operation " + operation);        
+	// hostname
+	hostname = System.getProperty("hostname");
+
+	// protocol : SSL or TLS
+	protocol = System.getProperty("protocol");
+	println ("INFO" , "protocol " + protocol);        
+        
+        // authentication : EXTERNAL or simple
+	authentication = System.getProperty("authentication");
+	println ("INFO" , "authentication " + authentication);    
+   
+        // delay Sec  before closing conx
+        String sdelaySec = System.getProperty("delaySec"); 
+	delaySec =  Long.parseLong(sdelaySec);
+        delayCnx = delaySec * 1000;
+	println ("INFO" , "delayCnx " + delayCnx);
+        
+        if ( maxDuration != 0 ) {
+          maxDuration= maxDuration * 1000;
+        }
+        timeTostopTest=( startup + maxDuration);
+        println("INFO", "the test will finish at " + timeTostopTest );
+
+	// ===========================================
+	// Initialize the Server
+        server=new Server (hostname,portnumber);
+
+	System.out.println ("DEBUG declare server " + portnumber + " " + hostname);
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+		
+		public void run() {
+                }
+	    });        
+
+        Client c = new Client();
+    }
+
+/* =========================================
+ * Get Date
+ * ======================================= */
+   public static String getTime(long d) {
+	String time=new String (d + " sec.");
+	if ( d > 10000 ) {
+            time=new String ((d/3600) + " hours");
+	} else if ( d > 300 ) {
+            time=new String ((d/60) + " min.");
+	}
+        return time;
+   }
+
+/* =========================================
+ * return true if the number of NB_MAX_mod has been reached
+ * else, increase nb_mod_started
+ * ======================================= */
+
+   public boolean nb_mod_started_reached() {
+
+       synchronized (this) {
+	   if ( nb_mod_started>=NB_MAX_mod ) {
+	       return true;
+
+	   } else {
+	       nb_mod_started++;
+	       return false;
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * thread is waiting for a notify from the main thread
+ * ======================================= */
+
+   public void thread_go_to_sleep() {
+
+       synchronized (this) {
+	   try {
+               nb_thread_ready++;
+
+	       this.wait();
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * increase the number of mod started
+ * ======================================= */
+   public void inc_mod_started() {
+
+       synchronized (this) {
+	   if ( nb_mod_started>=NB_MAX_mod ) {
+	       try {
+		   this.wait();
+	       } catch ( Exception e ) {
+		   e.printStackTrace();
+	       }
+	       
+	   } else {
+	       nb_mod_started++;
+	   }
+       }
+    }       
+
+   
+
+/* =========================================
+ * increase the number of mod done
+ * ======================================= */
+   public void inc_mod_done() {
+      synchronized (this) {
+             try {
+               nb_mod_done++;
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+   }
+
+
+/* =========================================
+ * Configure the Properties depending of the selected authentication and protocol
+ * authentication : EXTERNAL or simple
+ * protocol ssl, tls or clear
+ * ======================================= */
+    public static Hashtable set_properties_LDAP() {
+      
+      String provider ;
+      
+      Hashtable envLdap = new Hashtable();
+      envLdap.put("java.naming.factory.initial",
+       "com.sun.jndi.ldap.LdapCtxFactory");
+      
+      envLdap.put(Context.SECURITY_AUTHENTICATION, authentication);
+      
+      if ( protocol.equals("ssl")) {
+        provider = "ldaps://"+server.host+":"+server.port+"/";
+        envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+        
+      } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+      }
+       envLdap.put(Context.PROVIDER_URL, provider);
+
+       return envLdap;
+    }
+    
+
+/* =========================================
+ * Configure the Properties for a simple Bind
+ * bind as directory manager
+ * use the selected protocol : ssl, tls or clear
+ * ======================================= */
+
+   public static Hashtable set_properties_LDAP_simpleBind() {
+     
+     String provider ;
+     
+     Hashtable envLdap = new Hashtable();
+     envLdap.put("java.naming.factory.initial",
+      "com.sun.jndi.ldap.LdapCtxFactory");
+     
+     envLdap.put(Context.SECURITY_AUTHENTICATION, "simple");
+     
+     envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+     envLdap.put(Context.SECURITY_CREDENTIALS, bindPW);
+     
+     if ( protocol.equals("ssl")) {
+       provider = "ldaps://"+server.host+":"+server.port+"/";
+       envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+       
+     } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+     }
+    
+     envLdap.put(Context.PROVIDER_URL, provider);
+     return envLdap;
+   }
+   
+/* =========================================
+ * Get Date
+ * ======================================= */
+    public static String getDate() {
+    
+        // Initialize the today's date string
+        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+        java.text.SimpleDateFormat sdf = 
+            new java.text.SimpleDateFormat(DATE_FORMAT);
+        Calendar c1 = Calendar.getInstance(); // today
+        return("[" + sdf.format(c1.getTime()) + "]");
+   }
+  
+
+/* =========================================
+ * Print
+ * ======================================= */
+   public static void println(String level, String msg) {
+        System.out.println (getDate() + " - " + level + ": " + msg );
+   }
+
+
+/* =========================================
+ * increase the number of threads ready
+ * ======================================= */
+    public void inc_thread_ready() {
+	synchronized (this) {
+            nb_thread_ready++;
+
+            try {
+            this.wait();
+            } catch (Exception e) {
+		e.printStackTrace();
+            }
+	}
+
+    }
+
+
+/* =========================================
+ * return the number of threads ready
+ * ======================================= */
+    public static int nb_thread_ready() {
+	return nb_thread_ready;
+    }
+}
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Server.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Server.java
new file mode 100644
index 0000000..dbf2405
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Server.java
@@ -0,0 +1,46 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+import java.util.*;
+
+
+public class Server {
+    public String host;
+    public int port;
+    
+    public Server (String host, int port) {
+        this.host=host;
+        this.port=port;
+    }
+    
+    public Server (String hostPort) {
+        StringTokenizer st = new StringTokenizer(hostPort, ":");
+        this.host=st.nextToken();
+        this.port=Integer.parseInt(st.nextToken());
+    }
+    
+    public String toString() {
+        return (host + ":" + port);
+    }
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Worker.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Worker.java
new file mode 100644
index 0000000..64613d3
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureModifyEntries/src/Worker.java
@@ -0,0 +1,182 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.DirContext;
+import javax.naming.Context;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.BasicAttributes;
+
+
+public class Worker extends Thread {
+  
+  Server server;
+  Client client;
+  long myId = this.getId();
+  
+  /**
+   ** Constructor for Worker  thread
+   **/
+  public Worker(Client client2, Server server2) {
+    
+    super();
+    try {
+      
+      server = server2;
+      client = client2;
+      start();
+      
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+  
+  /**
+   * Connect to the server
+   * wait a notify from the main thread to startthe modify operations
+   **/
+  public void run() {
+    
+    String value="";
+    String DNtoModify;
+    String attrVal1;
+    ArrayList<String> mailEXT_values= new ArrayList<String>();
+    Random random_cpt= new Random();
+
+    try {
+      /* Define the list of values for mailEXT attribute */
+      mailEXT_values.add("group1");
+      mailEXT_values.add("group2");
+      mailEXT_values.add("group3");
+      
+      DirContext ctx = null;
+      
+      // Set the properties 
+     Hashtable envLdap = client.set_properties_LDAP();
+
+      println("INFO","THREAD " + myId + " is waiting ");      
+      // Waiting a notify from the main thread
+      client.inc_thread_ready();
+      
+      
+      /*
+       * Start modify operations
+       */
+      String[] attrIds = { (String)client.attributeName };
+      while (true) {
+        
+        // no sasl authentication
+        // use a random DN to bind
+        if ( client.authentication.equals("simple")) {
+          
+           String bindDN=(String) client.DNList.get(client.random.nextInt(client.DNList.size()));
+           String bindPW="userpassword";
+           envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+           envLdap.put(Context.SECURITY_CREDENTIALS, bindPW); 
+           //println("INFO","THREAD " + myId + "BIND as " + bindDN);
+        }
+        // bind
+        ctx = new InitialDirContext(envLdap);
+
+        while (true) {
+          try {
+            
+            //String value=String.valueOf(client.random.nextInt(10000));
+            DNtoModify=(String) client.DNList.get(client.random.nextInt(client.DNList.size()));
+            
+            // If attributeName to modify is mailEXT, we get the new value from the list
+            // group1, group2, group2
+            // this list is the list used to define the dynamic groups
+           
+            if (client.attributeName.equals("mailEXT")) {
+              attrVal1 = (String) mailEXT_values.get(random_cpt.nextInt(3));
+            } else {
+             
+              String value_cpt=String.valueOf(random_cpt.nextInt(10000));
+              long cur_date=System.currentTimeMillis();
+              String scur_date = String.valueOf(cur_date);
+              attrVal1 = "new description"+scur_date+"-"+value_cpt;
+            }
+
+            Attributes attrs = new BasicAttributes(attrIds[0], attrVal1, true);
+            
+            // if the Max_nb_mod is reached, counters are initialized
+            // disconnect cnx
+            // Wait the main to wake up
+            if ( client.nb_mod_started_reached() == false) {
+              
+              if (client.operation.equals("modify")) {
+                 ctx.modifyAttributes(DNtoModify, DirContext.REPLACE_ATTRIBUTE, attrs);
+              } else  {
+                ctx.modifyAttributes(DNtoModify, DirContext.ADD_ATTRIBUTE, attrs);
+              }
+            
+              client.inc_mod_done();
+            } else {
+              ctx.close();
+              client.thread_go_to_sleep();
+              break;
+            }
+          } catch (Exception ex) {
+            
+            println("INFO","THREAD " + myId + " CATCH " + ex);
+
+          }
+          // update the total number of searchs
+          client.inc_mod_done();
+        }
+      }
+    } catch (Exception e) {
+      
+      println("INFO", "Failed: expected error code 3 ");
+      
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+  
+  private String getDate() {
+    
+    // Initialize the today's date string
+    String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+    java.text.SimpleDateFormat sdf =
+     new java.text.SimpleDateFormat(DATE_FORMAT);
+    Calendar c1 = Calendar.getInstance(); // today
+    return("[" + sdf.format(c1.getTime()) + "]");
+  }
+  
+  private void println(String level, String msg) {
+    System.out.println(getDate() + " - " + level + ": (" + server + ") " + msg );
+  }
+  
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/build.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/build.ksh
new file mode 100755
index 0000000..2eef307
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/build.ksh
@@ -0,0 +1,39 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+export CLASSPATH=$CLASSPATH:.
+
+mkdir -p $COMPILDIR
+echo "Compiling classes..."
+javac src/*.java -d $COMPILDIR
+[ $? -ne 0 ] && return 1
+echo "Creating jarfile"
+cd $COMPILDIR
+jar cvf secureSearch.jar *.class
+[ $? -ne 0 ] && return 1
+echo "Cleanup"
+rm -f *.class
\ No newline at end of file
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/run.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/run.ksh
new file mode 100755
index 0000000..3fb7502
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/run.ksh
@@ -0,0 +1,50 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+suffix="dc=com"
+hostname=nott
+maxDuration=50
+nb_threads=10
+NB_MAX_srchs=100
+keystorePath=/tmp/sylvie
+LDAPSport=1235
+
+bindDN="cn=directory manager"
+bindPW=password
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar Client $@
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore -Djava.security.debug=ALL -Djava.security.auth.debug=ALL -Djavax.net.debug=ALL -Djavax.security.sasl.level=FINEST Client $@
+
+## SSL
+java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp secureSearch.jar -Djavax.net.ssl.keyStore=$keystorePath/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=$keystorePath/keystore  -Djavax.security.sasl.level=FINEST -Dport=$LDAPSport -DmaxDuration=$maxDuration -DNB_MAX_srchs=$NB_MAX_srchs -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname Client $@
+#
+
+
+## CLEAR
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore  -Djavax.security.sasl.level=FINEST -Dport=1111 -DmaxDuration=$maxDuration -DNB_MAX_srchs=$NB_MAX_srchs -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname -DbindDN="$bindDN" -DbindPW=$bindPW Client $@
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.jar b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.jar
new file mode 100644
index 0000000..1cefe66
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.jar
Binary files differ
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.xml
new file mode 100644
index 0000000..c839d23
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/secureSearch.xml
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="secureSearch"/>
+
+
+
+  <!-- ************************************************************ -->
+  <function name="secureSearch" scope="local">
+    <function-map-args>
+      <function-arg-def name="workingDir" type="required"/>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Preamble   =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      
+      <script>
+        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
+        
+        outFile = '%s/client_secureSearch_id%s.txt' % \
+                  (client.getLogDir(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxOp = cParams[3][1]
+        except IndexError:
+          nbMaxOp = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        try:
+          protocol = cParams[5][1]
+        except IndexError:
+          protocol = NOT_DEFINED
+        try:
+          authentication = cParams[6][1]
+        except IndexError:
+          authentication = NOT_DEFINED
+        try:
+          certAlias = cParams[7][1]
+        except IndexError:
+          certAlias = NOT_DEFINED
+        try:
+          delaySec = cParams[8][1]
+        except IndexError:
+          delaySec = NOT_DEFINED          
+          
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 60
+          
+            # keystorePath
+            keystorePath = "%s/CERT_%s_%s/config" % (client.getLogDir(),client.getName(),client.getId())
+            
+            parms=[]
+            if (protocol == 'ssl'):
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPSPort()))
+            else:
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+            
+            parms.append('-Dsuffix="%s"' % baseDn)
+        
+            parms.append('-Dnb_threads=%s -DNB_MAX_srchs=%s -DmaxDuration=%s' % (nbCnx,nbMaxOp,duration))
+
+            parms.append('-Dprotocol="%s"' % protocol)
+            if attributeName != NOT_DEFINED:
+              parms.append('-DattributeName="%s"' % attributeName)
+            parms.append('-Dauthentication="%s"' % authentication)
+            
+
+            parms.append('-DbindDN="%s"' % DIRECTORY_INSTANCE_DN)
+            parms.append('-DbindPW="%s"' % DIRECTORY_INSTANCE_PSWD)
+            
+            if delaySec != NOT_DEFINED:
+              parms.append('-DdelaySec="%s"' % delaySec)             
+            parms = ' '.join(parms)
+      </script>
+     
+        <call function="'writeMessage'">
+          {'content' : 'DEBUG params %s' % parms ,
+           'fileFd'  : fileFd}
+          </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+        
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir ]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ========== Run the client ========== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'run',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'Do ldapsearchs on %s:%s' % \
+                        (serverInstance.getHost(),serverInstance.getLDAPSPort())
+          }
+          </call>
+       
+          <script>
+            cParam = '-client -Xmx1G -Xms1G'
+            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '%s -cp %s/secureSearch.jar' % (cParam,compilDir)
+            cParam = '%s -Djavax.net.ssl.keyStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.net.ssl.trustStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.security.sasl.level=FINEST' % cParam
+            cParam = '%s -Djavax.net.ssl.trustStorePassword=password' % cParam
+            cParam = '%s -Djavax.net.ssl.keyStorePassword=password' % cParam
+            cParam = '%s %s Client' % (cParam,parms)
+            
+            titleName = '%s: run %s on %s' % \
+                        (client.getHost(),client.getName(),
+                         serverInstance.getName())
+          </script>
+         <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'DEBUG %s' % cParam
+          }
+          </call>
+          <process name="'%s' % titleName">
+            <location>client.getHost()</location>
+            <command>'%s/bin/java' % JAVA_HOME</command>
+            <parms>cParam </parms>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout>outFile</stdout>
+            <returnstdout/>
+          </process>
+          <!-- java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp secureSearch.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore  -Djavax.security.sasl.level=FINEST -Dport=1636 -DmaxDuration=$maxDuration -DNB_MAX_srchs=$NB_MAX_srchs -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname Client $@
+-->
+          <!-- TBD : result should be STAXResult[0][1] : problem when
+                     javaexception, with carac " and < >-->
+          <call function="'checkRC'">
+            { 'returncode' : RC ,
+              'result'     : '',
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          <!-- ========== Postamble ========== -->
+          <call function="'writeMessage'">
+          {'content' : 'Output file %s' % outFile,
+           'fileFd'  : fileFd}
+          </call>
+          
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+          
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+  
+  
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Client.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Client.java
new file mode 100644
index 0000000..50162e6
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Client.java
@@ -0,0 +1,488 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+
+public class Client {
+    
+    static int NB_MAX_srchs=100;
+    static int nb_srchs_started=0;
+    static int nb_srchs_done=0;
+    static int total_nb_srchs=0;
+    static int nb_threads=3;
+    static int nb_thread_ready=0;
+
+    static Random random;   
+    static String hostname ;
+    static int portnumber;
+    static String bindDN;
+    static String bindPW;
+    static String suffix;
+    static Server server;
+    static String authentication;
+    static String protocol;   
+    static String attributeName;
+    static String time= new String ("0 sec.");;
+    static long duration=0;
+    static long maxDuration=0;
+    static long startup=0;
+    static long  timeTostopTest=0;
+    static ArrayList<String> DNList;
+    static ArrayList<String> uidList;
+    static long delayCnx=1000;
+    static long delaySec=1;    
+    
+    public Client()
+    {
+        random= new Random();
+        DNList=new ArrayList<String>();
+	uidList=new ArrayList<String>();
+        
+        try {
+
+            Hashtable envLdap = set_properties_LDAP_simpleBind();
+            
+	    DirContext ctx = null;
+            ctx = new InitialDirContext(envLdap);
+
+	    // Search options
+	    String filter = "(objectclass=inetorgperson)";
+            String[] attrs = { "uid"};
+
+	    SearchControls constraints = new SearchControls();
+            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            constraints.setReturningAttributes(attrs);
+
+	    NamingEnumeration results = ctx.search(suffix, filter, constraints);
+	    Exception exc = null;
+	    int count = 0;
+
+	    try {
+		while (results != null && results.hasMore()) {
+                    SearchResult res = (SearchResult) results.next();
+                    DNList.add (res.getNameInNamespace()); 
+
+                    Attributes uidAttrs = res.getAttributes();
+                    uidList.add ((String) uidAttrs.get("uid").get());
+
+		    count++;
+		}
+                
+                DNList.trimToSize();
+                if ( DNList.size() == 0) {
+                  println("ERROR", "No entry found in \"" + suffix + "\"");
+                  System.exit(1);
+                }
+	    } catch (Exception ex) {
+		exc = ex;
+	    }
+	    if ( exc != null ) {
+		throw exc;
+            }
+            ctx.close();
+       	} catch (Exception e) {
+        
+	    println ("INFO", "Failed: expected error code 3 ");
+	    e.printStackTrace();
+	    System.exit(1);
+        }
+       
+        
+        try {
+           
+	    // execute the threads
+            for (int i=0; i < nb_threads; i++ ) {
+                Worker w = new Worker(this, server);
+            }
+            println ("INFO", nb_threads + " threads connected to server " + server );
+        
+	    // Wait until all the threads have initialized their context 
+	    // and are ready to bind
+            try {
+                while ( nb_thread_ready() < nb_threads) {
+		    // wait
+		}
+		// All the threads are ready, wake up all the threads
+		synchronized(this) {
+		    nb_thread_ready=0;
+                    notifyAll();
+		}
+            }
+            catch ( Exception e1 ) {
+		System.out.println ("E1");
+		e1.printStackTrace();
+            }
+
+            int seconds=0;
+            long t1=System.currentTimeMillis();
+
+	    // work until Max duration is reached
+            while (true) {
+
+                long new_t1=System.currentTimeMillis();
+
+		// end of the  system test. Exit
+                if ( ( timeTostopTest != 0 ) && ( new_t1 > timeTostopTest ) ) { 
+                  
+                    // inform all the threads it's the end
+                    synchronized (this) {
+			nb_srchs_started=NB_MAX_srchs;
+		    }
+                  break; 
+                }
+               
+		// status every second
+                if ( (new_t1 - t1) >= delayCnx ) {
+                 
+                    println("INFO",  (nb_srchs_done/delaySec) + "  srch/sec.");                 
+              
+		    // inform all the threads the max nb searchs has been reached
+		    synchronized (this) {
+			nb_srchs_started=NB_MAX_srchs;
+		    }
+
+		    // Wait all the threads to close their cnx and sleep
+		    try {
+			total_nb_srchs+=nb_srchs_done;
+			while ( nb_thread_ready() < nb_threads) {
+			    // wait
+			}
+			// All the threads are ready, wake up all the threads
+			synchronized(this) {
+			    nb_thread_ready=0;
+			    nb_srchs_started=0;
+			    nb_srchs_done=0;
+
+			    notifyAll();
+			}
+		    }
+		    catch ( Exception e1 ) {
+			System.out.println ("E1");
+			e1.printStackTrace();
+		    }
+
+                    if ( (seconds++) >= 9 ) {
+                        duration=((new_t1-startup)/1000);
+                        println("INFO",  "Avg rate: " + (total_nb_srchs/duration) + " srchs/sec. after " + getTime(duration));
+                        seconds=0;
+                    }
+                    t1=new_t1;
+                }
+            }
+            System.exit(0);
+        }
+        catch( Exception e ) {
+
+            e.printStackTrace();
+            System.exit(1);
+        }
+        
+        
+    }
+    
+ 
+    
+    
+/* =========================================
+ * MAIN
+ * ======================================= */  
+    
+    public static void main( String[] args )
+    {
+      
+        startup=System.currentTimeMillis();
+      
+	// ===========================================
+        // Get the arguments specified for each option.
+	//
+
+	// Ldap port
+	String sport = System.getProperty("port"); 
+	portnumber = Integer.parseInt(sport);
+
+
+	// BaseDN
+	suffix = System.getProperty("suffix"); 
+	println ("INFO" , "suffix " + suffix);
+	
+	// nb_threads
+	String snb_threads = System.getProperty("nb_threads"); 
+	nb_threads = Integer.parseInt(snb_threads);
+	
+	println ("INFO" , "nb_threads " + snb_threads);
+	
+	// test duration
+	String sMaxDuration = System.getProperty("maxDuration"); 
+	maxDuration = Long.parseLong(sMaxDuration);
+	println ("INFO" , "maxDuration " + maxDuration);
+        
+	// credential for simple bind
+	bindDN = System.getProperty("bindDN"); 
+	bindPW = System.getProperty("bindPW"); 
+	println ("INFO" , "bindDN " + bindDN);
+	
+	// attribute to search 
+	attributeName = System.getProperty("attributeName");
+	println ("INFO" , "attributeName " + attributeName);        
+        
+	// Max number of searchs
+	String sNB_MAX_srchs = System.getProperty("NB_MAX_srchs"); 
+	NB_MAX_srchs = Integer.parseInt(sNB_MAX_srchs);
+	println ("INFO" , "sNB_MAX_srchs " + sNB_MAX_srchs);
+	
+	// hostname
+	hostname = System.getProperty("hostname");
+
+
+	// protocol : SSL or TLS
+	protocol = System.getProperty("protocol");
+	println ("INFO" , "protocol " + protocol);        
+        
+        // authentication : EXTERNAL or simple
+	authentication = System.getProperty("authentication");
+	println ("INFO" , "authentication " + authentication);    
+
+        // delay Sec  before closing conx
+        String sdelaySec = System.getProperty("delaySec"); 
+	delaySec =  Long.parseLong(sdelaySec);
+        delayCnx = delaySec * 1000;
+	println ("INFO" , "delayCnx " + delayCnx);
+        
+
+        if ( maxDuration != 0 ) {
+          maxDuration= maxDuration * 1000;
+        }
+        timeTostopTest=( startup + maxDuration);
+        println("INFO", "END of the test : " + timeTostopTest );
+        
+        
+	// ===========================================
+	// Initialize the Server
+        server=new Server (hostname,portnumber);
+
+	System.out.println ("DEBUG declare server " + portnumber + " " + hostname);
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+		
+		public void run() {
+                }
+	    });        
+
+        Client c = new Client();
+    }
+
+
+/* =========================================
+ * return true if the number of NB_MAX_srchs has been reached
+ * else, increase nb_srchs_started
+ * ======================================= */
+
+   public boolean nb_srchs_started_reached() {
+
+       synchronized (this) {
+	   if ( nb_srchs_started>=NB_MAX_srchs ) {
+	       return true;
+
+	   } else {
+	       nb_srchs_started++;
+	       return false;
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * thread is waiting for a notify from the main thread
+ * ======================================= */    
+   public void thread_go_to_sleep() {
+
+       synchronized (this) {
+	   try {
+               nb_thread_ready++;
+
+	       this.wait();
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * increase the number of srchs started
+ * ======================================= */    
+   public void inc_srchs_started() {
+
+       synchronized (this) {
+	   if ( nb_srchs_started>=NB_MAX_srchs ) {
+	       try {
+		   this.wait();
+	       } catch ( Exception e ) {
+		   e.printStackTrace();
+	       }
+	       
+	   } else {
+	       nb_srchs_started++;
+	   }
+       }
+    }       
+
+/* =========================================
+ * increase the number of srchs done
+ * ======================================= */ 
+   public void inc_srchs_done() {
+      synchronized (this) {
+             try {
+               nb_srchs_done++;
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+   }
+
+/* =========================================
+ * Configure the Properties depending of the selected authentication and protocol
+ * authentication : EXTERNAL or simple
+ * protocol ssl, tls or clear
+ * ======================================= */    
+
+   public static Hashtable set_properties_LDAP() {
+     
+     String provider ;
+     
+     Hashtable envLdap = new Hashtable();
+     envLdap.put("java.naming.factory.initial",
+      "com.sun.jndi.ldap.LdapCtxFactory");
+     
+     envLdap.put(Context.SECURITY_AUTHENTICATION, authentication);
+     
+     if ( protocol.equals("ssl")) {
+       provider = "ldaps://"+server.host+":"+server.port+"/";
+       envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+       
+     } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+     }
+    
+     envLdap.put(Context.PROVIDER_URL, provider);
+     return envLdap;
+   }
+
+   
+/* =========================================
+ * Configure the Properties for a simple Bind
+ * bind as directory manager
+ * use the selected protocol : ssl, tls or clear
+ * ======================================= */
+   public static Hashtable set_properties_LDAP_simpleBind() {
+     
+     String provider ;
+     
+      Hashtable envLdap = new Hashtable();
+     envLdap.put("java.naming.factory.initial",
+      "com.sun.jndi.ldap.LdapCtxFactory");
+     
+     envLdap.put(Context.SECURITY_AUTHENTICATION, "simple");
+     
+     envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+     envLdap.put(Context.SECURITY_CREDENTIALS, bindPW);
+     
+     if ( protocol.equals("ssl")) {
+       provider = "ldaps://"+server.host+":"+server.port+"/";
+       envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+       
+     } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+     }
+    
+     envLdap.put(Context.PROVIDER_URL, provider);
+     return envLdap;
+   }
+   
+/* =========================================
+ * Get Date
+ * ======================================= */
+    public static String getDate() {
+    
+        // Initialize the today's date string
+        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+        java.text.SimpleDateFormat sdf = 
+            new java.text.SimpleDateFormat(DATE_FORMAT);
+        Calendar c1 = Calendar.getInstance(); // today
+        return("[" + sdf.format(c1.getTime()) + "]");
+   }
+   
+/* =========================================
+ *  print 
+ * ======================================= */    
+   public static void println(String level, String msg) {
+        System.out.println (getDate() + " - " + level + ": " + msg );
+   }
+
+/* =========================================
+ * increase the number of threads ready
+ * ======================================= */
+    public void inc_thread_ready() {
+	synchronized (this) {
+            nb_thread_ready++;
+
+            try {
+            this.wait();
+            } catch (Exception e) {
+		e.printStackTrace();
+            }
+	}
+
+    }
+/* =========================================
+ * return the number of threads ready
+ * ======================================= */    
+    public static int nb_thread_ready() {
+      
+      return nb_thread_ready;
+      
+    }
+
+/* =========================================
+ * getTime
+ * ======================================= */    
+  public static String getTime(long d) {
+        String time=new String (d + " sec.");
+        if ( d > 10000 ) {
+            time=new String ((d/3600) + " hours");
+        } else if ( d > 300 ) {
+            time=new String ((d/60) + " min.");
+        }
+        return time;
+    }
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Client.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Client.java
new file mode 100644
index 0000000..74db2b9
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Client.java
@@ -0,0 +1,324 @@
+package system-tests.scenario.single.clients.secureSearch.src.OK-tests.scenario.single.clients.searchLoad.src.OK;
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+//import netscape.ldap.*;
+//import netscape.ldap.util.*;
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+import	 javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import	javax.naming.directory.DirContext;
+
+
+public class Client {
+    
+    
+//    static String dn="cn=Directory Manager";
+//    static String password="secret12";
+    static int NB_MAX_srchs=100;
+    static Object lock;
+    static int nb_srchs_started=0;
+    static int nb_srchs_done=0;
+    static int total_nb_srchs=0;
+    static int nb_threads=3;
+    public ArrayList<String> ValueList;
+    // String dn="cn=admin,dc=com";
+//    String dn="cn=Directory Manager";
+//    String password="secret12";
+    Random random;   
+    static String attr="cn";
+    public String attribute;
+    
+    static String hostname ;
+    static int portnumber;
+    static String bindDN;
+    static String bindPW;
+    static String suffix;
+    static Server server;
+    static String time= new String ("0 sec.");;
+    static long duration=0;
+    static long maxDuration=0;
+    static long startup=System.currentTimeMillis();
+
+    public Client()
+    {
+            
+        attribute=attr;
+        random= new Random();
+        lock = new Object();
+        
+        ValueList=new ArrayList<String>();
+        // println("INFO", "Getting DN from file " + DNFileName);
+        try {
+            println ("INFO", "Get the DNs on suffix \"" + suffix + "\" from server " + server );
+
+
+	    String provider = "ldaps://nott:1636/";
+	    DirContext ctx = null;
+	    
+	    Properties envLdap = System.getProperties();
+	    envLdap.put("java.naming.factory.initial",
+				"com.sun.jndi.ldap.LdapCtxFactory");
+
+	    envLdap.put(Context.PROVIDER_URL, provider);	
+	    envLdap.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");
+	    envLdap.put(Context.SECURITY_PROTOCOL, "ssl");
+
+            ctx = new InitialDirContext(envLdap);
+            
+	    String filter = "(objectclass=*)";
+
+	    SearchControls constraints = new SearchControls();
+
+	    NamingEnumeration results = ctx.search("dc=com", filter, constraints);
+	    Exception exc = null;
+	    int count = 0;
+
+	    try {
+		while (results != null && results.hasMore()) {
+		    results.next();
+		    println ("INFO " ," res " + results.toString());
+		    count++;
+		}
+	    } catch (Exception ex) {
+		exc = ex;
+	    }
+	    if ( exc != null ) {
+		throw exc;
+	    }
+
+       	} catch (Exception e) {
+
+	    println ("INFO", "Failed: expected error code 3 ");
+	    
+	    
+	    e.printStackTrace();
+	    System.exit(1);
+        }
+       
+        
+        try {
+            // reinitialize startup
+            startup=System.currentTimeMillis();
+            long t1=System.currentTimeMillis();
+            
+            if ( maxDuration != 0 ) {
+                maxDuration= t1 + maxDuration * 1000;
+            }            
+            for (int i=0; i < nb_threads; i++ ) {
+                Worker w = new Worker(this, server);
+            }
+            println ("INFO", nb_threads + " threads connected to server " + server );
+            println ("INFO", "Will search using filter \"(" + attr + " = <value> )\" (MAX =" + NB_MAX_srchs + ")" );
+            synchronized (lock) {    
+                lock.notifyAll();
+            }
+            int seconds=0;
+            while (true) {
+                    
+                long new_t1=System.currentTimeMillis();
+                
+                if ( ( maxDuration != 0 ) && ( new_t1 > maxDuration ) ) { break; }
+                
+                if ( (new_t1 - t1) >= 1000 ) {
+                    
+                    
+                    println("INFO",  nb_srchs_done + " srchs/sec."); // (time = "+(new_t1-t1) + "ms)");
+                    println("DEBUG",  nb_srchs_started + " srchs/sec started"); 
+                    
+                    total_nb_srchs+=nb_srchs_done;
+                    nb_srchs_started=0;
+                    nb_srchs_done=0;
+                    synchronized (lock) {    
+                        lock.notifyAll();
+                    } 
+                    
+                    if ( (seconds++) >= 9 ) {
+                        
+                        duration=((new_t1-startup)/1000);
+                        
+                        println("INFO",  "Avg rate: " + (total_nb_srchs/duration) + " srchs/sec. after " + getTime(duration));
+                        seconds=0;
+                    }
+                    t1=new_t1;
+                    
+                }
+            }
+            
+            System.exit(0);
+            
+        }
+        catch( Exception e ) {
+
+            e.printStackTrace();
+            System.exit(1);
+        }
+        
+        
+    }
+    
+    public static String getTime(long d) {
+        String time=new String (d + " sec.");
+        if ( d > 10000 ) {
+            time=new String ((d/3600) + " hours");
+        } else if ( d > 300 ) {
+            time=new String ((d/60) + " min.");
+        }
+        return time;
+    }
+    
+    public static void main( String[] args )
+
+    {
+        String usage = "Usage: java Main [-h <host>] [-p <port>]  -b <base_dn> "
+                        + "[-D <bindDN> ] [-w <bindPW> ] [-t <nb_threads>] [-M <nb_max_srchs>] [-a <attribute>] [-d duration (seconds)]";
+	//        int portnumber = LDAPv2.DEFAULT_PORT;
+
+
+        // Check for these options. -H means to print out a usage message.
+	//   GetOpt options = new GetOpt( "h:p:b:d:D:w:H:t:M:a:", args );
+        // Get the arguments specified for each option.
+
+	 String port = System.getProperty("port"); 
+
+	 suffix = System.getProperty("suffix"); 
+	 println ("INFO" , "suffix " + suffix);
+
+	 String snb_threads = System.getProperty("nb_threads"); 
+	 nb_threads = Integer.parseInt(snb_threads);
+
+	 println ("INFO" , "nb_threads " + snb_threads);
+
+
+	 String sMaxDuration = System.getProperty("maxDuration"); 
+	 maxDuration = Long.parseLong(sMaxDuration);
+	 println ("INFO" , "maxDuration " + maxDuration);
+
+	 bindDN = System.getProperty("bindDN"); 
+	 bindPW = System.getProperty("bindPW"); 
+
+	 String sNB_MAX_srchs = System.getProperty("NB_MAX_srchs"); 
+	 NB_MAX_srchs = Integer.parseInt(sNB_MAX_srchs);
+	 println ("INFO" , "sNB_MAX_srchs " + sNB_MAX_srchs);
+
+	 hostname = System.getProperty("hostname"); 
+
+
+        if ( hostname == null ) hostname="localhost";
+        // If a port number was specified, convert the port value
+        //  to an integer.
+        if ( port != null ) {
+            try {
+                portnumber = java.lang.Integer.parseInt( port );
+            } catch ( java.lang.Exception e ) {
+                System.out.println( "Invalid port number: " + port );
+                System.out.println( usage );
+                System.exit( 1 );
+            }
+        }
+        else {
+            portnumber=1389;
+        }
+
+        server=new Server (hostname,portnumber);
+	System.out.println ("DEBUG declare server " + portnumber + " " + hostname);
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+		
+		public void run() {
+		    duration=((System.currentTimeMillis()-startup)/1000);
+		    if ( duration != 0 ) 
+			println("INFO", "TOTAL: " + total_nb_srchs + " srchs (Avg rate: " + (total_nb_srchs/duration) + " srchs/sec.) after " + getTime(duration));
+		}
+	    });
+        
+	System.out.println ("DEBUG declare client ");
+        Client c = new Client();
+	System.out.println ("DEBUG FIN client ");
+    }
+
+
+   public static void inc_srchs_started() {
+        check_srchs_started();
+        nb_srchs_started++;
+   }
+
+   
+   public static void inc_srchs_done() {
+        nb_srchs_done++;
+   }
+   
+   public static void check_srchs_started() {
+        if ( nb_srchs_started>=NB_MAX_srchs ) {
+            // println("DEBUG", "srchs=" + nb_srchs_started );
+            try {
+                synchronized (lock) {
+                    lock.wait();
+                }
+            } catch ( InterruptedException e ) {
+                e.printStackTrace();
+            }  
+        }
+    }
+    
+    public static void wait_after_error() {
+        try {
+            synchronized (lock) {
+                lock.wait();
+            }
+        } catch ( InterruptedException e ) {
+            e.printStackTrace();
+        }  
+   }
+    
+   public static void sleep(int time) {
+        try {  
+            Thread.sleep(time);
+        }
+        catch ( InterruptedException e )
+        {
+             println( "ERROR" ,  e.toString() );
+        }
+    }
+    
+   
+    public static String getDate() {
+    
+        // Initialize the today's date string
+        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+        java.text.SimpleDateFormat sdf = 
+            new java.text.SimpleDateFormat(DATE_FORMAT);
+        Calendar c1 = Calendar.getInstance(); // today
+        return("[" + sdf.format(c1.getTime()) + "]");
+   }
+   
+   public static void println(String level, String msg) {
+        System.out.println (getDate() + " - " + level + ": " + msg );
+   }
+
+}
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Server.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Server.java
new file mode 100644
index 0000000..a5e44e5
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Server.java
@@ -0,0 +1,47 @@
+package system-tests.scenario.single.clients.secureSearch.src.OK-tests.scenario.single.clients.searchLoad.src.OK;
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+import java.util.*;
+
+
+public class Server {
+    public String host;
+    public int port;
+    
+    public Server (String host, int port) {
+        this.host=host;
+        this.port=port;
+    }
+    
+    public Server (String hostPort) {
+        StringTokenizer st = new StringTokenizer(hostPort, ":");
+        this.host=st.nextToken();
+        this.port=Integer.parseInt(st.nextToken());
+    }
+    
+    public String toString() {
+        return (host + ":" + port);
+    }
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Worker.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Worker.java
new file mode 100644
index 0000000..f5654f0
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/OK/Worker.java
@@ -0,0 +1,135 @@
+package system-tests.scenario.single.clients.secureSearch.src.OK-tests.scenario.single.clients.searchLoad.src.OK;
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+import netscape.ldap.*;
+import netscape.ldap.util.*;
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+
+import javax.naming.directory.SearchControls;
+import	javax.naming.directory.DirContext;
+import	 javax.naming.Context;
+import	 javax.naming.directory.InitialDirContext;
+
+
+public class Worker extends Thread {
+ 
+    Server server;
+    Client client;
+    
+    public Worker (Client client, Server server) {
+
+        super();
+        try {
+
+            this.server = server;
+            this.client = client;
+            this.start();	
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+
+    public void run () {
+        
+        String value="";
+        String[] attributes =  new String []{client.attr};
+	
+	String provider = "ldap://"+server.host+":"+server.port+"/";
+	println ("INFO","provider = " + provider);
+	try {	
+	       
+	    Properties envLdap = System.getProperties();
+	    envLdap.put("java.naming.factory.initial",
+			"com.sun.jndi.ldap.LdapCtxFactory");
+	    
+	    envLdap.put(Context.PROVIDER_URL, provider);	
+	    envLdap.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");
+	    envLdap.put(Context.SECURITY_PROTOCOL, "ssl");
+	    
+	    while (true) {
+
+		DirContext ctx = null;	
+		ctx = new InitialDirContext(envLdap);
+	
+		
+		String filter = "(objectclass=*)";
+		
+		SearchControls constraints = new SearchControls();
+
+		Exception exc = null;
+		int count = 0;
+	
+		    
+		//    client.inc_srchs_started();
+		//		    value=(String) client.ValueList.get(client.random.nextInt(client.ValueList.size()));
+		    NamingEnumeration results = ctx.search(client.suffix, filter, constraints);
+		    
+		    
+		    try {
+			while (results != null && results.hasMore()) {
+			    results.next();
+			    println ("INFO " ," res " + results.toString());
+			    count++;
+			}			
+
+		    } catch (Exception ex) {
+			exc = ex;
+		    }
+		    if ( exc != null ) {
+			throw exc;
+		    }
+		    //  client.inc_srchs_done();
+
+		    ctx.close();
+	    }
+	} catch (Exception e) {
+	    
+	    println ("INFO", "Failed: expected error code 3 ");
+
+	    e.printStackTrace();
+	    System.exit(1);
+	}
+    }
+    
+    private String getDate() {
+	
+        // Initialize the today's date string
+        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+        java.text.SimpleDateFormat sdf = 
+            new java.text.SimpleDateFormat(DATE_FORMAT);
+        Calendar c1 = Calendar.getInstance(); // today
+        return("[" + sdf.format(c1.getTime()) + "]");
+   }
+   
+   private void println(String level, String msg) {
+        System.out.println (getDate() + " - " + level + ": (" + server + ") " + msg );
+   }
+	
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Server.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Server.java
new file mode 100644
index 0000000..dbf2405
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Server.java
@@ -0,0 +1,46 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+import java.util.*;
+
+
+public class Server {
+    public String host;
+    public int port;
+    
+    public Server (String host, int port) {
+        this.host=host;
+        this.port=port;
+    }
+    
+    public Server (String hostPort) {
+        StringTokenizer st = new StringTokenizer(hostPort, ":");
+        this.host=st.nextToken();
+        this.port=Integer.parseInt(st.nextToken());
+    }
+    
+    public String toString() {
+        return (host + ":" + port);
+    }
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Worker.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Worker.java
new file mode 100644
index 0000000..9f20d76
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureSearch/src/Worker.java
@@ -0,0 +1,159 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.DirContext;
+import javax.naming.Context;
+import javax.naming.directory.InitialDirContext;
+
+
+public class Worker extends Thread {
+  
+  Server server;
+  Client client;
+  long myId = this.getId();
+  
+  public Worker(Client client2, Server server2) {
+    
+    super();
+    try {
+      
+      server = server2;
+      client = client2;
+      start();
+      
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+  
+  
+  public void run() {
+    
+    String value="";
+
+    try {
+      
+      DirContext ctx = null;
+      
+      // Set the properties 
+     Hashtable envLdap = client.set_properties_LDAP();
+      
+      // the thread is waiting the main to wake up
+      client.inc_thread_ready();
+      
+      println("INFO","THREAD " + myId + " is wake up for test");
+      
+      while (true) {
+        
+        // no sasl authentication
+        // use a random DN to bind
+        if ( client.authentication.equals("simple")) {
+          
+          String bindDN=(String) client.DNList.get(client.random.nextInt(client.DNList.size()));
+          String bindPW="userpassword";
+          
+          envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+          envLdap.put(Context.SECURITY_CREDENTIALS, bindPW);
+         
+        }
+        // bind
+        ctx = new InitialDirContext(envLdap);
+        
+        
+        //String filter = "(objectclass=*)";
+        SearchControls constraints = new SearchControls();
+        String[] returnattrs = {client.attributeName};
+        constraints.setReturningAttributes(returnattrs);
+        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+
+        while (true) {
+          try {
+            String searchDN=(String) client.suffix;
+            String filter="uid="+(String) client.uidList.get(client.random.nextInt(client.uidList.size()));
+
+            // if the Max_nb_search is reached, counters are initialized
+            // disconnect cnx
+            // Wait the main to wake up
+           
+            if ( client.nb_srchs_started_reached() == false) {
+              
+              // Search entries
+              NamingEnumeration results = ctx.search(searchDN, filter, constraints);
+	      while (results != null && results.hasMore()) {
+                   SearchResult res = (SearchResult) results.next();
+                   Attributes uidAttrs = res.getAttributes();
+		}
+              results.close();
+              
+              client.inc_srchs_done();
+            } else {
+              ctx.close();
+              client.thread_go_to_sleep();
+              break;
+            }
+          } catch (Exception ex) {
+
+            println("INFO","THREAD " + myId + " CATCH " + ex);
+
+          }
+
+          // update the total number of searchs
+          client.inc_srchs_done();
+        }
+
+      }
+    } catch (Exception e) {
+      println("INFO", "Failed: expected error code 3 ");
+
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+
+  private String getDate() {
+    
+    // Initialize the today's date string
+    String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+    java.text.SimpleDateFormat sdf =
+     new java.text.SimpleDateFormat(DATE_FORMAT);
+    Calendar c1 = Calendar.getInstance(); // today
+    return("[" + sdf.format(c1.getTime()) + "]");
+  }
+  
+  private void println(String level, String msg) {
+    System.out.println(getDate() + " - " + level + ": (" + server + ") " + msg );
+  }
+  
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/build.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/build.ksh
new file mode 100644
index 0000000..7790e8c
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/build.ksh
@@ -0,0 +1,39 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+export CLASSPATH=$CLASSPATH:.
+
+mkdir -p $COMPILDIR
+echo "Compiling classes..."
+javac src/*.java -d $COMPILDIR
+[ $? -ne 0 ] && return 1
+echo "Creating jarfile"
+cd $COMPILDIR
+jar cvf secureUserpasswordModify.jar *.class
+[ $? -ne 0 ] && return 1
+echo "Cleanup"
+rm -f *.class
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/run.ksh b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/run.ksh
new file mode 100644
index 0000000..95effcf
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/run.ksh
@@ -0,0 +1,50 @@
+#!/bin/ksh
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2008 Sun Microsystems, Inc.
+
+suffix="dc=com"
+hostname=nott
+maxDuration=50
+nb_threads=1
+NB_MAX_mod=100
+keystorePath=/tmp/sylvie
+LDAPSport=1235
+
+bindDN="cn=directory manager"
+bindPW=password
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar Client $@
+
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp ../LDAPjdk/ldapjdk.jar:search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore -Djava.security.debug=ALL -Djava.security.auth.debug=ALL -Djavax.net.debug=ALL -Djavax.security.sasl.level=FINEST Client $@
+
+## SSL
+java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp secureModifyEntries.jar -Djavax.net.ssl.keyStore=$keystorePath/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=$keystorePath/keystore  -Djavax.security.sasl.level=FINEST -Dport=$LDAPSport -DmaxDuration=$maxDuration -DNB_MAX_mod=$NB_MAX_mod -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname Client $@
+#
+
+
+## CLEAR
+#java -client -Xmx1G -Xms1G -XX:NewRatio=1 -XX:SurvivorRatio=100 -cp search.jar -Djavax.net.ssl.keyStore=/tmp/shared/data/CERT_1111/keystore -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/tmp/shared/data/CERT_1111/keystore  -Djavax.security.sasl.level=FINEST -Dport=1111 -DmaxDuration=$maxDuration -DNB_MAX_mod=$NB_MAX_mod -Dsuffix=$suffix -Dnb_threads=$nb_threads -Dhostname=$hostname -DbindDN="$bindDN" -DbindPW=$bindPW Client $@
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/secureUserpasswordModify.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/secureUserpasswordModify.xml
new file mode 100644
index 0000000..9530410
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/secureUserpasswordModify.xml
@@ -0,0 +1,330 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="secureUserpasswordModify"/>
+
+  <!-- ************************************************************ -->
+  <function name="secureUserpasswordModify" scope="local">
+    
+    <function-map-args>
+      <function-arg-def name="workingDir" type="required"/>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Preamble   =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      
+  
+      <script>
+        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
+        
+        outFile = '%s/client_secureUserpasswordModify_id%s.txt' % \
+                  (client.getLogDir(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxOp = cParams[3][1]
+        except IndexError:
+          nbMaxOp = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        try:
+          protocol = cParams[5][1]
+        except IndexError:
+          protocol = NOT_DEFINED
+        try:
+          certAlias = cParams[6][1]
+        except IndexError:
+          certAlias = NOT_DEFINED
+        try:
+          delaySec = cParams[7][1]
+        except IndexError:
+          delaySec = NOT_DEFINED          
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 120
+          
+            # keystorePath
+            keystorePath = "%s/CERT_%s_%s/config" % (client.getLogDir(),client.getName(),client.getId())
+            
+            parms=[]
+            if (protocol == 'ssl'):
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPSPort()))
+            else:
+              parms.append('-Dhostname=%s -Dport=%s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+                       
+            parms.append('-Dsuffix="%s"' % baseDn)
+            
+            parms.append('-Dnb_threads=%s -DNB_MAX_mod=%s -DmaxDuration=%s' % (nbCnx,nbMaxOp,duration))
+            parms.append('-Dprotocol="%s"' % protocol)
+            if attributeName != NOT_DEFINED:
+              parms.append('-DattributeName="%s"' % attributeName)
+            
+            parms.append('-DbindDN="%s"' % DIRECTORY_INSTANCE_DN)
+            parms.append('-DbindPW="%s"' % DIRECTORY_INSTANCE_PSWD)
+                          
+            if delaySec != NOT_DEFINED:
+              parms.append('-DdelaySec="%s"' % delaySec) 
+            parms = ' '.join(parms)
+      </script>
+        
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+        
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir ]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ========== Run the client ========== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'run',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'Do ldapmodify on %s:%s' % \
+                        (serverInstance.getHost(),serverInstance.getLDAPSPort())
+          }
+          </call>
+       
+          <script>
+            cParam = '-client -Xmx1G -Xms1G'
+            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '%s -cp %s/secureUserpasswordModify.jar' % (cParam,compilDir)
+            cParam = '%s -Djavax.net.ssl.keyStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.net.ssl.trustStore=%s/keystore' % (cParam,keystorePath)
+            cParam = '%s -Djavax.security.sasl.level=FINEST' % cParam
+            cParam = '%s -Djavax.net.ssl.trustStorePassword=password' % cParam
+            cParam = '%s -Djavax.net.ssl.keyStorePassword=password' % cParam
+            cParam = '%s %s Client' % (cParam,parms)
+            
+            titleName = '%s: run %s on %s' % \
+                        (client.getHost(),client.getName(),
+                         serverInstance.getName())
+          </script>
+         <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'DEBUG %s' % cParam
+          }
+          </call>
+          <process name="'%s' % titleName">
+            <location>client.getHost()</location>
+            <command>'%s/bin/java' % JAVA_HOME</command>
+            <parms>cParam </parms>
+            <workdir>workingDir</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout>outFile</stdout>
+            <returnstdout/>
+          </process>
+          <!-- TBD : result should be STAXResult[0][1] : problem when
+                     javaexception, with carac " and < >-->
+          <call function="'checkRC'">
+            { 'returncode' : RC ,
+              'result'     : '',
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          <!-- ========== Postamble ========== -->
+          <call function="'writeMessage'">
+          {'content' : 'Output file %s' % outFile,
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+         
+          
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+         
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>   
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Client.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Client.java
new file mode 100644
index 0000000..89b3a77
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Client.java
@@ -0,0 +1,489 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+
+
+public class Client {
+    
+    
+    static int NB_MAX_mod=100;
+    static int nb_mod_started=0;
+    static int nb_mod_done=0;
+    static int total_nb_mod=0;
+    static int nb_threads=3;
+    static int nb_thread_ready=0;
+
+    static Random random;   
+    static String hostname ;
+    static int portnumber;
+    static String bindDN;
+    static String bindPW;
+    static String suffix;
+    static Server server;
+    static String protocol;
+    static String attributeName;
+    static String time= new String ("0 sec.");
+    static long timeTostopTest=0;
+    static long maxDuration=0;
+    static long duration=0;
+    static long startup=0;
+    static ArrayList<String> DNList;
+    static long delayCnx=1000;
+    static long delaySec=1;
+  
+    
+    public Client()
+    {
+            
+        random= new Random();
+        DNList=new ArrayList<String>();
+
+        try {
+
+            /*
+             * bind as directory manager to get the full list of DN
+             * create a list of DN
+             */
+            Hashtable envLdap = set_properties_LDAP_simpleBind();
+            
+	    DirContext ctx = null;
+            ctx = new InitialDirContext(envLdap);
+
+	    // Search options
+	    String filter = "(objectclass=inetorgperson)";
+            String[] attrs = { "uid"};
+
+	    SearchControls constraints = new SearchControls();
+            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            constraints.setReturningAttributes(attrs);
+
+	    NamingEnumeration results = ctx.search(suffix, filter, constraints);
+	    Exception exc = null;
+	    int count = 0;
+
+	    try {
+		while (results != null && results.hasMore()) {
+                    SearchResult res = (SearchResult) results.next();
+                    DNList.add (res.getNameInNamespace());       
+                  
+		    count++;
+		}
+                
+                DNList.trimToSize();
+                if ( DNList.size() == 0) {
+                  println("ERROR", "No entry found in \"" + suffix + "\"");
+                  System.exit(1);
+                }
+	    } catch (Exception ex) {
+		exc = ex;
+	    }
+	    if ( exc != null ) {
+		throw exc;
+            }
+       	} catch (Exception e) {
+
+	    println ("INFO", "ERROR Failed to establish connection ");
+	    e.printStackTrace();
+	    System.exit(1);
+        }
+        
+        try {
+        
+
+	    // execute the threads
+            for (int i=0; i < nb_threads; i++ ) {
+                Worker w = new Worker(this, server);
+            }
+            println ("INFO", nb_threads + " threads connected to server " + server );
+            //println ("INFO", "Will search using filter \"(" + attr + " = <value> )\" (MAX =" + NB_MAX_mod + ")" );
+
+	    // Wait until all the threads have initialized their context 
+	    // and are ready to bind
+            try {
+                while ( nb_thread_ready() < nb_threads) {
+		    // wait
+		}
+		// All the threads are ready, wake up all the threads
+		synchronized(this) {
+		    nb_thread_ready=0;
+                    notifyAll();
+		}
+            }
+            catch ( Exception e1 ) {
+		System.out.println ("E1");
+		e1.printStackTrace();
+            }
+
+            int seconds=0;
+            // initialize startup
+            long t1=System.currentTimeMillis();
+            
+            // work until Max duration is reached
+            while (true) {
+
+                long new_t1=System.currentTimeMillis();
+
+		// end of the  system test. Exit
+                if ( ( timeTostopTest != 0 ) && ( new_t1 > timeTostopTest ) ) { 
+                  
+                    // inform all the threads it's the end
+                    synchronized (this) {
+			nb_mod_started=NB_MAX_mod;
+		    }
+                    break; 
+                }
+                
+		// status every delayCnx
+                if ( (new_t1 - t1) >= delayCnx) {
+
+                    println("INFO",  (nb_mod_done/delaySec) + "  mod/sec.");
+
+		    // inform all the threads the max nb searchs has been reached
+		    synchronized (this) {
+			nb_mod_started=NB_MAX_mod;
+		    }
+
+		    // Wait all the threads to close their cnx and sleep
+		    try {
+			total_nb_mod+=nb_mod_done;
+			while ( nb_thread_ready() < nb_threads) {
+			    // wait
+			}
+			// All the threads are ready, wake up all the threads
+			synchronized(this) {
+			    nb_thread_ready=0;
+			    nb_mod_started=0;
+			    nb_mod_done=0;
+
+			    notifyAll();
+			}
+		    } 
+		    catch ( Exception e1 ) {
+			System.out.println ("E1");
+			e1.printStackTrace();
+		    }
+
+                    if ( (seconds++) >= 9 ) {
+                        duration=((new_t1-startup)/1000);
+                        println("INFO",  "Avg rate: " + (total_nb_mod/duration) + " mod/sec. after " + getTime(duration));
+                        seconds=0;
+                    }
+                    t1=new_t1;
+                }
+            }
+            println ("INFO", "End of the client");
+            System.exit(0);
+        }
+        catch( Exception e ) {
+
+            e.printStackTrace();
+            System.exit(1);
+        }
+        
+        
+    }
+    
+
+/* =========================================
+ * MAIN
+ * ======================================= */
+
+    public static void main( String[] args )
+
+    {
+      
+        startup=System.currentTimeMillis();
+
+	// ===========================================
+        // Get the arguments specified for each option.
+	//
+
+	// Ldap port
+	String sport = System.getProperty("port"); 
+	portnumber = Integer.parseInt(sport);
+
+	// BaseDN
+	suffix = System.getProperty("suffix"); 
+	println ("INFO" , "suffix " + suffix);
+	
+	// nb_threads
+	String snb_threads = System.getProperty("nb_threads"); 
+	nb_threads = Integer.parseInt(snb_threads);
+	
+	println ("INFO" , "nb_threads " + snb_threads);
+	
+	// test duration
+	String sMaxDuration = System.getProperty("maxDuration"); 
+	maxDuration = Long.parseLong(sMaxDuration);
+	println ("INFO" , "maxDuration " + maxDuration);
+        
+	// credential for simple bind
+	bindDN = System.getProperty("bindDN"); 
+	bindPW = System.getProperty("bindPW"); 
+	println ("INFO" , "bindDN " + bindDN);
+	
+	// Max number of searchs
+	String sNB_MAX_mod = System.getProperty("NB_MAX_mod"); 
+	NB_MAX_mod = Integer.parseInt(sNB_MAX_mod);
+	println ("INFO" , "sNB_MAX_mod " + sNB_MAX_mod);
+	
+	// attribute to modify or add 
+	attributeName = System.getProperty("attributeName");
+	println ("INFO" , "attributeName " + attributeName);        
+
+	// hostname
+	hostname = System.getProperty("hostname");
+
+	// protocol : SSL or TLS
+	protocol = System.getProperty("protocol");
+	println ("INFO" , "protocol " + protocol);        
+        
+        // delay Sec  before closing conx
+        String sdelaySec = System.getProperty("delaySec"); 
+	delaySec =  Long.parseLong(sdelaySec);
+        delayCnx = delaySec * 1000;
+	println ("INFO" , "delayCnx " + delayCnx);
+        
+        if ( maxDuration != 0 ) {
+          maxDuration= maxDuration * 1000;
+        }
+        timeTostopTest=( startup + maxDuration);
+        println("INFO", "the test will finish at " + timeTostopTest );
+
+	// ===========================================
+	// Initialize the Server
+        server=new Server (hostname,portnumber);
+
+	System.out.println ("DEBUG declare server " + portnumber + " " + hostname);
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+		
+		public void run() {
+                }
+	    });        
+
+        Client c = new Client();
+    }
+
+/* =========================================
+ * Get Date
+ * ======================================= */
+   public static String getTime(long d) {
+	String time=new String (d + " sec.");
+	if ( d > 10000 ) {
+            time=new String ((d/3600) + " hours");
+	} else if ( d > 300 ) {
+            time=new String ((d/60) + " min.");
+	}
+        return time;
+   }
+
+/* =========================================
+ * return true if the number of NB_MAX_mod has been reached
+ * else, increase nb_mod_started
+ * ======================================= */
+
+   public boolean nb_mod_started_reached() {
+
+       synchronized (this) {
+	   if ( nb_mod_started>=NB_MAX_mod ) {
+	       return true;
+
+	   } else {
+	       nb_mod_started++;
+	       return false;
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * thread is waiting for a notify from the main thread
+ * ======================================= */
+
+   public void thread_go_to_sleep() {
+
+       synchronized (this) {
+	   try {
+               nb_thread_ready++;
+
+	       this.wait();
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+    }       
+
+
+/* =========================================
+ * increase the number of mod started
+ * ======================================= */
+   public void inc_mod_started() {
+
+       synchronized (this) {
+	   if ( nb_mod_started>=NB_MAX_mod ) {
+	       try {
+		   this.wait();
+	       } catch ( Exception e ) {
+		   e.printStackTrace();
+	       }
+	       
+	   } else {
+	       nb_mod_started++;
+	   }
+       }
+    }       
+
+   
+
+/* =========================================
+ * increase the number of mod done
+ * ======================================= */
+   public void inc_mod_done() {
+      synchronized (this) {
+             try {
+               nb_mod_done++;
+	   } catch ( Exception e ) {
+	       e.printStackTrace();
+	   }
+       }
+   }
+
+
+/* =========================================
+ * Configure the Properties 
+ * authentication : simple
+ * protocol ssl, tls or clear
+ * ======================================= */
+    public static Hashtable set_properties_LDAP() {
+      
+      String provider ;
+      
+      Hashtable envLdap = new Hashtable();
+      envLdap.put("java.naming.factory.initial",
+       "com.sun.jndi.ldap.LdapCtxFactory");
+      
+      envLdap.put(Context.SECURITY_AUTHENTICATION, "simple");
+      
+      if ( protocol.equals("ssl")) {
+        provider = "ldaps://"+server.host+":"+server.port+"/";
+        envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+        
+      } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+      }
+       envLdap.put(Context.PROVIDER_URL, provider);
+
+       return envLdap;
+    }
+    
+
+/* =========================================
+ * Configure the Properties for a simple Bind
+ * bind as directory manager
+ * use the selected protocol : ssl, tls or clear
+ * ======================================= */
+
+   public static Hashtable set_properties_LDAP_simpleBind() {
+     
+     String provider ;
+     
+     Hashtable envLdap = new Hashtable();
+     envLdap.put("java.naming.factory.initial",
+      "com.sun.jndi.ldap.LdapCtxFactory");
+     
+     envLdap.put(Context.SECURITY_AUTHENTICATION, "simple");
+    
+     envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+     envLdap.put(Context.SECURITY_CREDENTIALS, bindPW);
+     
+     if ( protocol.equals("ssl")) {
+       provider = "ldaps://"+server.host+":"+server.port+"/";
+       envLdap.put(Context.SECURITY_PROTOCOL, protocol);
+       
+     } else {
+        provider = "ldap://"+server.host+":"+server.port+"/";
+     }
+    
+     envLdap.put(Context.PROVIDER_URL, provider);
+     return envLdap;
+   }
+   
+/* =========================================
+ * Get Date
+ * ======================================= */
+    public static String getDate() {
+    
+        // Initialize the today's date string
+        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+        java.text.SimpleDateFormat sdf = 
+            new java.text.SimpleDateFormat(DATE_FORMAT);
+        Calendar c1 = Calendar.getInstance(); // today
+        return("[" + sdf.format(c1.getTime()) + "]");
+   }
+  
+
+/* =========================================
+ * Print
+ * ======================================= */
+   public static void println(String level, String msg) {
+        System.out.println (getDate() + " - " + level + ": " + msg );
+   }
+
+
+/* =========================================
+ * increase the number of threads ready
+ * ======================================= */
+    public void inc_thread_ready() {
+	synchronized (this) {
+            nb_thread_ready++;
+
+            try {
+            this.wait();
+            } catch (Exception e) {
+		e.printStackTrace();
+            }
+	}
+
+    }
+
+
+/* =========================================
+ * return the number of threads ready
+ * ======================================= */
+    public static int nb_thread_ready() {
+	return nb_thread_ready;
+    }
+}
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Server.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Server.java
new file mode 100644
index 0000000..dbf2405
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Server.java
@@ -0,0 +1,46 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+import java.util.*;
+
+
+public class Server {
+    public String host;
+    public int port;
+    
+    public Server (String host, int port) {
+        this.host=host;
+        this.port=port;
+    }
+    
+    public Server (String hostPort) {
+        StringTokenizer st = new StringTokenizer(hostPort, ":");
+        this.host=st.nextToken();
+        this.port=Integer.parseInt(st.nextToken());
+    }
+    
+    public String toString() {
+        return (host + ":" + port);
+    }
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Worker.java b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Worker.java
new file mode 100644
index 0000000..7b21eab
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/secureUserpasswordModify/src/Worker.java
@@ -0,0 +1,165 @@
+// CDDL HEADER START
+//
+// The contents of this file are subject to the terms of the
+// Common Development and Distribution License, Version 1.0 only
+// (the "License").  You may not use this file except in compliance
+// with the License.
+//
+// You can obtain a copy of the license at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE
+// or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+// See the License for the specific language governing permissions
+// and limitations under the License.
+//
+// When distributing Covered Code, include this CDDL HEADER in each
+// file and include the License file at
+// trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+// add the following below this CDDL HEADER, with the fields enclosed
+// information:
+//      Portions Copyright [yyyy] [name of copyright owner]
+//
+// CDDL HEADER END
+//
+//
+//      Copyright 2008 Sun Microsystems, Inc.
+
+import java.util.*;
+import java.io.*;
+import java.lang.Thread;
+import javax.naming.*;
+
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.DirContext;
+import javax.naming.Context;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.BasicAttributes;
+
+
+public class Worker extends Thread {
+  
+  Server server;
+  Client client;
+  long myId = this.getId();
+  
+  /**
+   ** Constructor for Worker  thread
+   **/
+  public Worker(Client client2, Server server2) {
+    
+    super();
+    try {
+      
+      server = server2;
+      client = client2;
+      start();
+      
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+  
+  /**
+   * Connect to the server
+   * wait a notify from the main thread to startthe modify operations
+   **/
+  public void run() {
+    
+    String value="";
+    String initBindPW;
+    String newBindPW;
+    Random random_cpt= new Random();
+    String bindDN;
+    try {
+      
+      DirContext ctx = null;
+      
+      // Set the properties
+      Hashtable envLdap = client.set_properties_LDAP();
+      
+      println("INFO","THREAD " + myId + " is waiting ");
+      // Waiting a notify from the main thread
+      client.inc_thread_ready();
+      
+      /*
+       * Start modify operations
+       */
+      String[] attrIds = { (String)client.attributeName };
+      initBindPW = "userpassword";
+      newBindPW = "new_userpassword";
+      
+      Attributes initAttrs = new BasicAttributes(attrIds[0], initBindPW, true);
+      Attributes newAttrs = new BasicAttributes(attrIds[0], newBindPW, true);
+
+      while (true) {
+        
+        while (true) {
+          
+          bindDN=(String) client.DNList.get(client.random.nextInt(client.DNList.size()));
+          try {
+
+            // if the Max_nb_mod is reached, counters are initialized
+            // disconnect cnx
+            // Wait the main to wake up
+            if ( client.nb_mod_started_reached() == false) {
+
+              // bind
+              // use a random DN to bind
+              envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+              envLdap.put(Context.SECURITY_CREDENTIALS, initBindPW);
+              
+              ctx = new InitialDirContext(envLdap);
+              ctx.modifyAttributes(bindDN, DirContext.REPLACE_ATTRIBUTE, newAttrs);
+              ctx.close();
+              
+              // restore the old password
+              // bind
+              
+              envLdap.put(Context.SECURITY_PRINCIPAL, bindDN);
+              envLdap.put(Context.SECURITY_CREDENTIALS, newBindPW);
+             
+              ctx = new InitialDirContext(envLdap);
+              ctx.modifyAttributes(bindDN, DirContext.REPLACE_ATTRIBUTE, initAttrs);
+              ctx.close();
+              
+              
+              client.inc_mod_done();
+            } else {
+              client.thread_go_to_sleep();
+              break;
+            }
+          } catch (Exception ex) {
+            
+            println("INFO","THREAD " + myId + " ERROR " + ex);
+            
+          }
+          // update the total number of searchs
+          client.inc_mod_done();
+        }
+      }
+    } catch (Exception e) {
+      
+      println("INFO", "ERROR Failed: expected error code 3 ");
+      
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+  
+  private String getDate() {
+    
+    // Initialize the today's date string
+    String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
+    java.text.SimpleDateFormat sdf =
+     new java.text.SimpleDateFormat(DATE_FORMAT);
+    Calendar c1 = Calendar.getInstance(); // today
+    return("[" + sdf.format(c1.getTime()) + "]");
+  }
+  
+  private void println(String level, String msg) {
+    System.out.println(getDate() + " - " + level + ": (" + server + ") " + msg );
+  }
+  
+}
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/tasks/tasks.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/tasks/tasks.xml
new file mode 100644
index 0000000..4e25ac1
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample/clients/tasks/tasks.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="tasks"/>
+
+  <!-- ************************************************************ -->
+  <function name="tasks" scope="local">
+    
+    <function-map-args>
+      <function-arg-def name="workingDir" type="required"/>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Preamble   =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      
+      <script>
+        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
+        
+        outFile = '%s/client_tasks_id%s.txt' % \
+                  (client.getLogDir(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+       try:
+          nbTasks = cParams[1][1]
+        except IndexError:
+          nbTasks = NOT_DEFINED
+          msg = '%s\nERROR: nbTasks undefined,mandatory' % msg
+      try:
+          delaySec = cParams[2][1]
+        except IndexError:
+          delaySec = NOT_DEFINED
+          msg = '%s\nERROR: delaySec undefined,mandatory' % msg          
+          
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 60
+      </script>
+    
+       <call function="'writeMessage'">
+          {'content' : 'Executing backup in tasks mode every %s secondes' % delaySec,
+           'fileFd'  : fileFd}
+       </call>
+        
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          <call function="'writeStartTagOperation'">
+            { 'tagName' : 'Backup task',
+            'fileFd'  : fileFd }
+          </call>
+          
+          <script>
+            cpt=0
+            intdelaySec= int(delaySec)
+            intnbTasks= int(nbTasks)
+            allowednbTasks= duration / intdelaySec
+            listBackupFolder = []
+          </script>
+          
+          <call function="'writeMessage'">
+            {'content' : 'Execute %s tasks every %s sec ' % (allowednbTasks,intdelaySec),
+            'fileFd'  : fileFd}
+          </call>
+
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+
+          <loop from="1" to="allowednbTasks" >
+            <sequence>
+              <call function="'writeStartTagOperation'">
+                { 'tagName' : 'Execute a backup task',
+                'fileFd'  : fileFd }
+              </call>              
+              <call function="'backup'">
+                { 'location'      : serverInstance.getHost(),
+                'dsPath'          : serverInstance.getInstallDir(),
+                'dsInstanceHost'  : serverInstance.getHost(),
+                'dsInstancePort'  : serverInstance.getLDAPPort(),
+                'dsInstanceDn'    : DIRECTORY_INSTANCE_DN,
+                'dsInstancePswd'  : DIRECTORY_INSTANCE_PSWD,
+                'startTask'       : '0',
+                'backupDir'       :  '%s/backup_schedule_asynchronous_%s' % (serverInstance.getInstallDir(),cpt),
+                'backEnd'         : 'userRoot',
+                'fileFd'          : fileFd}
+              </call>
+                   
+              <script>
+                BackupFolder = '%s/backup_schedule_asynchronous_%s' % (serverInstance.getInstallDir(),cpt)
+                listBackupFolder.append(BackupFolder)
+              </script>
+
+              <!--=== Sleep and wait to start the client when specified ===-->
+              <call function="'sleep'">
+                { 'location' : serverInstance.getHost(),
+                'sleepForMilliSeconds' : intdelaySec,
+                'fileFd'   : fileFd
+                }
+              </call>
+
+              <script>cpt += 1</script>
+              <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+            </sequence>
+          </loop>
+
+        
+          <iterate in="listBackupFolder" var="backupFolder">
+            <sequence>
+              <call function="'deleteFolder'">
+                {
+                'location'      : serverInstance.getHost(),
+                'foldername'    :  backupFolder,
+                'fileFd'        : fileFd
+                }
+              </call>
+              <script>
+                errNum += STAXResult
+              </script>
+            </sequence>
+          </iterate>
+         
+          <call function="'writeStartTagOperation'">
+            { 'tagName' : 'End Backup task',
+            'fileFd'  : fileFd }
+          </call>
+          <!-- ========== Postamble ========== -->
+          <call function="'writeMessage'">
+          {'content' : 'Output file %s' % outFile,
+           'fileFd'  : fileFd}
+          </call>
+          
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+        </sequence>
+      </else>
+      </if>
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>   
+  
+</stax>
+

--
Gitblit v1.10.0