Merge branch 'master' of
https://gitbox.apache.org/repos/asf/directory-server

# Conflicts:
#	protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/PwdModifyHandler.java
#	server-integ/src/test/java/org/apache/directory/server/operations/extended/PwdModifyNoPPNoPasswordHashingIT.java
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/PwdModifyHandler.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/PwdModifyHandler.java
index 419b301..7634ea4 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/PwdModifyHandler.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/PwdModifyHandler.java
@@ -237,7 +237,7 @@
             {
                 if ( !valid )
                 {
-                    valid = PasswordUtil.compareCredentials( oldPassword, value.getBytes() ) ;
+                    valid = PasswordUtil.compareCredentials( oldPassword, value.getBytes() );
                 }
                 
                 try
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/extended/PwdModifyNoPPNoPasswordHashingIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/extended/PwdModifyNoPPNoPasswordHashingIT.java
index 1dd8a77..4e6ea1c 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/extended/PwdModifyNoPPNoPasswordHashingIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/extended/PwdModifyNoPPNoPasswordHashingIT.java
@@ -49,9 +49,6 @@
 import org.apache.directory.server.annotations.CreateLdapServer;
 import org.apache.directory.server.annotations.CreateTransport;
 import org.apache.directory.server.core.annotations.CreateDS;
-import org.apache.directory.server.core.api.InterceptorEnum;
-import org.apache.directory.server.core.authn.AuthenticationInterceptor;
-import org.apache.directory.server.core.authn.ppolicy.PpolicyConfigContainer;
 import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.apache.directory.server.ldap.handlers.extended.PwdModifyHandler;
@@ -60,7 +57,12 @@
 
 
 /**
+<<<<<<< HEAD
  * Test the PwdModify extended operation
+=======
+ * Test the PwdModify extended operation, when no PasswordPolicy or PasswordHashing interceptor
+ * are present.
+>>>>>>> c42030f59692518133715f0a4753ce24bb63b2d8
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
@@ -153,9 +155,9 @@
     @Test
     public void testModifyOwnPasswordNoOldNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
-        {        
+        {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Bind as the user
@@ -206,43 +208,45 @@
     @Test
     public void testModifyOwnPasswordNoOldNewExists() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        Entry user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
+    
+            // Bind as the user
+            Entry user;
+            
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+                
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
         
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
-        assertNull( user.get( "modifyTimestamp" ) );
-        assertNull( entry.get( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1", userPassword.getString() );
+                assertNull( user.get( "modifyTimestamp" ) );
+                assertNull( entry.get( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -259,40 +263,40 @@
     @Test
     public void testModifyOwnPasswordOldNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1Bis", userPassword.getString() );
-
-        userConnection.close();
-        adminConnection.close();
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
+            
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+            
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+        
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            { 
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+            
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+            
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1Bis", userPassword.getString() );
+            }
+        }
     }
 
 
@@ -309,55 +313,55 @@
     @Test
     public void testModifyOwnPasswordInvalidOldNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), 
-            "cn=user1,ou=system", "secret1" );
-        
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.INVALID_CREDENTIALS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password. Should fail
-        try
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
-            userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" );
-            fail();
-        }
-        catch ( LdapAuthenticationException lae )
-        {
-            // We are fine
-        }
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
+    
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), 
+                "cn=user1,ou=system", "secret1" ) )
+            {            
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
         
-        // The entry should not have been modified
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                assertEquals( ResultCodeEnum.INVALID_CREDENTIALS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password. Should fail
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                
+                fail();
+            }
+            catch ( LdapAuthenticationException lae )
+            {
+                // We are fine
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1", userPassword.getString() );
+                
+                // The entry should not have been modified
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -374,40 +378,40 @@
     @Test
     public void testModifyOwnPasswordOldNoNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+            
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+            
+                assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+        
+            // Rebind with the original password
+            try ( LdapConnection  userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+            
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+            
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1", userPassword.getString() );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -424,41 +428,41 @@
     @Test
     public void testModifyOwnPasswordOldNewExists() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
+    
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1", userPassword.getString() );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -475,38 +479,38 @@
     @Test
     public void testModifyOwnPasswordNoOldNoNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
 
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1", userPassword.getString() );
+            }
+        }
     }
 
 
@@ -526,38 +530,38 @@
     @Test
     public void testModifyOwn2PasswordsNoOldNoNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
 
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 2, userPassword.size() );
-        assertTrue( userPassword.contains( "secret1", "other" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+            }
+        }
     }
 
     
@@ -576,43 +580,45 @@
     @Test
     public void testModifyOwn2PassworsdNoOldNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
 
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        Entry user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+            // Bind as the user
+            Entry user;
+            
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+                
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
         
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1Bis", userPassword.getString() );
-        assertNull( user.get( "modifyTimestamp" ) );
-        assertNotNull( entry.get( "modifyTimestamp" ).getString() );
-
-        userConnection.close();
-        adminConnection.close();
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1Bis", userPassword.getString() );
+                assertNull( user.get( "modifyTimestamp" ) );
+                assertNotNull( entry.get( "modifyTimestamp" ).getString() );
+            }
+        }
     }
 
 
@@ -629,43 +635,45 @@
     @Test
     public void testModifyOwn2PasswordsNoOldNewExists() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
 
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        Entry user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+            // Bind as the user
+            Entry user;
+            
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                user = userConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+                
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
         
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 2, userPassword.size() );
-        assertTrue( userPassword.contains( "secret1", "other" ) );
-        assertNull( user.get( "modifyTimestamp" ) );
-        assertNull( entry.get( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertNull( user.get( "modifyTimestamp" ) );
+                assertNull( entry.get( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -682,40 +690,40 @@
     @Test
     public void testModifyOwn2PasswordsOldNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
 
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1Bis", userPassword.getString() );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1Bis", userPassword.getString() );
+            }
+        }
     }
 
 
@@ -732,55 +740,54 @@
     @Test
     public void testModifyOwn2PasswordsInvalidOldNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), 
-            "cn=user1,ou=system", "secret1" );
-        
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.INVALID_CREDENTIALS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password. Should fail
-        try
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
-            userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" );
-            fail();
-        }
-        catch ( LdapAuthenticationException lae )
-        {
-            // We are fine
-        }
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
 
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), 
+                "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 2, userPassword.size() );
-        assertTrue( userPassword.contains( "secret1", "other" ) );
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
         
-        // The entry should not have been modified
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                assertEquals( ResultCodeEnum.INVALID_CREDENTIALS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Now try to bind with the new password. Should fail
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                fail();
+            }
+            catch ( LdapAuthenticationException lae )
+            {
+                // We are fine
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            { 
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                
+                // The entry should not have been modified
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -797,40 +804,40 @@
     @Test
     public void testModifyOwn2PasswordsOldNoNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            {
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 2, userPassword.size() );
-        assertTrue( userPassword.contains( "secret1", "other" ) );
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            { 
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
 
 
@@ -847,41 +854,41 @@
     @Test
     public void testModifyOwn2PasswordsOldNewExists() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser2Passwords( adminConnection, "User1", "secret1", "other" );
-
-        // Bind as the user
-        LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Rebind with the original password
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" );
-
-        Entry entry = userConnection.lookup( "cn=User1,ou=system" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Bind as the user
+            try ( LdapConnection userConnection = getNetworkConnectionAs( getLdapServer(), "cn=user1,ou=system", "secret1" ) )
+            { 
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
         
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 2, userPassword.size() );
-        assertTrue( userPassword.contains( "secret1", "other" ) );
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        userConnection.close();
-        adminConnection.close();
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
     }
     
     
@@ -894,42 +901,41 @@
     @Test
     public void testModifyUserPasswordAnonymous() throws Exception
     {
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User2", "secret2" );
-
-        LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User2,ou=system", "secret2" );
-
-        Entry entry = userConnection.lookup( "cn=User2,ou=system" );
-
-        assertNotNull( entry );
-
-        userConnection.close();
-
-        // Anonymous Bind
-        LdapConnection anonymousConnection = getAnonymousNetworkConnection( getLdapServer() );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User2,ou=system" ) );
-        pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret2Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) anonymousConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Check that we can now bind using the new credentials
-        userConnection = getNetworkConnectionAs( ldapServer, "cn=User2,ou=system", "secret2Bis" );
-
-        entry = userConnection.lookup( "cn=User2,ou=system" );
-
-        assertNotNull( entry );
-
-        userConnection.close();
-        anonymousConnection.close();
-        adminConnection.close();
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User2", "secret2" );
+    
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User2,ou=system", "secret2" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User2,ou=system" );
+        
+                assertNotNull( entry );
+            }
+    
+            // Anonymous Bind
+            try ( LdapConnection anonymousConnection = getAnonymousNetworkConnection( getLdapServer() ) )
+            { 
+                // Now change the password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User2,ou=system" ) );
+                pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
+                pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret2Bis" ) );
+        
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) anonymousConnection.extended( pwdModifyRequest );
+        
+                assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+    
+            // Check that we can now bind using the new credentials
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User2,ou=system", "secret2Bis" ) )
+            { 
+                Entry entry = userConnection.lookup( "cn=User2,ou=system" );
+        
+                assertNotNull( entry );
+            }
+        }
     }
     
     
@@ -939,25 +945,25 @@
     @Test
     public void testOwnGenPassword() throws Exception
     {
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User6", "secret6" );
-
-        // Modify the user with the user account
-        LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User6,ou=system", "secret6" );
-
-        // Now request a new password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User6,ou=system" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
-
-        // We should not be allowed to do that, as the operation is not yet implemented
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        userConnection.close();
-        adminConnection.close();
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User6", "secret6" );
+    
+            // Modify the user with the user account
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User6,ou=system", "secret6" ) )
+            {
+                // Now request a new password
+                PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+                pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User6,ou=system" ) );
+        
+                // Send the request
+                PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) userConnection.extended( pwdModifyRequest );
+        
+                // We should not be allowed to do that, as the operation is not yet implemented
+                assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+            }
+        }
     }
 
 
@@ -972,6 +978,7 @@
     {
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUserNoPassword( adminConnection, "User4" );
     
             // Modify the user with the admin account
@@ -1021,33 +1028,32 @@
     @Test
     public void testAdminModifyPasswordNoOldNoNew() throws Exception
     {
-        // Create a user
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User1", "secret1" );
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        Entry entry = adminConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
-
-        assertNotNull( entry );
-        assertTrue( entry.containsAttribute( "userPassword" ) );
-        Attribute userPassword = entry.get( "userPassword" );
-        
-        assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
-
-        assertEquals( 1, userPassword.size() );
-        assertEquals( "secret1", userPassword.getString() );
-        assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
-
-        adminConnection.close();
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser( adminConnection, "User1", "secret1" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            Entry entry = adminConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+    
+            assertNotNull( entry );
+            assertTrue( entry.containsAttribute( "userPassword" ) );
+            Attribute userPassword = entry.get( "userPassword" );
+            
+            assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+    
+            assertEquals( 1, userPassword.size() );
+            assertEquals( "secret1", userPassword.getString() );
+            assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+        }
     }
 
 
@@ -1064,9 +1070,9 @@
     @Test
     public void testAdminModifyPasswordNoOldNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Now change the password
@@ -1111,9 +1117,9 @@
     @Test
     public void testAdminAddPasswordNoOldNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUserNoPassword( adminConnection, "User1" );
     
             // Now change the password
@@ -1158,9 +1164,9 @@
     @Test
     public void testAdminModifyPasswordInvalidOldNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
         
             // Now change the password
@@ -1202,9 +1208,9 @@
     @Test
     public void testAdminModifyPasswordNoOldNewExists() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Now change the password
@@ -1249,9 +1255,9 @@
     @Test
     public void testAdminModifyPasswordOldNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Now change the password
@@ -1270,7 +1276,6 @@
             {
                 Entry entry = userConnection.lookup( "cn=User1,ou=system", SchemaConstants.ALL_ATTRIBUTES_ARRAY );
             
-                System.out.println( entry );
                 assertNotNull( entry );
                 assertTrue( entry.containsAttribute( "userPassword" ) );
                 Attribute userPassword = entry.get( "userPassword" );
@@ -1298,9 +1303,9 @@
     @Test
     public void testAdminModifyPasswordOldNoNew() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Now change the password
@@ -1345,9 +1350,9 @@
     @Test
     public void testAdminModifyPasswordOldNewExists() throws Exception
     {
-        // Create a user
         try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
         {
+            // Create a user
             addUser( adminConnection, "User1", "secret1" );
     
             // Now change the password
@@ -1378,6 +1383,366 @@
             }
         }
     }
+    
+    
+    //-----------------------------------------------------------------------------------
+    // Admin password modification with two passwords
+    //-----------------------------------------------------------------------------------
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is not provided
+     * o the new password is not provided
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsNoOldNoNew() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = 
+                    ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+            }
+        }
+    }
+
+    
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is not provided
+     * o the new password is new
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the end, we will have only one password remaining
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PassworsdNoOldNew() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+
+            Entry user = adminConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
+
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1Bis", userPassword.getString() );
+                assertFalse( user.containsAttribute( "modifyTimestamp" ) );
+                assertNotNull( entry.get( "modifyTimestamp" ).getString() );
+            } 
+        }
+    }
+
+
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is not provided
+     * o the new password exists
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsNoOldNewExists() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            Entry user = adminConnection.lookup( "cn=user1,ou=system", "modifyTimestamp" );
+            
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = 
+                    ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertNull( user.get( "modifyTimestamp" ) );
+                assertNull( entry.get( "modifyTimestamp" ) );
+            }                
+        }
+    }
+
+
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is provided
+     * o the new password is new
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsOldNew() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = 
+                    ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+
+            assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 1, userPassword.size() );
+                assertEquals( "secret1Bis", userPassword.getString() );
+                assertTrue( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
+    }
+
+
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is provided, but it's the wrong one
+     * o the new password is new
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsInvalidOldNew() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret2" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret1Bis" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.INVALID_CREDENTIALS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Now try to bind with the new password. Should fail
+            try
+            {
+                try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1Bis" ) )
+                {
+                    
+                }
+                fail();
+            }
+            catch ( LdapAuthenticationException lae )
+            {
+                // We are fine
+            }
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                
+                // The entry should not have been modified
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
+    }
+
+
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is provided
+     * o the new password is not provided 
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsOldNoNew() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system", "userPassword", "modifyTimestamp" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }        
+        }
+    }
+
+
+    /**
+     * Modify an existing user password with an admin account:
+     * o the userIdentity is provided
+     * o the old password is provided
+     * o the new password is already existing
+     * o the entry has a userPassword attribute
+     * o the userPassword attribute contains two values
+     * 
+     * At the same time, PP and passwordHashing interceptor are disabled
+     */
+    @Test
+    public void testAdminPasswordModify2PasswordsOldNewExists() throws Exception
+    {
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            // Create a user
+            addUser2Passwords( adminConnection, "User1", "secret1", "other" );
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User1,ou=system" ) );
+            pwdModifyRequest.setOldPassword( Strings.getBytesUtf8( "secret1" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "other" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Rebind with the original password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User1,ou=system", "secret1" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User1,ou=system" );
+        
+                assertNotNull( entry );
+                assertTrue( entry.containsAttribute( "userPassword" ) );
+                Attribute userPassword = entry.get( "userPassword" );
+                
+                assertNull( PasswordUtil.findAlgorithm( userPassword.getBytes() ) );
+        
+                assertEquals( 2, userPassword.size() );
+                assertTrue( userPassword.contains( "secret1", "other" ) );
+                assertFalse( entry.containsAttribute( "modifyTimestamp" ) );
+            }
+        }
+    }
 
 
     /**
@@ -1386,38 +1751,31 @@
     @Test
     public void testAdminModifyMultiplePassword() throws Exception
     {
-        AuthenticationInterceptor authenticationInterceptor = ( AuthenticationInterceptor ) getService()
-            .getInterceptor( InterceptorEnum.AUTHENTICATION_INTERCEPTOR.getName() );
-
-        PpolicyConfigContainer policyContainer = authenticationInterceptor.getPwdPolicyContainer();
-        authenticationInterceptor.setPwdPolicies( null );
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        { 
+            // Create a user
+            addUser2Passwords( adminConnection, "User5", "secret51", "secret52" );
+    
+            // Modify the user with the admin account
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User5,ou=system" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret5Bis" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
+    
+            // Now try to bind with the new password
+            try ( LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User5,ou=system", "secret5Bis" ) )
+            {
+                Entry entry = userConnection.lookup( "cn=User5,ou=system" );
         
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser2Passwords( adminConnection, "User5", "secret51", "secret52" );
-
-        // Modify the user with the admin account
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User5,ou=system" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret5Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.SUCCESS, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        // Now try to bind with the new password
-        LdapConnection userConnection = getNetworkConnectionAs( ldapServer, "cn=User5,ou=system", "secret5Bis" );
-
-        Entry entry = userConnection.lookup( "cn=User5,ou=system" );
-
-        assertNotNull( entry );
-
-        userConnection.close();
-        adminConnection.close();
-        authenticationInterceptor.setPwdPolicies( policyContainer );
+                assertNotNull( entry );
+        
+                userConnection.close();
+            }
+        }
     }
 
 
@@ -1427,23 +1785,22 @@
     @Test
     public void testAdminModifyPasswordBadUser() throws Exception
     {
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User5", "secret5" );
-
-        // Modify the user with the admin account
-
-        // Now change the password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=baduser,ou=system" ) );
-        pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret5Bis" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
-
-        assertEquals( ResultCodeEnum.NO_SUCH_OBJECT, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        adminConnection.close();
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {        
+            addUser( adminConnection, "User5", "secret5" );
+    
+            // Modify the user with the admin account
+    
+            // Now change the password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=baduser,ou=system" ) );
+            pwdModifyRequest.setNewPassword( Strings.getBytesUtf8( "secret5Bis" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            assertEquals( ResultCodeEnum.NO_SUCH_OBJECT, pwdModifyResponse.getLdapResult().getResultCode() );
+        }
     }
 
 
@@ -1453,22 +1810,21 @@
     @Test
     public void testAdminGenPassword() throws Exception
     {
-        LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
-
-        addUser( adminConnection, "User6", "secret6" );
-
-        // Modify the user with the admin account
-
-        // Now request a new password
-        PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
-        pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User6,ou=system" ) );
-
-        // Send the request
-        PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
-
-        // We should not be allowed to do that, as the operation is not yet implemented
-        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
-
-        adminConnection.close();
+        try ( LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() ) )
+        {
+            addUser( adminConnection, "User6", "secret6" );
+    
+            // Modify the user with the admin account
+    
+            // Now request a new password
+            PasswordModifyRequest pwdModifyRequest = new PasswordModifyRequestImpl();
+            pwdModifyRequest.setUserIdentity( Strings.getBytesUtf8( "cn=User6,ou=system" ) );
+    
+            // Send the request
+            PasswordModifyResponse pwdModifyResponse = ( PasswordModifyResponse ) adminConnection.extended( pwdModifyRequest );
+    
+            // We should not be allowed to do that, as the operation is not yet implemented
+            assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, pwdModifyResponse.getLdapResult().getResultCode() );
+        }
     }
 }