diff --git a/asn1/ber/src/main/java/org/apache/directory/api/asn1/ber/Asn1Decoder.java b/asn1/ber/src/main/java/org/apache/directory/api/asn1/ber/Asn1Decoder.java
index 5932498..0da2b56 100644
--- a/asn1/ber/src/main/java/org/apache/directory/api/asn1/ber/Asn1Decoder.java
+++ b/asn1/ber/src/main/java/org/apache/directory/api/asn1/ber/Asn1Decoder.java
@@ -588,6 +588,7 @@
      * </code> otherwise
      * @throws DecoderException Thrown if anything went wrong
      */
+    @SuppressWarnings("unchecked")
     private boolean treatTLVDoneState( ByteBuffer stream, Asn1Container container ) throws DecoderException
     {
         if ( IS_DEBUG )
diff --git a/dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/SearchRequestDsml.java b/dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/SearchRequestDsml.java
index 9c87ae3..b11ed2e 100644
--- a/dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/SearchRequestDsml.java
+++ b/dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/SearchRequestDsml.java
@@ -824,4 +824,40 @@
     {
         return ( SearchRequest ) super.removeControl( control );
     }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isFollowReferrals()
+    {
+        return getDecorated().isFollowReferrals();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest followReferrals()
+    {
+        return getDecorated().followReferrals();
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isIgnoreReferrals()
+    {
+        return getDecorated().isIgnoreReferrals();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest ignoreReferrals()
+    {
+        return getDecorated().ignoreReferrals();
+    }
 }
diff --git a/integ/src/test/java/org/apache/directory/api/ldap/codec/api/StandaloneLdapCodecServiceTest.java b/integ/src/test/java/org/apache/directory/api/ldap/codec/api/StandaloneLdapCodecServiceTest.java
index 57f76ba..49a874b 100644
--- a/integ/src/test/java/org/apache/directory/api/ldap/codec/api/StandaloneLdapCodecServiceTest.java
+++ b/integ/src/test/java/org/apache/directory/api/ldap/codec/api/StandaloneLdapCodecServiceTest.java
@@ -56,8 +56,7 @@
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncInfoValueFactory," +
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncRequestValueFactory," +
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncStateValueFactory," +
-                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory," +
-                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponseFactory" );
+                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory" );
 
         System.setProperty( StandaloneLdapApiService.EXTENDED_OPERATIONS_LIST,
             "org.apache.directory.api.ldap.extras.extended.ads_impl.cancel.CancelFactory," +
diff --git a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/LdapNetworkConnection.java b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/LdapNetworkConnection.java
index d81d9d5..ba7b462 100644
--- a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/LdapNetworkConnection.java
+++ b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/LdapNetworkConnection.java
@@ -117,6 +117,7 @@
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.message.UnbindRequest;
 import org.apache.directory.api.ldap.model.message.UnbindRequestImpl;
+import org.apache.directory.api.ldap.model.message.controls.ManageDsaITImpl;
 import org.apache.directory.api.ldap.model.message.controls.OpaqueControl;
 import org.apache.directory.api.ldap.model.message.extended.AddNoDResponse;
 import org.apache.directory.api.ldap.model.message.extended.BindNoDResponse;
@@ -1667,6 +1668,12 @@
 
         int newId = messageId.incrementAndGet();
         searchRequest.setMessageId( newId );
+        
+        if ( searchRequest.isIgnoreReferrals() )
+        {
+            // We want to ignore the referral, inject the ManageDSAIT control in the request
+            searchRequest.addControl( new ManageDsaITImpl() );
+        }
 
         LOG.debug( "Sending request \n{}", searchRequest );
 
diff --git a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/SearchCursorImpl.java b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/SearchCursorImpl.java
index 82c252b..a5cde7a 100644
--- a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/SearchCursorImpl.java
+++ b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/SearchCursorImpl.java
@@ -31,6 +31,7 @@
 import org.apache.directory.api.ldap.model.cursor.SearchCursor;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.exception.LdapException;
+import org.apache.directory.api.ldap.model.exception.LdapReferralException;
 import org.apache.directory.api.ldap.model.message.IntermediateResponse;
 import org.apache.directory.api.ldap.model.message.Referral;
 import org.apache.directory.api.ldap.model.message.Response;
@@ -365,6 +366,12 @@
         {
             return ( ( SearchResultEntry ) response ).getEntry();
         }
+        
+        if ( isReferral() )
+        {
+            Referral referral = ( ( SearchResultReference ) response ).getReferral();
+            throw new LdapReferralException( referral.getLdapUrls() );
+        }
 
         throw new LdapException();
     }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ExtendedRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ExtendedRequestDecorator.java
index d648fa6..760bdcb 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ExtendedRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/ExtendedRequestDecorator.java
@@ -158,7 +158,6 @@
     /**
      * {@inheritDoc}
      */
-    @SuppressWarnings("unchecked")
     public ExtendedRequest addControl( Control control )
     {
         return ( ExtendedRequest ) super.addControl( control );
@@ -168,7 +167,6 @@
     /**
      * {@inheritDoc}
      */
-    @SuppressWarnings("unchecked")
     public ExtendedRequest addAllControls( Control[] controls )
     {
         return ( ExtendedRequest ) super.addAllControls( controls );
@@ -178,7 +176,6 @@
     /**
      * {@inheritDoc}
      */
-    @SuppressWarnings("unchecked")
     public ExtendedRequest removeControl( Control control )
     {
         return ( ExtendedRequest ) super.removeControl( control );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java
index 732054e..35b3a9a 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java
@@ -49,9 +49,10 @@
     static final boolean IS_DEBUG = LOG.isDebugEnabled();
 
     /** The instance of grammar. SortRequestGrammar is a singleton */
-    private static Grammar<?> instance = new SortRequestGrammar();
+    private static Grammar<SortRequestContainer> instance = new SortRequestGrammar();
 
 
+    @SuppressWarnings("unchecked")
     private SortRequestGrammar()
     {
         setName( SortRequestGrammar.class.getName() );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java
index 96fcfc3..002511c 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java
@@ -46,9 +46,10 @@
     static final boolean IS_DEBUG = LOG.isDebugEnabled();
 
     /** The instance of grammar. SortResponseGrammar is a singleton */
-    private static Grammar<?> instance = new SortResponseGrammar();
+    private static Grammar<SortResponseContainer> instance = new SortResponseGrammar();
 
 
+    @SuppressWarnings("unchecked")
     private SortResponseGrammar()
     {
         setName( SortResponseGrammar.class.getName() );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchRequestDecorator.java
index 2bf5df3..49a8daf 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchRequestDecorator.java
@@ -1127,4 +1127,40 @@
     {
         return ( SearchRequest ) super.removeControl( control );
     }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isFollowReferrals()
+    {
+        return getDecorated().isFollowReferrals();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest followReferrals()
+    {
+        return getDecorated().followReferrals();
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isIgnoreReferrals()
+    {
+        return getDecorated().isIgnoreReferrals();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest ignoreReferrals()
+    {
+        return getDecorated().ignoreReferrals();
+    }
 }
diff --git a/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java b/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java
index 80b065f..671f1df 100644
--- a/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java
+++ b/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/CodecFactoryUtil.java
@@ -35,8 +35,6 @@
 import org.apache.directory.api.ldap.codec.controls.sort.SortResponseFactory;
 import org.apache.directory.api.ldap.extras.controls.ad.AdDirSync;
 import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory;
-import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponse;
-import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponseFactory;
 import org.apache.directory.api.ldap.extras.controls.ppolicy.PasswordPolicy;
 import org.apache.directory.api.ldap.extras.controls.ppolicy_impl.PasswordPolicyFactory;
 import org.apache.directory.api.ldap.extras.controls.syncrepl.syncDone.SyncDoneValue;
@@ -137,10 +135,6 @@
         ControlFactory<AdDirSync> adDirSyncFactory = new AdDirSyncFactory( apiService );
         controlFactories.put( adDirSyncFactory.getOid(), adDirSyncFactory );
         LOG.info( "Registered pre-bundled control factory: {}", adDirSyncFactory.getOid() );
-        
-        ControlFactory<AdDirSyncResponse> adDirSyncResponseFactory = new AdDirSyncResponseFactory( apiService );
-        controlFactories.put( adDirSyncResponseFactory.getOid(), adDirSyncResponseFactory );
-        LOG.info( "Registered pre-bundled control factory: {}", adDirSyncResponseFactory.getOid() );
     }
 
 
diff --git a/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java b/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java
index 4b88405..01a71db 100644
--- a/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java
+++ b/ldap/codec/standalone/src/test/java/org/apache/directory/api/ldap/codec/standalone/AbstractCodecServiceTest.java
@@ -60,8 +60,7 @@
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncInfoValueFactory," +
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncRequestValueFactory," +
                 "org.apache.directory.api.ldap.extras.controls.syncrepl_impl.SyncStateValueFactory," +
-                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory," +
-                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponseFactory" );
+                "org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory" );
 
         System.setProperty( StandaloneLdapApiService.EXTENDED_OPERATIONS_LIST,
             "org.apache.directory.api.ldap.extras.extended.ads_impl.cancel.CancelFactory," +
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
index 8b5fb2a..4b1512b 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSync.java
@@ -33,11 +33,23 @@
  *     criticality             TRUE
  * }
  * 
+ * the control value can be one of the two structures :
+ * 
+ * Client side :
  * realReplControlValue ::= SEQUENCE {
  *     parentsFirst            integer
  *     maxReturnLength         integer
  *     cookie                  OCTET STRING
  * }
+ * 
+ * or
+ * 
+ * server side :
+ * realReplControlValue ::= SEQUENCE {
+ *     flag                  integer
+ *     maxReturnLength       integer
+ *     cookie                OCTET STRING
+ * }
  * </pre> 
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
@@ -83,4 +95,22 @@
      * for the first control.
      */
     void setCookie( byte[] cookie );
+    
+    
+    /**
+     * @return The flag returned by the server. One of :
+     * <ul>
+     * <li>LDAP_DIRSYNC_OBJECT_SECURITY (0x0001)</li>
+     * <li>LDAP_DIRSYNC_ANCESTORS_FIRST_ORDER (0x0800)</li>
+     * <li>LDAP_DIRSYNC_PUBLIC_DATA_ONLY (0x2000)(</li>
+     * <li>LDAP_DIRSYNC_INCREMENTAL_VALUES (0x7FFFFFFF)</li>
+     * </ul>
+     */
+    AdDirSyncFlag getFlag();
+    
+    
+    /**
+     * @param flag The flag. 
+     */
+    void setFlag( AdDirSyncFlag flag );
 }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncImpl.java
index bd38200..91b7dd4 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncImpl.java
@@ -35,6 +35,9 @@
     /** A flag used to tell the server to return the parent before the children */
     int parentFirst = 1;
     
+    /** A flag used to indicate that there are more data to return */
+    AdDirSyncFlag flag = AdDirSyncFlag.DEFAULT;
+
     /** The maximum number of attributes to return */
     int maxReturnLength = 0;
     
@@ -71,6 +74,24 @@
     /**
      * {@inheritDoc}
      */
+    public AdDirSyncFlag getFlag()
+    {
+        return flag;
+    }
+    
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setFlag( AdDirSyncFlag flag )
+    {
+        this.flag = flag;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
     public int getMaxReturnLength()
     {
         return maxReturnLength;
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponse.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponse.java
deleted file mode 100644
index 857286b..0000000
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponse.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-import org.apache.directory.api.ldap.model.message.Control;
-
-/**
- * The AdDirSyncResponse control has the following value :
- * 
- * <pre>
- * Repl    Control ::= SEQUENCE {
- *     controlType             1.2.840.113556.1.4.841
- *     controlValue            replControlValue
- *     criticality             TRUE
- * }
- * 
- * realReplControlValue ::= SEQUENCE {
- *     flag                    integer
- *     maxReturnLength       integer
- *     cookie                  OCTET STRING
- * }
- * </pre>
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public interface AdDirSyncResponse extends Control
-{
-    /** This control OID */
-    static final String OID = "1.2.840.113556.1.4.841";
-    
-    /**
-     * @return The flag returned by the server. One of :
-     * <ul>
-     * <li>LDAP_DIRSYNC_OBJECT_SECURITY (0x0001)</li>
-     * <li>LDAP_DIRSYNC_ANCESTORS_FIRST_ORDER (0x0800)</li>
-     * <li>LDAP_DIRSYNC_PUBLIC_DATA_ONLY (0x2000)(</li>
-     * <li>LDAP_DIRSYNC_INCREMENTAL_VALUES (0x7FFFFFFF)</li>
-     * </ul>
-     */
-    AdDirSyncFlag getFlag();
-    
-    
-    /**
-     * @param flag The flag. 
-     */
-    void setFlag( AdDirSyncFlag flag );
-    
-    
-    /**
-     * @return The maximum length of attributes to be returned
-     */
-    int getMaxReturnLength();
-    
-    
-    /**
-     * @param maxReturnLength The maximum length of attributes to be returned
-     */
-    void setMaxReturnLength( int maxReturnLength );
-    
-    
-    /**
-     * @return The cookie used while processing the successive DirSync operations
-     */
-    byte[] getCookie();
-    
-    
-    /**
-     * @param cookie The cookie to send to the server. It's the value found in the response control. Should be null
-     * for the first control.
-     */
-    void setCookie( byte[] cookie );
-}
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseImpl.java
deleted file mode 100644
index fbb6996..0000000
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-import org.apache.directory.api.ldap.model.message.controls.AbstractControl;
-import org.apache.directory.api.util.Strings;
-
-/**
- * The class implementing the AdDirSyncResponse
- * 
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class AdDirSyncResponseImpl extends AbstractControl implements AdDirSyncResponse
-{
-    /** A flag used to indicate that there are more data to return */
-    AdDirSyncFlag flag = AdDirSyncFlag.DEFAULT;
-    
-    /** The maximum number of attributes to return */
-    int maxReturnLength = 0;
-    
-    /** The DirSync cookie */
-    private byte[] cookie;
-
-    /**
-     * Default constructor for this control
-     */
-    public AdDirSyncResponseImpl()
-    {
-        super( OID, Boolean.TRUE );
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
-    public AdDirSyncFlag getFlag()
-    {
-        return flag;
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
-    public void setFlag( AdDirSyncFlag flag )
-    {
-        this.flag = flag;
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
-    public int getMaxReturnLength()
-    {
-        return maxReturnLength;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void setMaxReturnLength( int maxReturnLength )
-    {
-        this.maxReturnLength = maxReturnLength;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public byte[] getCookie()
-    {
-        return cookie;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void setCookie( byte[] cookie )
-    {
-        if ( cookie != null )
-        {
-            this.cookie = new byte[cookie.length];
-            System.arraycopy( cookie, 0, this.cookie, 0,cookie.length );
-        }
-        else
-        {
-            this.cookie = Strings.EMPTY_BYTES;
-        }
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java
index 7d89001..fb6da06 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/ExtrasBundleActivator.java
@@ -24,8 +24,6 @@
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.extras.controls.ad.AdDirSync;
 import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFactory;
-import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponse;
-import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncResponseFactory;
 import org.apache.directory.api.ldap.extras.controls.ppolicy.PasswordPolicy;
 import org.apache.directory.api.ldap.extras.controls.ppolicy_impl.PasswordPolicyFactory;
 import org.apache.directory.api.ldap.extras.controls.syncrepl.syncDone.SyncDoneValue;
@@ -104,9 +102,6 @@
         
         ControlFactory<AdDirSync> adDirSyncFactory = new AdDirSyncFactory( codec );
         codec.registerControl( adDirSyncFactory );
-        
-        ControlFactory<AdDirSyncResponse> adDirSyncResponseFactory = new AdDirSyncResponseFactory( codec );
-        codec.registerControl( adDirSyncResponseFactory );
     }
 
 
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncDecorator.java
index 04feaa3..0351ec0 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncDecorator.java
@@ -66,10 +66,92 @@
     {
         super( codec, control );
     }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int getParentFirst()
+    {
+        return getDecorated().getParentFirst();
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void setParentFirst( int parentFirst )
+    {
+        getDecorated().setParentFirst( parentFirst );
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public AdDirSyncFlag getFlag()
+    {
+        return getDecorated().getFlag();
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void setFlag( AdDirSyncFlag flag )
+    {
+        getDecorated().setFlag( flag );
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int getMaxReturnLength()
+    {
+        return getDecorated().getMaxReturnLength();
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void setMaxReturnLength( int maxReturnLength )
+    {
+        getDecorated().setMaxReturnLength( maxReturnLength );
+    }
+    
+
+    /**
+     * {@inheritDoc}
+     */
+    public byte[] getCookie()
+    {
+        return getDecorated().getCookie();
+    }
 
 
     /**
-     * Compute the AdDirSync length.
+     * {@inheritDoc}
+     */
+    public void setCookie( byte[] cookie )
+    {
+        // Copy the bytes
+        if ( !Strings.isEmpty( cookie ) )
+        {
+            byte[] copy = new byte[cookie.length];
+            System.arraycopy( cookie, 0, copy, 0, cookie.length );
+            getDecorated().setCookie( copy );
+        }
+        else
+        {
+            getDecorated().setCookie( null );
+        }
+    }
+
+
+    /**
+     * Compute the AdDirSync length. We use the client side control.
      * 0x30 L1
      * |
      * +--> 0x02 0x0(1-4) nnn  (parentFirst)
@@ -105,7 +187,7 @@
 
 
     /**
-     * Encode the AdDirSync control
+     * Encode the AdDirSync control. We use the client side control.
      *
      * @param buffer The encoded sink
      * @return A ByteBuffer that contains the encoded PDU
@@ -177,70 +259,6 @@
     /**
      * {@inheritDoc}
      */
-    public int getParentFirst()
-    {
-        return getDecorated().getParentFirst();
-    }
-
-    
-    /**
-     * {@inheritDoc}
-     */
-    public void setParentFirst( int parentFirst )
-    {
-        getDecorated().setParentFirst( parentFirst );
-    }
-    
-    
-    /**
-     * {@inheritDoc}
-     */
-    public int getMaxReturnLength()
-    {
-        return getDecorated().getMaxReturnLength();
-    }
-
-    
-    /**
-     * {@inheritDoc}
-     */
-    public void setMaxReturnLength( int maxReturnLength )
-    {
-        getDecorated().setMaxReturnLength( maxReturnLength );
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
-    public byte[] getCookie()
-    {
-        return getDecorated().getCookie();
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void setCookie( byte[] cookie )
-    {
-        // Copy the bytes
-        if ( !Strings.isEmpty( cookie ) )
-        {
-            byte[] copy = new byte[cookie.length];
-            System.arraycopy( cookie, 0, copy, 0, cookie.length );
-            getDecorated().setCookie( copy );
-        }
-        else
-        {
-            getDecorated().setCookie( null );
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     public Asn1Object decode( byte[] controlBytes ) throws DecoderException
     {
         ByteBuffer bb = ByteBuffer.wrap( controlBytes );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncGrammar.java
index e6bbd30..b9d7e7c 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncGrammar.java
@@ -36,16 +36,16 @@
 
 /**
  * 
- * Implementation of AdDirSync Control. All the actions are declared in
+ * Implementation of AdDirSync Response Control. All the actions are declared in
  * this class. As it is a singleton, these declaration are only done once.
  *
  *  The decoded grammar is as follows :
  *  
  *  <pre>
  * realReplControlValue ::= SEQUENCE {
- *     parentsFirst            integer
+ *     flag                  integer
  *     maxReturnLength       integer
- *     cookie                  OCTET STRING
+ *     cookie                OCTET STRING
  * }
  * </pre> 
  *  
@@ -81,9 +81,10 @@
          * AdDirSync ::= SEQUENCE {
          *     ...
          *     
-         * Initialize the adSyncDir object
+         * Initialize the adDirSync object
          */
-        super.transitions[AdDirSyncStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = new GrammarTransition<AdDirSyncContainer>(
+        super.transitions[AdDirSyncStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = 
+            new GrammarTransition<AdDirSyncContainer>(
             AdDirSyncStatesEnum.START_STATE, AdDirSyncStatesEnum.AD_DIR_SYNC_SEQUENCE_STATE,
             UniversalTag.SEQUENCE.getValue(),
             new GrammarAction<AdDirSyncContainer>( "Initialization" )
@@ -95,16 +96,16 @@
 
         
         /**
-         * transition from start to parentFirst
+         * transition from start to flag
          * realReplControlValue ::= SEQUENCE {
-         *     parentsFirst            integer
+         *     flag            integer
          *    ....
          * }
          */
         super.transitions[AdDirSyncStatesEnum.AD_DIR_SYNC_SEQUENCE_STATE.ordinal()][UniversalTag.INTEGER
             .getValue()] =
             new GrammarTransition<AdDirSyncContainer>( AdDirSyncStatesEnum.AD_DIR_SYNC_SEQUENCE_STATE,
-                AdDirSyncStatesEnum.PARENT_FIRST_STATE, UniversalTag.INTEGER.getValue(),
+                AdDirSyncStatesEnum.FLAG_STATE, UniversalTag.INTEGER.getValue(),
                 new GrammarAction<AdDirSyncContainer>( "Set AdDirSyncControl parentFirst" )
                 {
                     public void action( AdDirSyncContainer container ) throws DecoderException
@@ -113,18 +114,27 @@
 
                         try
                         {
-                            int parentFirst = IntegerDecoder.parse( value );
+                            int flagValue = IntegerDecoder.parse( value );
+                            
+                            AdDirSyncFlag flag = AdDirSyncFlag.getFlag( flagValue );
+                            
+                            if ( flag == null )
+                            {
+                                String msg = "Error while decoding the AdDirSync flag, unknown value : " + flagValue;
+                                LOG.error( msg );
+                                throw new DecoderException( msg );
+                            }
                             
                             if ( IS_DEBUG )
                             {
-                                LOG.debug( "parentFirst = {}", parentFirst );
+                                LOG.debug( "flag = {}", flagValue );
                             }
                             
-                            container.getAdDirSyncControl().setParentFirst( parentFirst );
+                            container.getAdDirSyncControl().setFlag( flag );
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = "Error while decoding the AdDirSync parentFirst : " + ide.getMessage();
+                            String msg = "Error while decoding the AdDirSync flag : " + ide.getMessage();
                             LOG.error( msg, ide );
                             throw new DecoderException( msg );
                         }
@@ -133,16 +143,16 @@
 
         
         /**
-         * transition from parentFirst to maxReturnLength
+         * transition from flag to maxReturnLength
          * realReplControlValue ::= SEQUENCE {
-         *     parentsFirst            integer
+         *     flag                    integer
          *     maxReturnLength         integer
          *    ....
          * }
          */
-        super.transitions[AdDirSyncStatesEnum.PARENT_FIRST_STATE.ordinal()][UniversalTag.INTEGER
+        super.transitions[AdDirSyncStatesEnum.FLAG_STATE.ordinal()][UniversalTag.INTEGER
             .getValue()] =
-            new GrammarTransition<AdDirSyncContainer>( AdDirSyncStatesEnum.PARENT_FIRST_STATE,
+            new GrammarTransition<AdDirSyncContainer>( AdDirSyncStatesEnum.FLAG_STATE,
                 AdDirSyncStatesEnum.MAX_RETURN_LENGTH_STATE, UniversalTag.INTEGER.getValue(),
                 new GrammarAction<AdDirSyncContainer>( "Set AdDirSyncControl maxReturnLength" )
                 {
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseContainer.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseContainer.java
deleted file mode 100644
index dc8fae3..0000000
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseContainer.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-
-import org.apache.directory.api.asn1.ber.AbstractContainer;
-import org.apache.directory.api.ldap.codec.api.LdapApiService;
-
-
-/**
- * 
- * ASN.1 container for AD DirSyncResponse control.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class AdDirSyncResponseContainer extends AbstractContainer
-{
-    /** adDirSync */
-    private AdDirSyncResponse control;
-
-    private LdapApiService codec;
-
-
-    /**
-     * 
-     * Creates a new AdDirSyncResponseControl Container object.
-     *
-     */
-    public AdDirSyncResponseContainer( LdapApiService codec )
-    {
-        super();
-        this.codec = codec;
-        this.control = new AdDirSyncResponseDecorator( codec );
-        grammar = AdDirSyncResponseGrammar.getInstance();
-        setTransition( AdDirSyncResponseStatesEnum.START_STATE );
-    }
-
-
-    /**
-     * 
-     * Creates a new AdDirSyncResponseControl object.
-     *
-     */
-    public AdDirSyncResponseContainer( LdapApiService codec, AdDirSyncResponse control )
-    {
-        super();
-        this.codec = codec;
-        this.control = control;
-        grammar = AdDirSyncResponseGrammar.getInstance();
-        setTransition( AdDirSyncResponseStatesEnum.START_STATE );
-    }
-
-
-    /**
-     * @return the AdDirSyncResponseControlCodec object
-     */
-    public AdDirSyncResponse getAdDirSyncResponseControl()
-    {
-        return control;
-    }
-
-
-    /**
-     * Set a AdDirSyncResponseControlCodec Object into the container. It will be completed
-     * by the ldapDecoder.
-     * 
-     * @param control the AdDirSyncResponseControlCodec to set.
-     */
-    public void setAdDirSyncControl( AdDirSyncResponse control )
-    {
-        this.control = control;
-    }
-
-
-    public LdapApiService getCodecService()
-    {
-        return codec;
-    }
-
-
-    /**
-     * clean the container
-     */
-    @Override
-    public void clean()
-    {
-        super.clean();
-        control = null;
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseDecorator.java
deleted file mode 100644
index 4a9351c..0000000
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseDecorator.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-import java.nio.ByteBuffer;
-
-import org.apache.directory.api.asn1.Asn1Object;
-import org.apache.directory.api.asn1.DecoderException;
-import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.asn1.ber.Asn1Decoder;
-import org.apache.directory.api.asn1.ber.tlv.BerValue;
-import org.apache.directory.api.asn1.ber.tlv.TLV;
-import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
-import org.apache.directory.api.i18n.I18n;
-import org.apache.directory.api.ldap.codec.api.ControlDecorator;
-import org.apache.directory.api.ldap.codec.api.LdapApiService;
-import org.apache.directory.api.util.Strings;
-
-/**
- * A decorator around AdDirSyncResponse control. It will encode and decode this control.
- * 
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class AdDirSyncResponseDecorator extends ControlDecorator<AdDirSyncResponse> implements AdDirSyncResponse
-{
-    /** The global length for this control */
-    private int adDirSyncResponseLength;
-
-    /** An instance of this decoder */
-    private static final Asn1Decoder decoder = new Asn1Decoder();
-
-
-    /**
-     * Creates a new instance of AdDirSyncResponseControlCodec.
-     */
-    public AdDirSyncResponseDecorator( LdapApiService codec )
-    {
-        super( codec, new AdDirSyncResponseImpl() );
-    }
-
-
-    /**
-     * Creates a new instance of AdDirSyncResponseDecorator.
-     *
-     * @param codec The LDAP codec
-     * @param control The control to be decorated
-     */
-    public AdDirSyncResponseDecorator( LdapApiService codec, AdDirSyncResponse control )
-    {
-        super( codec, control );
-    }
-
-
-    /**
-     * Compute the AdDirSyncResponse length.
-     * 0x30 L1
-     * |
-     * +--> 0x02 0x0(1-4) nnn  (Flag)
-     * +--> 0x02 0x0(1-4) nnn  (maxReturnLength)
-     * +--> 0x04 L2 xkcd!!!... (cookie)
-     */
-    @Override
-    public int computeLength()
-    {
-        // the parentFirst flag length
-        int flagValue = getFlag().getValue();
-        adDirSyncResponseLength = 1 + TLV.getNbBytes( flagValue ) + BerValue.getNbBytes( flagValue );
-
-        // the maxReturnLength length
-        adDirSyncResponseLength += 1 + TLV.getNbBytes( getMaxReturnLength() ) + BerValue.getNbBytes( getMaxReturnLength() );
-
-        // cookie's length
-        byte[] cookie = getCookie();
-        
-        if ( cookie == null )
-        {
-            adDirSyncResponseLength += 1 + 1;
-        }
-        else
-        {
-            adDirSyncResponseLength += 1 + TLV.getNbBytes( cookie.length ) + cookie.length;
-        }
-
-        valueLength = 1 + TLV.getNbBytes( adDirSyncResponseLength ) + adDirSyncResponseLength;
-
-        // Call the super class to compute the global control length
-        return valueLength;
-    }
-
-
-    /**
-     * Encode the AdDirSyncResponse control
-     *
-     * @param buffer The encoded sink
-     * @return A ByteBuffer that contains the encoded PDU
-     * @throws EncoderException If anything goes wrong while encoding.
-     */
-    @Override
-    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
-    {
-        if ( buffer == null )
-        {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
-        }
-
-        // Encode the SEQ
-        buffer.put( UniversalTag.SEQUENCE.getValue() );
-        buffer.put( TLV.getBytes( adDirSyncResponseLength ) );
-
-        // Encode the ParentFirst flag
-        BerValue.encode( buffer, getFlag().getValue() );
-
-        // Encode the MaxReturnLength
-        BerValue.encode( buffer, getMaxReturnLength() );
-        
-        // Encode the cookie
-        BerValue.encode( buffer, getCookie() );
-
-        return buffer;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public byte[] getValue()
-    {
-        if ( value == null )
-        {
-            try
-            {
-                computeLength();
-                ByteBuffer buffer = ByteBuffer.allocate( valueLength );
-
-                // Encode the SEQ
-                buffer.put( UniversalTag.SEQUENCE.getValue() );
-                buffer.put( TLV.getBytes( adDirSyncResponseLength ) );
-
-                // Encode the ParentFirst flag
-                BerValue.encode( buffer, getFlag().getValue() );
-
-                // Encode the MaxReturnLength
-                BerValue.encode( buffer, getMaxReturnLength() );
-                
-                // Encode the cookie
-                BerValue.encode( buffer, getCookie() );
-
-                value = buffer.array();
-            }
-            catch ( Exception e )
-            {
-                return null;
-            }
-        }
-
-        return value;
-    }
-    
-    
-    /**
-     * {@inheritDoc}
-     */
-    public AdDirSyncFlag getFlag()
-    {
-        return getDecorated().getFlag();
-    }
-
-    
-    /**
-     * {@inheritDoc}
-     */
-    public void setFlag( AdDirSyncFlag flag )
-    {
-        getDecorated().setFlag( flag );
-    }
-    
-    
-    /**
-     * {@inheritDoc}
-     */
-    public int getMaxReturnLength()
-    {
-        return getDecorated().getMaxReturnLength();
-    }
-
-    
-    /**
-     * {@inheritDoc}
-     */
-    public void setMaxReturnLength( int maxReturnLength )
-    {
-        getDecorated().setMaxReturnLength( maxReturnLength );
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
-    public byte[] getCookie()
-    {
-        return getDecorated().getCookie();
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void setCookie( byte[] cookie )
-    {
-        // Copy the bytes
-        if ( !Strings.isEmpty( cookie ) )
-        {
-            byte[] copy = new byte[cookie.length];
-            System.arraycopy( cookie, 0, copy, 0, cookie.length );
-            getDecorated().setCookie( copy );
-        }
-        else
-        {
-            getDecorated().setCookie( null );
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public Asn1Object decode( byte[] controlBytes ) throws DecoderException
-    {
-        ByteBuffer bb = ByteBuffer.wrap( controlBytes );
-        AdDirSyncResponseContainer container = new AdDirSyncResponseContainer( getCodecService(), this );
-        decoder.decode( bb, container );
-        return this;
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseFactory.java
deleted file mode 100644
index 2f70449..0000000
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *   Licensed to the Apache Software Foundation (ASF) under one
- *   or more contributor license agreements.  See the NOTICE file
- *   distributed with this work for additional information
- *   regarding copyright ownership.  The ASF licenses this file
- *   to you under the Apache License, Version 2.0 (the
- *   "License"); you may not use this file except in compliance
- *   with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing,
- *   software distributed under the License is distributed on an
- *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *   KIND, either express or implied.  See the License for the
- *   specific language governing permissions and limitations
- *   under the License.
- *
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-
-import org.apache.directory.api.ldap.codec.api.CodecControl;
-import org.apache.directory.api.ldap.codec.api.ControlFactory;
-import org.apache.directory.api.ldap.codec.api.LdapApiService;
-
-
-/**
- * A {@link ControlFactory} which creates {@link AdDirSync} controls.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class AdDirSyncResponseFactory implements ControlFactory<AdDirSyncResponse>
-{
-    /** The codec for this factory */
-    private LdapApiService codec;
-
-
-    /**
-     * Creates a new instance of AdDirSyncResponseFactory.
-     *
-     * @param codec The codec for this factory.
-     */
-    public AdDirSyncResponseFactory( LdapApiService codec )
-    {
-        this.codec = codec;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getOid()
-    {
-        return AdDirSyncResponse.OID;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public CodecControl<AdDirSyncResponse> newCodecControl()
-    {
-        return new AdDirSyncResponseDecorator( codec );
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public CodecControl<AdDirSyncResponse> newCodecControl( AdDirSyncResponse control )
-    {
-        return new AdDirSyncResponseDecorator( codec, control );
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseGrammar.java
deleted file mode 100644
index e38e2e0..0000000
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseGrammar.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-
-import org.apache.directory.api.asn1.DecoderException;
-import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
-import org.apache.directory.api.asn1.ber.grammar.Grammar;
-import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
-import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
-import org.apache.directory.api.asn1.ber.tlv.BerValue;
-import org.apache.directory.api.asn1.ber.tlv.IntegerDecoder;
-import org.apache.directory.api.asn1.ber.tlv.IntegerDecoderException;
-import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
-import org.apache.directory.api.util.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * 
- * Implementation of AdDirSyncResponse Control. All the actions are declared in
- * this class. As it is a singleton, these declaration are only done once.
- *
- *  The decoded grammar is as follows :
- *  
- *  <pre>
- * realReplControlValue ::= SEQUENCE {
- *     flag                  integer
- *     maxReturnLength       integer
- *     cookie                OCTET STRING
- * }
- * </pre> 
- *  
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public final class AdDirSyncResponseGrammar extends AbstractGrammar<AdDirSyncResponseContainer>
-{
-
-    /** the logger */
-    private static final Logger LOG = LoggerFactory.getLogger( AdDirSyncResponseGrammar.class );
-
-    /** speedup for logger */
-    private static final boolean IS_DEBUG = LOG.isDebugEnabled();
-
-    /** AdDirSyncControlGrammar singleton instance */
-    private static final AdDirSyncResponseGrammar INSTANCE = new AdDirSyncResponseGrammar();
-
-
-    /**
-     * 
-     * Creates a new instance of AdDirSyncResponseControlGrammar.
-     *
-     */
-    @SuppressWarnings("unchecked")
-    private AdDirSyncResponseGrammar()
-    {
-        setName( AdDirSyncResponseGrammar.class.getName() );
-
-        super.transitions = new GrammarTransition[AdDirSyncResponseStatesEnum.LAST_AD_DIR_SYNC_RESPONSE_STATE.ordinal()][256];
-
-        /** 
-         * Transition from initial state to AdDirSyncResponse sequence
-         * AdDirSyncResponse ::= SEQUENCE {
-         *     ...
-         *     
-         * Initialize the adDirSyncResponse object
-         */
-        super.transitions[AdDirSyncResponseStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = 
-            new GrammarTransition<AdDirSyncResponseContainer>(
-            AdDirSyncResponseStatesEnum.START_STATE, AdDirSyncResponseStatesEnum.AD_DIR_SYNC_RESPONSE_SEQUENCE_STATE,
-            UniversalTag.SEQUENCE.getValue(),
-            new GrammarAction<AdDirSyncResponseContainer>( "Initialization" )
-            {
-                public void action( AdDirSyncResponseContainer container ) throws DecoderException
-                {
-                }
-            } );
-
-        
-        /**
-         * transition from start to flag
-         * realReplControlValue ::= SEQUENCE {
-         *     flag            integer
-         *    ....
-         * }
-         */
-        super.transitions[AdDirSyncResponseStatesEnum.AD_DIR_SYNC_RESPONSE_SEQUENCE_STATE.ordinal()][UniversalTag.INTEGER
-            .getValue()] =
-            new GrammarTransition<AdDirSyncResponseContainer>( AdDirSyncResponseStatesEnum.AD_DIR_SYNC_RESPONSE_SEQUENCE_STATE,
-                AdDirSyncResponseStatesEnum.FLAG_STATE, UniversalTag.INTEGER.getValue(),
-                new GrammarAction<AdDirSyncResponseContainer>( "Set AdDirSyncResponseControl parentFirst" )
-                {
-                    public void action( AdDirSyncResponseContainer container ) throws DecoderException
-                    {
-                        BerValue value = container.getCurrentTLV().getValue();
-
-                        try
-                        {
-                            int flagValue = IntegerDecoder.parse( value );
-                            
-                            AdDirSyncFlag flag = AdDirSyncFlag.getFlag( flagValue );
-                            
-                            if ( flag == null )
-                            {
-                                String msg = "Error while decoding the AdDirSync flag, unknown value : " + flagValue;
-                                LOG.error( msg );
-                                throw new DecoderException( msg );
-                            }
-                            
-                            if ( IS_DEBUG )
-                            {
-                                LOG.debug( "flag = {}", flagValue );
-                            }
-                            
-                            container.getAdDirSyncResponseControl().setFlag( flag );
-                        }
-                        catch ( IntegerDecoderException ide )
-                        {
-                            String msg = "Error while decoding the AdDirSyncResponse flag : " + ide.getMessage();
-                            LOG.error( msg, ide );
-                            throw new DecoderException( msg );
-                        }
-                    }
-                } );
-
-        
-        /**
-         * transition from flag to maxReturnLength
-         * realReplControlValue ::= SEQUENCE {
-         *     flag                    integer
-         *     maxReturnLength         integer
-         *    ....
-         * }
-         */
-        super.transitions[AdDirSyncResponseStatesEnum.FLAG_STATE.ordinal()][UniversalTag.INTEGER
-            .getValue()] =
-            new GrammarTransition<AdDirSyncResponseContainer>( AdDirSyncResponseStatesEnum.FLAG_STATE,
-                AdDirSyncResponseStatesEnum.MAX_RETURN_LENGTH_STATE, UniversalTag.INTEGER.getValue(),
-                new GrammarAction<AdDirSyncResponseContainer>( "Set AdDirSyncResponseControl maxReturnLength" )
-                {
-                    public void action( AdDirSyncResponseContainer container ) throws DecoderException
-                    {
-                        BerValue value = container.getCurrentTLV().getValue();
-
-                        try
-                        {
-                            int maxReturnLength = IntegerDecoder.parse( value );
-                            
-                            if ( IS_DEBUG )
-                            {
-                                LOG.debug( "maxReturnLength = {}", maxReturnLength );
-                            }
-                            
-                            container.getAdDirSyncResponseControl().setMaxReturnLength( maxReturnLength );
-                        }
-                        catch ( IntegerDecoderException ide )
-                        {
-                            String msg = "Error while decoding the AdDirSyncResponse maxReturnLength : " + ide.getMessage();
-                            LOG.error( msg, ide );
-                            throw new DecoderException( msg );
-                        }
-                    }
-                } );
-        
-        
-        /**
-         * transition from maxReturnLength to cookie
-         *     ...
-         *     maxReturnLength         integer
-         *     cookie                  OCTET STRING
-         * }
-         */
-        super.transitions[AdDirSyncResponseStatesEnum.MAX_RETURN_LENGTH_STATE.ordinal()][UniversalTag.OCTET_STRING
-            .getValue()] =
-            new GrammarTransition<AdDirSyncResponseContainer>( AdDirSyncResponseStatesEnum.MAX_RETURN_LENGTH_STATE,
-                AdDirSyncResponseStatesEnum.COOKIE_STATE, UniversalTag.OCTET_STRING.getValue(),
-                new GrammarAction<AdDirSyncResponseContainer>( "Set AdDirSyncResponseControl cookie" )
-                {
-                    public void action( AdDirSyncResponseContainer container ) throws DecoderException
-                    {
-                        BerValue value = container.getCurrentTLV().getValue();
-
-                        byte[] cookie = value.getData();
-
-                        if ( IS_DEBUG )
-                        {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
-                        }
-
-                        container.getAdDirSyncResponseControl().setCookie( cookie );
-
-                        container.setGrammarEndAllowed( true );
-                    }
-                } );
-    }
-
-
-    /**
-     * @return the singleton instance of the AdDirSyncResponseControlGrammar
-     */
-    public static Grammar<AdDirSyncResponseContainer> getInstance()
-    {
-        return INSTANCE;
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseStatesEnum.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseStatesEnum.java
deleted file mode 100644
index 01b349a..0000000
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseStatesEnum.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-
-import org.apache.directory.api.asn1.ber.grammar.Grammar;
-import org.apache.directory.api.asn1.ber.grammar.States;
-
-
-/**
- * ASN.1 grammar constants of AdDirSyncResponse Control.
- * 
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public enum AdDirSyncResponseStatesEnum implements States
-{
-
-    /** The END_STATE */
-    END_STATE,
-
-    /***/
-    START_STATE,
-
-    /** sequence start state */
-    AD_DIR_SYNC_RESPONSE_SEQUENCE_STATE,
-
-    /** flag state */
-    FLAG_STATE,
-
-    /** maxReturnLength value state */
-    MAX_RETURN_LENGTH_STATE,
-
-    /** cookie value state */
-    COOKIE_STATE,
-
-    /** terminal state */
-    LAST_AD_DIR_SYNC_RESPONSE_STATE;
-
-    /**
-     * Get the grammar name
-     * 
-     * @param grammar The grammar code
-     * @return The grammar name
-     */
-    public String getGrammarName( int grammar )
-    {
-        return "AD_DIR_SYNC_RESPONSE_GRAMMAR";
-    }
-
-
-    /**
-     * Get the grammar name
-     * 
-     * @param grammar The grammar class
-     * @return The grammar name
-     */
-    public String getGrammarName( Grammar<AdDirSyncResponseContainer> grammar )
-    {
-        if ( grammar instanceof AdDirSyncResponseGrammar )
-        {
-            return "AD_DIR_SYNC_RESPONSE_GRAMMAR";
-        }
-
-        return "UNKNOWN GRAMMAR";
-    }
-
-
-    /**
-     * Get the string representing the state
-     * 
-     * @param state The state number
-     * @return The String representing the state
-     */
-    public String getState( int state )
-    {
-        return ( ( state == END_STATE.ordinal() ) ? "AD_DIR_SYNC_RESPONSE_GRAMMAR" : this.name() );
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isEndState()
-    {
-        return this == END_STATE;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public AdDirSyncResponseStatesEnum getStartState()
-    {
-        return START_STATE;
-    }
-}
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncStatesEnum.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncStatesEnum.java
index 218b0ae..90d2a49 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncStatesEnum.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncStatesEnum.java
@@ -41,8 +41,8 @@
     /** sequence start state */
     AD_DIR_SYNC_SEQUENCE_STATE,
 
-    /** parentFirst value state */
-    PARENT_FIRST_STATE,
+    /** flag state */
+    FLAG_STATE,
 
     /** maxReturnLength value state */
     MAX_RETURN_LENGTH_STATE,
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyFactory.java
index f0e43fd..aa640eb 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyFactory.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyFactory.java
@@ -124,6 +124,7 @@
         }
 
         // It's an opaque extended operation
+        @SuppressWarnings("unchecked")
         ExtendedResponseDecorator<ExtendedResponse> response = ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
 
         // Decode the response, as it's an opaque operation
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsFactory.java
index e14cfa9..552b406 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsFactory.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsFactory.java
@@ -116,6 +116,7 @@
         }
 
         // It's an opaque extended operation
+        @SuppressWarnings("unchecked")
         ExtendedResponseDecorator<ExtendedResponse> response = ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
 
         // Decode the response, as it's an opaque operation
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsResponseDecorator.java
index 472bf88..cbfa80f 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTls/StartTlsResponseDecorator.java
@@ -33,12 +33,9 @@
  */
 public class StartTlsResponseDecorator extends ExtendedResponseDecorator<StartTlsResponse> implements StartTlsResponse
 {
-    private StartTlsResponse startTlsResponse;
-
     public StartTlsResponseDecorator( LdapApiService codec, StartTlsResponse decoratedMessage )
     {
         super( codec, decoratedMessage );
-        startTlsResponse = decoratedMessage;
     }
 
 
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java
index 889550d..fdb26f7 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIFactory.java
@@ -122,6 +122,7 @@
         }
 
         // It's an opaque extended operation
+        @SuppressWarnings("unchecked")
         ExtendedResponseDecorator<ExtendedResponse> response = ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
 
         // Decode the response, as it's an opaque operation
diff --git a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncControlTest.java b/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncControlTest.java
index 086486e..96ae4a7 100644
--- a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncControlTest.java
+++ b/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncControlTest.java
@@ -54,7 +54,7 @@
         bb.put( new byte[]
             {
                 0x30, 0x0C,
-                  0x02, 0x01, 0x00,  // parentFirst (false)
+                  0x02, 0x01, 0x01,  // flag (LDAP_DIRSYNC_OBJECT_SECURITY)
                   0x02, 0x01, 0x00,  // maxReturnLength (no limit)
                   0x04, 0x04, 'x', 'k', 'c', 'd' // the cookie 
         } );
@@ -65,16 +65,18 @@
 
         AdDirSync adDirSync = ( AdDirSync ) ( ( AdDirSyncDecorator ) decorator ).decode( bb.array() );
 
-        assertEquals( 0, adDirSync.getParentFirst() );
+        assertEquals( AdDirSyncFlag.LDAP_DIRSYNC_OBJECT_SECURITY, adDirSync.getFlag() );
         assertEquals( 0, adDirSync.getMaxReturnLength() );
         assertEquals( "xkcd", Strings.utf8ToString( adDirSync.getCookie() ) );
 
         // test encoding
+        adDirSync.setParentFirst( 1 );
+        
         try
         {
             ByteBuffer buffer = ( ( AdDirSyncDecorator ) adDirSync ).encode( ByteBuffer
                 .allocate( ( ( AdDirSyncDecorator ) adDirSync ).computeLength() ) );
-            String expected = Strings.dumpBytes( bb.array() );
+            String expected = "0x30 0x0C 0x02 0x01 0x01 0x02 0x01 0x00 0x04 0x04 0x78 0x6B 0x63 0x64 ";
             String decoded = Strings.dumpBytes( buffer.array() );
             assertEquals( expected, decoded );
         }
@@ -93,7 +95,7 @@
         bb.put( new byte[]
             {
                 0x30, 0x08,
-                  0x02, 0x01, 0x00,  // parentFirst (false)
+                  0x02, 0x01, 0x01,  // flag (LDAP_DIRSYNC_OBJECT_SECURITY)
                   0x02, 0x01, 0x00,  // maxReturnLength (no limit)
                   0x04, 0x00         // the cookie 
         } );
@@ -104,16 +106,18 @@
 
         AdDirSync adDirSync = ( AdDirSync ) ( ( AdDirSyncDecorator ) decorator ).decode( bb.array() );
 
-        assertEquals( 0, adDirSync.getParentFirst() );
+        assertEquals( AdDirSyncFlag.LDAP_DIRSYNC_OBJECT_SECURITY, adDirSync.getFlag() );
         assertEquals( 0, adDirSync.getMaxReturnLength() );
         assertEquals( "", Strings.utf8ToString( adDirSync.getCookie() ) );
 
         // test encoding
+        adDirSync.setParentFirst( 1 );
+
         try
         {
             ByteBuffer buffer = ( ( AdDirSyncDecorator ) adDirSync ).encode( ByteBuffer
                 .allocate( ( ( AdDirSyncDecorator ) adDirSync ).computeLength() ) );
-            String expected = Strings.dumpBytes( bb.array() );
+            String expected = "0x30 0x08 0x02 0x01 0x01 0x02 0x01 0x00 0x04 0x00 ";
             String decoded = Strings.dumpBytes( buffer.array() );
             assertEquals( expected, decoded );
         }
diff --git a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseControlTest.java b/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseControlTest.java
deleted file mode 100644
index b0e7480..0000000
--- a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/controls/ad/AdDirSyncResponseControlTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-package org.apache.directory.api.ldap.extras.controls.ad;
-
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.nio.ByteBuffer;
-
-import org.apache.directory.api.asn1.DecoderException;
-import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.ldap.extras.AbstractCodecServiceTest;
-import org.apache.directory.api.util.Strings;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import com.mycila.junit.concurrent.Concurrency;
-import com.mycila.junit.concurrent.ConcurrentJunitRunner;
-
-
-/**
- * 
- * TestCase for AdDirSyncResponseControlCodec .
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-@RunWith(ConcurrentJunitRunner.class)
-@Concurrency()
-public class AdDirSyncResponseControlTest extends AbstractCodecServiceTest
-{
-    @Test
-    public void testAdDirSyncResponseControl() throws Exception
-    {
-        ByteBuffer bb = ByteBuffer.allocate( 0x0E );
-
-        bb.put( new byte[]
-            {
-                0x30, 0x0C,
-                  0x02, 0x01, 0x01,  // flag (LDAP_DIRSYNC_OBJECT_SECURITY)
-                  0x02, 0x01, 0x00,  // maxReturnLength (no limit)
-                  0x04, 0x04, 'x', 'k', 'c', 'd' // the cookie 
-        } );
-
-        bb.flip();
-
-        AdDirSyncResponse decorator = new AdDirSyncResponseDecorator( codec );
-
-        AdDirSyncResponse adDirSyncResponse = ( AdDirSyncResponse ) ( ( AdDirSyncResponseDecorator ) decorator ).decode( bb.array() );
-
-        assertEquals( AdDirSyncFlag.LDAP_DIRSYNC_OBJECT_SECURITY, adDirSyncResponse.getFlag() );
-        assertEquals( 0, adDirSyncResponse.getMaxReturnLength() );
-        assertEquals( "xkcd", Strings.utf8ToString( adDirSyncResponse.getCookie() ) );
-
-        // test encoding
-        try
-        {
-            ByteBuffer buffer = ( ( AdDirSyncResponseDecorator ) adDirSyncResponse ).encode( ByteBuffer
-                .allocate( ( ( AdDirSyncResponseDecorator ) adDirSyncResponse ).computeLength() ) );
-            String expected = Strings.dumpBytes( bb.array() );
-            String decoded = Strings.dumpBytes( buffer.array() );
-            assertEquals( expected, decoded );
-        }
-        catch ( EncoderException e )
-        {
-            fail( e.getMessage() );
-        }
-    }
-
-
-    @Test
-    public void testAdDirSyncResponseControlNoCookie() throws Exception
-    {
-        ByteBuffer bb = ByteBuffer.allocate( 0x0A );
-
-        bb.put( new byte[]
-            {
-                0x30, 0x08,
-                  0x02, 0x01, 0x01,  // flag (LDAP_DIRSYNC_OBJECT_SECURITY)
-                  0x02, 0x01, 0x00,  // maxReturnLength (no limit)
-                  0x04, 0x00         // the cookie 
-        } );
-
-        bb.flip();
-
-        AdDirSyncResponse decorator = new AdDirSyncResponseDecorator( codec );
-
-        AdDirSyncResponse adDirSyncResponse = ( AdDirSyncResponse ) ( ( AdDirSyncResponseDecorator ) decorator ).decode( bb.array() );
-
-        assertEquals( AdDirSyncFlag.LDAP_DIRSYNC_OBJECT_SECURITY, adDirSyncResponse.getFlag() );
-        assertEquals( 0, adDirSyncResponse.getMaxReturnLength() );
-        assertEquals( "", Strings.utf8ToString( adDirSyncResponse.getCookie() ) );
-
-        // test encoding
-        try
-        {
-            ByteBuffer buffer = ( ( AdDirSyncResponseDecorator ) adDirSyncResponse ).encode( ByteBuffer
-                .allocate( ( ( AdDirSyncResponseDecorator ) adDirSyncResponse ).computeLength() ) );
-            String expected = Strings.dumpBytes( bb.array() );
-            String decoded = Strings.dumpBytes( buffer.array() );
-            assertEquals( expected, decoded );
-        }
-        catch ( EncoderException e )
-        {
-            fail( e.getMessage() );
-        }
-    }
-    
-    
-    @Test
-    public void testAdDirSyncResponseControlAbsentCookie() throws Exception
-    {
-        ByteBuffer bb = ByteBuffer.allocate( 0x08 );
-
-        bb.put( new byte[]
-            {
-                0x30, 0x06,
-                  0x02, 0x01, 0x01,  // parentFirst (LDAP_DIRSYNC_ANCESTORS_FIRST_ORDER)
-                  0x02, 0x01, 0x00   // maxReturnLength (no limit)
-        } );
-
-        bb.flip();
-
-        AdDirSyncResponse decorator = new AdDirSyncResponseDecorator( codec );
-
-        try
-        {
-            ( ( AdDirSyncResponseDecorator ) decorator ).decode( bb.array() );
-            fail();
-        }
-        catch ( DecoderException de )
-        {
-            // expected
-        }
-    }
-    
-    
-    @Test
-    public void testAdDirSyncResponseControlAbsentParentFirst() throws Exception
-    {
-        ByteBuffer bb = ByteBuffer.allocate( 0x07 );
-
-        bb.put( new byte[]
-            {
-                0x30, 0x05,
-                  0x02, 0x01, 0x00,  // maxReturnLength (no limit)
-                  0x04, 0x00         // cookie
-        } );
-
-        bb.flip();
-
-        AdDirSyncResponse decorator = new AdDirSyncResponseDecorator( codec );
-
-        try
-        {
-            ( ( AdDirSyncResponseDecorator ) decorator ).decode( bb.array() );
-            fail();
-        }
-        catch ( DecoderException de )
-        {
-            // expected
-        }
-    }
-    
-    
-    @Test
-    public void testAdDirSyncResponseControlEmpty() throws Exception
-    {
-        ByteBuffer bb = ByteBuffer.allocate( 0x02 );
-
-        bb.put( new byte[]
-            {
-                0x30, 0x00,
-        } );
-
-        bb.flip();
-
-        AdDirSyncResponse decorator = new AdDirSyncResponseDecorator( codec );
-
-        try
-        {
-            ( ( AdDirSyncResponseDecorator ) decorator ).decode( bb.array() );
-            fail();
-        }
-        catch ( DecoderException de )
-        {
-            // expected
-        }
-    }
-}
diff --git a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java b/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java
index f40d127..6816059 100644
--- a/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java
+++ b/ldap/extras/codec/src/test/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseTest.java
@@ -62,7 +62,7 @@
         stream.put( new byte[]
             {} ).flip();
 
-        String decodedPdu = Strings.dumpBytes( stream.array() );
+        Strings.dumpBytes( stream.array() );
 
         // Allocate a WhoAmI Container
         Asn1Container whoAmIResponseContainer = new WhoAmIResponseContainer();
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java
index 0f04797..f967cc1 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java
@@ -991,7 +991,6 @@
      * the original object won't affect the cloned object, as a modification
      * on the cloned object has no impact on the original object
      */
-    @SuppressWarnings("unchecked")
     public Entry clone()
     {
         // First, clone the structure
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifEntry.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifEntry.java
index cea572c..2e1be30 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifEntry.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifEntry.java
@@ -223,6 +223,15 @@
         // Now, parse the Ldif and convert it to a LdifEntry
         LdifReader reader = new LdifReader();
         List<LdifEntry> ldifEntries = reader.parseLdif( sb.toString() );
+        
+        try
+        {
+            reader.close();
+        }
+        catch ( IOException e )
+        {
+            e.printStackTrace();
+        }
 
         if ( ( ldifEntries != null ) && ( ldifEntries.size() == 1 ) )
         {
@@ -258,6 +267,7 @@
                     {
                         modifications.put( modification.getAttribute().getId(), modification );
                     }
+                    
                     break;
             }
         }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifUtils.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifUtils.java
index 139344e..7c77bcc 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifUtils.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/ldif/LdifUtils.java
@@ -20,6 +20,7 @@
 package org.apache.directory.api.ldap.model.ldif;
 
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 
 import javax.naming.directory.Attributes;
@@ -269,7 +270,18 @@
     {
         LdifAttributesReader reader = new LdifAttributesReader();
 
-        return AttributeUtils.toAttributes( reader.parseEntry( ldif ) );
+        try
+        {
+            Attributes attributes = AttributeUtils.toAttributes( reader.parseEntry( ldif ) );
+            
+            reader.close();
+            
+            return attributes;
+        }
+        catch ( IOException ioe )
+        {
+            throw new LdapLdifException( ioe.getMessage() );
+        }
     }
 
 
@@ -727,6 +739,15 @@
 
         LdifAttributesReader reader = new LdifAttributesReader();
         Attributes attributes = AttributeUtils.toAttributes( reader.parseEntry( sb.toString() ) );
+        
+        try
+        {
+            reader.close();
+        }
+        catch ( IOException e )
+        {
+            e.printStackTrace();
+        }
 
         return attributes;
     }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ReferralsPolicyEnum.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ReferralsPolicyEnum.java
new file mode 100644
index 0000000..1ff19f9
--- /dev/null
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ReferralsPolicyEnum.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ * 
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ * 
+ */
+package org.apache.directory.api.ldap.model.message;
+
+/**
+ * An enum describing the three possible actions for referrals :
+ * <ul>
+ * <li>Ignore : The referrals will be retruned as is (ie, the 'ref' attribute type will be present in the entry</li>
+ * <li>Follow : The referral will be chased by the client</li>
+ * <li>Throws : An LdapReferralException will be thrown</li>
+ * </ul>
+ * @author <a href="mailto:dev@directory.apache.org"> Apache Directory Project</a>
+ */
+public enum ReferralsPolicyEnum
+{
+    IGNORE,
+    FOLLOW,
+    THROW
+}
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ResultCodeEnum.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ResultCodeEnum.java
index 6e78ba5..2dc4a68 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ResultCodeEnum.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ResultCodeEnum.java
@@ -1693,6 +1693,10 @@
 
             case UNBIND_REQUEST:
                 return set.iterator().next();
+                
+            case INTERMEDIATE_RESPONSE :
+                candidates = intersection( set, SEARCH_CODES );
+                break;
         }
 
         // we don't want any codes that do not have anything to do w/ errors
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequest.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequest.java
index e8a1ab4..e3fdc1a 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequest.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequest.java
@@ -270,4 +270,34 @@
      * {@inheritDoc}
      */
     SearchRequest removeControl( Control control );
+    
+    
+    /**
+     * Tells the client if it should follow referrals instead of throwing exceptions
+     * @return true if we should follow the referrals
+     */
+    boolean isFollowReferrals();
+    
+    
+    /**
+     * Tells the client to follow referrals instead of throwing exceptions
+     * @return The SearchRequest instance
+     */
+    SearchRequest followReferrals();
+    
+    
+    /**
+     * Tells the client if it should ignore referrals instead of throwing exceptions
+     * @return true if we should ignore the referrals
+     */
+    boolean isIgnoreReferrals();
+    
+    
+    /**
+     * Tells the client to ignore referrals instead of throwing exceptions. The entry
+     * will contain the referral attributeType with the link.
+     * 
+     * @return The SearchRequest instance
+     */
+    SearchRequest ignoreReferrals();
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequestImpl.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequestImpl.java
index c544cf9..36689ae 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequestImpl.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/SearchRequestImpl.java
@@ -70,6 +70,9 @@
 
     /** The final result containing SearchResponseDone response */
     private SearchResultDone response;
+    
+    /** A flag set to tell the search what to do wth referrals */
+    private ReferralsPolicyEnum referralHandling = ReferralsPolicyEnum.THROW;
 
 
     // -----------------------------------------------------------------------
@@ -588,4 +591,44 @@
 
         return super.toString( sb.toString() );
     }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isFollowReferrals()
+    {
+        return referralHandling == ReferralsPolicyEnum.FOLLOW;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest followReferrals()
+    {
+        referralHandling = ReferralsPolicyEnum.FOLLOW;
+        
+        return this;
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isIgnoreReferrals()
+    {
+        return referralHandling == ReferralsPolicyEnum.IGNORE;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SearchRequest ignoreReferrals()
+    {
+        referralHandling = ReferralsPolicyEnum.IGNORE;
+        
+        return this;
+    }
 }
\ No newline at end of file
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/registries/Registries.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/registries/Registries.java
index 2ba3db6..7982d48 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/registries/Registries.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/registries/Registries.java
@@ -725,6 +725,22 @@
                 case OBJECT_CLASS:
                     ObjectClassHelper.removeFromRegistries( ( ObjectClass ) schemaObject, errors, this );
                     break;
+                    
+                case DIT_CONTENT_RULE :
+                    // TODO
+                    break;
+                    
+                case DIT_STRUCTURE_RULE :
+                    // TODO
+                    break;
+                    
+                case NAME_FORM :
+                    // TODO
+                    break;
+                    
+                case MATCHING_RULE_USE :
+                    // TODO
+                    break;
             }
         }
         catch ( LdapException ne )
diff --git a/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schemaextractor/impl/DefaultSchemaLdifExtractor.java b/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schemaextractor/impl/DefaultSchemaLdifExtractor.java
index 1b1febb..0004424 100644
--- a/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schemaextractor/impl/DefaultSchemaLdifExtractor.java
+++ b/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schemaextractor/impl/DefaultSchemaLdifExtractor.java
@@ -209,9 +209,11 @@
 
         FileWriter out = new FileWriter( destination );
 
+        LdifReader ldifReader = null;
+        
         try
         {
-            LdifReader ldifReader = new LdifReader( source );
+            ldifReader = new LdifReader( source );
             boolean first = true;
             LdifEntry ldifEntry = null;
 
@@ -239,8 +241,6 @@
                 }
             }
 
-            ldifReader.close();
-
             // Add the version at the first line, to avoid a warning
             String ldifString = "version: 1\n" + ldifEntry.toString();
 
@@ -261,6 +261,7 @@
         }
         finally
         {
+            ldifReader.close();
             out.close();
         }
     }
diff --git a/util/src/main/java/org/apache/directory/api/util/OsgiUtils.java b/util/src/main/java/org/apache/directory/api/util/OsgiUtils.java
index e66f0f2..6b779ee 100644
--- a/util/src/main/java/org/apache/directory/api/util/OsgiUtils.java
+++ b/util/src/main/java/org/apache/directory/api/util/OsgiUtils.java
@@ -181,7 +181,7 @@
      */
     public static String getBundleExports( File bundle )
     {
-        JarFile jar;
+        JarFile jar = null;
         try
         {
             jar = new JarFile( bundle );
@@ -207,5 +207,19 @@
             LOG.error( "Failed to open jar file or manifest.", e );
             throw new RuntimeException( "Failed to open jar file or manifest.", e );
         }
+        finally
+        {
+            if ( jar != null )
+            {
+                try
+                {
+                    jar.close();
+                }
+                catch ( IOException e )
+                {
+                    e.printStackTrace();
+                }
+            }
+        }
     }
 }
