fixing compilation errors

git-svn-id: https://svn.apache.org/repos/asf/directory/apacheds/trunk@1065336 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/LdapProtocolHandler.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/LdapProtocolHandler.java
index fb038d5..7a25ee0 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/LdapProtocolHandler.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/LdapProtocolHandler.java
@@ -21,12 +21,14 @@
 
 
 import org.apache.directory.shared.ldap.codec.LdapMessageContainer;
+import org.apache.directory.shared.ldap.codec.decorators.MessageDecorator;
 import org.apache.directory.shared.ldap.message.extended.NoticeOfDisconnect;
 import org.apache.directory.shared.ldap.message.spi.BinaryAttributeDetector;
 import org.apache.directory.shared.ldap.model.exception.ResponseCarryingMessageException;
 import org.apache.directory.shared.ldap.model.message.Control;
 import org.apache.directory.shared.ldap.model.message.ExtendedRequest;
 import org.apache.directory.shared.ldap.model.message.ExtendedRequestImpl;
+import org.apache.directory.shared.ldap.model.message.Message;
 import org.apache.directory.shared.ldap.model.message.Request;
 import org.apache.directory.shared.ldap.model.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.model.message.ResultResponse;
@@ -87,7 +89,9 @@
         session.setAttribute( "maxPDUSize", ldapServer.getDirectoryService().getMaxPDUSize() );
         
         // Last, store the message container
-        LdapMessageContainer ldapMessageContainer = new LdapMessageContainer( 
+        LdapMessageContainer<? extends MessageDecorator<Message>> ldapMessageContainer = 
+            new LdapMessageContainer<MessageDecorator<Message>>( 
+            ldapServer.getDirectoryService().getLdapCodecService(),
             new BinaryAttributeDetector()
             {
                 public boolean isBinary( String id )
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
index d59f697..81f80c3 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
@@ -460,7 +460,8 @@
                 }
             }
 
-            pagedResultsControl = new PagedResultsDecorator();
+            pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                .getLdapCodecService() );
             pagedResultsControl.setCritical( true );
             pagedResultsControl.setSize( 0 );
             req.getResultResponse().addControl( pagedResultsControl );
@@ -517,7 +518,8 @@
             // cursor stored into the session (if any)
             int cookieValue = pagedSearchControl.getCookieValue();
             PagedSearchContext psCookie = session.removePagedSearchContext( cookieValue );
-            pagedResultsControl = new PagedResultsDecorator();
+            pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                .getLdapCodecService() );
             pagedResultsControl.setCookie( psCookie.getCookie() );
             pagedResultsControl.setSize( 0 );
             pagedResultsControl.setCritical( true );
@@ -532,7 +534,8 @@
         }
         else
         {
-            pagedResultsControl = new PagedResultsDecorator();
+            pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                .getLdapCodecService() );
             pagedResultsControl.setSize( 0 );
             pagedResultsControl.setCritical( true );
         }
@@ -649,7 +652,8 @@
 
                 session.addPagedSearchContext( pagedContext );
                 cookie = pagedContext.getCookie();
-                pagedResultsControl = new PagedResultsDecorator();
+                pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                    .getLdapCodecService() );
                 pagedResultsControl.setCookie( cookie );
                 pagedResultsControl.setSize( 0 );
                 pagedResultsControl.setCritical( true );
@@ -688,7 +692,8 @@
 
                 // get the cookie
                 cookie = pagedContext.getCookie();
-                pagedResultsControl = new PagedResultsDecorator();
+                pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                    .getLdapCodecService() );
                 pagedResultsControl.setCookie( cookie );
                 pagedResultsControl.setSize( 0 );
                 pagedResultsControl.setCritical( true );
@@ -711,7 +716,8 @@
                 session.addPagedSearchContext( pagedContext );
 
                 cookie = pagedContext.getCookie();
-                pagedResultsControl = new PagedResultsDecorator();
+                pagedResultsControl = new PagedResultsDecorator( ldapServer.getDirectoryService()
+                    .getLdapCodecService() );
                 pagedResultsControl.setCookie( cookie );
                 pagedResultsControl.setSize( 0 );
                 pagedResultsControl.setCritical( true );
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/bind/AbstractSaslCallbackHandler.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/bind/AbstractSaslCallbackHandler.java
index 784bfff..d1b1d93 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/bind/AbstractSaslCallbackHandler.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/bind/AbstractSaslCallbackHandler.java
@@ -240,7 +240,8 @@
         {
             Control[] connCtls = bindRequest.getControls().values().toArray( EMPTY );
             env.put( DirectoryService.JNDI_KEY, directoryService );
-            ctx = new InitialLdapContext( env, JndiUtils.toJndiControls( connCtls ) );
+            ctx = new InitialLdapContext( env, JndiUtils.toJndiControls( directoryService.getLdapCodecService(), 
+                connCtls ) );
         }
         catch ( Exception e )
         {
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java
index d8c1c83..f1cf752 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java
@@ -29,6 +29,8 @@
 
 import org.apache.directory.server.core.event.EventType;
 import org.apache.directory.shared.i18n.I18n;
+import org.apache.directory.shared.ldap.codec.DefaultLdapCodecService;
+import org.apache.directory.shared.ldap.codec.ILdapCodecService;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.SyncModifyDnDecorator;
 import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
 import org.apache.directory.shared.ldap.model.entry.EntryAttribute;
@@ -59,11 +61,14 @@
     private static final Logger LOG = LoggerFactory.getLogger( ReplicaEventMessage.class );
 
     private static SchemaManager schemaManager;
+    
+    private transient ILdapCodecService codec;
 
 
     public ReplicaEventMessage()
     {
         // used by deserializer
+        codec = new DefaultLdapCodecService();
     }
 
 
@@ -76,6 +81,7 @@
 
     public ReplicaEventMessage( SyncModifyDnDecorator modDnControl, Entry entry )
     {
+        codec = new DefaultLdapCodecService();
         this.modDnControl = modDnControl;
         this.entry = entry;
     }
@@ -107,7 +113,7 @@
         {
             SyncModifyDnType modDnType = SyncModifyDnType.getModifyDnType( in.readShort() );
             
-            modDnControl = new SyncModifyDnDecorator();
+            modDnControl = new SyncModifyDnDecorator( codec );
             modDnControl.setModDnType( modDnType );
             
             modDnControl.setEntryDn( Unicode.readUTF(in) );
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java
index d04259a..660d200 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplConsumer.java
@@ -42,16 +42,12 @@
 import org.apache.directory.shared.ldap.codec.controls.ManageDsaITDecorator;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncDoneValue.ISyncDoneValue;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncDoneValue.SyncDoneValueDecorator;
-import org.apache.directory.shared.ldap.codec.controls.replication.syncDoneValue.SyncDoneValueControlDecoder;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncInfoValue.ISyncInfoValue;
-import org.apache.directory.shared.ldap.codec.controls.replication.syncInfoValue.SyncInfoValueControlDecoder;
+import org.apache.directory.shared.ldap.codec.controls.replication.syncInfoValue.SyncInfoValueDecorator;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncRequestValue.SyncRequestValueDecorator;
-import org.apache.directory.shared.ldap.codec.controls.replication.syncStateValue.ISyncStateValue;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncStateValue.SyncStateValueDecorator;
-import org.apache.directory.shared.ldap.codec.controls.replication.syncStateValue.SyncStateValueControlDecoder;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.ISyncModifyDn;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.SyncModifyDnDecorator;
-import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.SyncModifyDnDecorator;
 import org.apache.directory.shared.ldap.message.control.replication.SyncModifyDnType;
 import org.apache.directory.shared.ldap.message.control.replication.SyncStateTypeEnum;
 import org.apache.directory.shared.ldap.message.control.replication.SynchronizationModeEnum;
@@ -125,9 +121,6 @@
     /** the schema manager */
     private SchemaManager schemaManager;
 
-    /** the decoder for syncinfovalue control */
-    private SyncInfoValueControlDecoder decoder = new SyncInfoValueControlDecoder();
-
     /** the cookie file */
     private File cookieFile;
 
@@ -137,12 +130,6 @@
     /** the core session */
     private CoreSession session;
 
-    private SyncDoneValueControlDecoder syncDoneControlDecoder = new SyncDoneValueControlDecoder();
-
-    private SyncStateValueControlDecoder syncStateControlDecoder = new SyncStateValueControlDecoder();
-
-    private SyncModifyDnControlDecoder syncModifyDnControlDecoder = new SyncModifyDnControlDecoder();
-
     /** attributes on which modification should be ignored */
     private static final String[] MOD_IGNORE_AT = new String[]
         { SchemaConstants.ENTRY_UUID_AT, SchemaConstants.ENTRY_CSN_AT, SchemaConstants.MODIFIERS_NAME_AT,
@@ -278,7 +265,7 @@
 
         if ( !config.isChaseReferrals() )
         {
-            searchRequest.addControl( new ManageDsaITDecorator() );
+            searchRequest.addControl( new ManageDsaITDecorator( directoryService.getLdapCodecService() ) );
         }
     }
 
@@ -288,18 +275,8 @@
         LOG.debug( "///////////////// handleSearchDone //////////////////" );
 
         Control ctrl = searchDone.getControls().get( ISyncDoneValue.OID );
-        SyncDoneValueDecorator syncDoneCtrl = new SyncDoneValueDecorator();
-        try
-        {
-            if ( ctrl != null )
-            {
-                syncDoneCtrl = ( SyncDoneValueDecorator ) syncDoneControlDecoder.decode( ctrl.getValue(), syncDoneCtrl );
-            }
-        }
-        catch ( Exception e )
-        {
-            LOG.error( "Failed to decode the syncDoneControlCodec", e );
-        }
+        SyncDoneValueDecorator syncDoneCtrl = new SyncDoneValueDecorator( directoryService.getLdapCodecService() );
+        syncDoneCtrl.setDecorated( ( ISyncDoneValue ) ctrl );
 
         if ( syncDoneCtrl.getCookie() != null )
         {
@@ -326,23 +303,13 @@
 
         LOG.debug( "------------- starting handleSearchResult ------------" );
 
-        SyncStateValueDecorator syncStateCtrl = new SyncStateValueDecorator();
+        SyncStateValueDecorator syncStateCtrl = new SyncStateValueDecorator( directoryService.getLdapCodecService() );
 
         try
         {
             Entry remoteEntry = syncResult.getEntry();
 
-            Control ctrl = syncResult.getControls().get( ISyncStateValue.OID );
-
-            try
-            {
-                syncStateCtrl = ( SyncStateValueDecorator ) syncStateControlDecoder.decode( ctrl.getValue(),
-                    syncStateCtrl );
-            }
-            catch ( Exception e )
-            {
-                LOG.error( "Failed to decode syncStateControl", e );
-            }
+            syncStateCtrl.setDecorated( syncStateCtrl );
 
             if ( syncStateCtrl.getCookie() != null )
             {
@@ -386,12 +353,9 @@
                 case MODDN:
                     Control adsModDnControl = syncResult.getControls().get( ISyncModifyDn.OID );
                     //Apache Directory Server's special control
-                    SyncModifyDnDecorator syncModDnControl = new SyncModifyDnDecorator();
-
-                    LOG.debug( "decoding the SyncModifyDnControl.." );
-                    syncModDnControl = ( SyncModifyDnDecorator ) syncModifyDnControlDecoder.decode( adsModDnControl
-                        .getValue(), syncModDnControl );
-
+                    SyncModifyDnDecorator syncModDnControl = 
+                        new SyncModifyDnDecorator( directoryService.getLdapCodecService() );
+                    syncModDnControl.setDecorated( ( ISyncModifyDn ) adsModDnControl );
                     applyModDnOperation( syncModDnControl );
                     break;
 
@@ -432,8 +396,10 @@
         {
             LOG.debug( "............... inside handleSyncInfo ..............." );
 
+            SyncInfoValueDecorator decorator = new SyncInfoValueDecorator( directoryService.getLdapCodecService() );
             byte[] syncinfo = syncInfoResp.getResponseValue();
-            ISyncInfoValue syncInfoValue = ( ISyncInfoValue ) decoder.decode( syncinfo, null );
+            decorator.setValue( syncinfo );
+            ISyncInfoValue syncInfoValue = decorator.getDecorated();
 
             byte[] cookie = syncInfoValue.getCookie();
 
@@ -537,7 +503,7 @@
      */
     private void doSyncSearch( SynchronizationModeEnum syncType, boolean reloadHint ) throws Exception
     {
-        SyncRequestValueDecorator syncReq = new SyncRequestValueDecorator();
+        SyncRequestValueDecorator syncReq = new SyncRequestValueDecorator( directoryService.getLdapCodecService() );
 
         syncReq.setMode( syncType );
         syncReq.setReloadHint( reloadHint );
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplProvider.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplProvider.java
index 11668f7..ba68de2 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplProvider.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplProvider.java
@@ -328,7 +328,9 @@
             IntermediateResponse intermResp = new IntermediateResponseImpl( req.getMessageId() );
             intermResp.setResponseName( ISyncInfoValue.OID );
 
-            SyncInfoValueDecorator syncInfo = new SyncInfoValueDecorator( SynchronizationInfoEnum.NEW_COOKIE );
+            SyncInfoValueDecorator syncInfo = new SyncInfoValueDecorator( ldapServer.getDirectoryService()
+                .getLdapCodecService(),
+                SynchronizationInfoEnum.NEW_COOKIE );
             syncInfo.setCookie( cookie );
             intermResp.setResponseValue( syncInfo.getValue() );
 
@@ -340,7 +342,8 @@
         {
             SearchResultDone searchDoneResp = ( SearchResultDone ) req.getResultResponse();
             searchDoneResp.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
-            SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator();
+            SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator( 
+                ldapServer.getDirectoryService().getLdapCodecService() );
             syncDone.setCookie( cookie );
             searchDoneResp.addControl( syncDone );
 
@@ -421,7 +424,8 @@
                 IntermediateResponse intermResp = new IntermediateResponseImpl( req.getMessageId() );
                 intermResp.setResponseName( ISyncInfoValue.OID );
 
-                SyncInfoValueDecorator syncInfo = new SyncInfoValueDecorator( SynchronizationInfoEnum.NEW_COOKIE );
+                SyncInfoValueDecorator syncInfo = new SyncInfoValueDecorator( 
+                    ldapServer.getDirectoryService().getLdapCodecService(), SynchronizationInfoEnum.NEW_COOKIE );
                 syncInfo.setCookie( cookie );
                 intermResp.setResponseValue( syncInfo.getValue() );
 
@@ -433,7 +437,8 @@
             else
             {
                 // no need to send from the log, that will be done in the next refreshOnly session
-                SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator();
+                SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator(
+                    ldapServer.getDirectoryService().getLdapCodecService() );
                 syncDone.setCookie( cookie );
                 searchDoneResp.addControl( syncDone );
                 session.getIoSession().write( searchDoneResp );
@@ -561,7 +566,8 @@
     {
 
         EntryAttribute uuid = entry.get( SchemaConstants.ENTRY_UUID_AT );
-        SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator();
+        SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator(
+            ldapServer.getDirectoryService().getLdapCodecService() );
         syncStateControl.setSyncStateType( syncStateType );
         syncStateControl.setEntryUUID( Strings.uuidToBytes(uuid.getString()) );
 
@@ -585,7 +591,8 @@
     {
 
         EntryAttribute uuid = entry.get( SchemaConstants.ENTRY_UUID_AT );
-        SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator();
+        SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator(
+            ldapServer.getDirectoryService().getLdapCodecService() );
         syncStateControl.setSyncStateType( SyncStateTypeEnum.MODDN );
         syncStateControl.setEntryUUID( Strings.uuidToBytes(uuid.getString()) );
 
@@ -986,7 +993,8 @@
     {
         SearchResultDone searchDoneResp = ( SearchResultDone ) req.getResultResponse();
         searchDoneResp.getLdapResult().setResultCode( ResultCodeEnum.E_SYNC_REFRESH_REQUIRED );
-        SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator();
+        SyncDoneValueDecorator syncDone = new SyncDoneValueDecorator(
+            ldapServer.getDirectoryService().getLdapCodecService() );
         searchDoneResp.addControl( syncDone );
 
         session.getIoSession().write( searchDoneResp );
diff --git a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplSearchListener.java b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplSearchListener.java
index 7b4f7b2..4121ec3 100644
--- a/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplSearchListener.java
+++ b/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/SyncReplSearchListener.java
@@ -145,7 +145,8 @@
                 respEntry.setObjectName( entry.getDn() );
                 respEntry.setEntry( entry );
 
-                SyncStateValueDecorator syncAdd = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncAdd = new SyncStateValueDecorator( 
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncAdd.setSyncStateType( SyncStateTypeEnum.ADD );
                 syncAdd
                     .setEntryUUID( Strings.uuidToBytes(entry.get(SchemaConstants.ENTRY_UUID_AT).getString()) );
@@ -186,7 +187,8 @@
                 respEntry.setObjectName( entry.getDn() );
                 respEntry.setEntry( entry );
 
-                SyncStateValueDecorator syncDelete = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncDelete = new SyncStateValueDecorator( 
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncDelete.setSyncStateType( SyncStateTypeEnum.DELETE );
                 syncDelete.setEntryUUID( Strings.uuidToBytes(entry.get(SchemaConstants.ENTRY_UUID_AT)
                         .getString()) );
@@ -225,7 +227,8 @@
                 respEntry.setObjectName( modifyContext.getDn() );
                 respEntry.setEntry( alteredEntry );
 
-                SyncStateValueDecorator syncModify = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncModify = new SyncStateValueDecorator( 
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncModify.setSyncStateType( SyncStateTypeEnum.MODIFY );
                 syncModify.setEntryUUID( Strings.uuidToBytes(alteredEntry.get(SchemaConstants.ENTRY_UUID_AT)
                         .getString()) );
@@ -263,7 +266,9 @@
                 return;
             }
 
-            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator( SyncModifyDnType.MOVE );
+            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator( 
+                session.getLdapServer().getDirectoryService().getLdapCodecService(),
+                SyncModifyDnType.MOVE );
             modDnControl.setEntryDn( moveContext.getDn().getNormName() );
             modDnControl.setNewSuperiorDn( moveContext.getNewSuperior().getNormName() );
 
@@ -273,7 +278,8 @@
                 respEntry.setObjectName( moveContext.getDn() );
                 respEntry.setEntry( entry );
 
-                SyncStateValueDecorator syncModify = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncModify = new SyncStateValueDecorator(
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncModify.setSyncStateType( SyncStateTypeEnum.MODDN );
                 syncModify.setEntryUUID( Strings.uuidToBytes(entry.get(SchemaConstants.ENTRY_UUID_AT)
                         .getString()) );
@@ -310,7 +316,9 @@
                 return;
             }
 
-            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator( SyncModifyDnType.MOVEANDRENAME );
+            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator( 
+                session.getLdapServer().getDirectoryService().getLdapCodecService(),
+                SyncModifyDnType.MOVEANDRENAME );
             modDnControl.setEntryDn( moveAndRenameContext.getDn().getNormName() );
             modDnControl.setNewSuperiorDn( moveAndRenameContext.getNewSuperiorDn().getNormName() );
             modDnControl.setNewRdn( moveAndRenameContext.getNewRdn().getNormName() );
@@ -324,7 +332,8 @@
                 respEntry.setObjectName( moveAndRenameContext.getModifiedEntry().getDn() );
                 respEntry.setEntry( alteredEntry );
 
-                SyncStateValueDecorator syncModify = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncModify = new SyncStateValueDecorator(
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncModify.setSyncStateType( SyncStateTypeEnum.MODDN );
                 syncModify.setEntryUUID( Strings.uuidToBytes(alteredEntry.get(SchemaConstants.ENTRY_UUID_AT)
                         .getString()) );
@@ -356,7 +365,8 @@
 
         try
         {
-            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator();
+            SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator(
+                session.getLdapServer().getDirectoryService().getLdapCodecService() );
             modDnControl.setModDnType( SyncModifyDnType.RENAME );
             modDnControl.setEntryDn( renameContext.getDn().getName() );
             modDnControl.setNewRdn( renameContext.getNewRdn().getName() );
@@ -368,7 +378,8 @@
                 respEntry.setObjectName( entry.getDn() );
                 respEntry.setEntry( entry );
 
-                SyncStateValueDecorator syncModify = new SyncStateValueDecorator();
+                SyncStateValueDecorator syncModify = new SyncStateValueDecorator(
+                    session.getLdapServer().getDirectoryService().getLdapCodecService() );
                 syncModify.setSyncStateType( SyncStateTypeEnum.MODDN );
                 syncModify.setEntryUUID( Strings.uuidToBytes(entry.get(SchemaConstants.ENTRY_UUID_AT)
                         .getString()) );
diff --git a/server-annotations/src/test/java/org/apache/directory/server/factory/DirectoryServiceAnnotationTest.java b/server-annotations/src/test/java/org/apache/directory/server/factory/DirectoryServiceAnnotationTest.java
index 513f87b..5f02540 100644
--- a/server-annotations/src/test/java/org/apache/directory/server/factory/DirectoryServiceAnnotationTest.java
+++ b/server-annotations/src/test/java/org/apache/directory/server/factory/DirectoryServiceAnnotationTest.java
@@ -46,6 +46,7 @@
 import org.apache.directory.server.core.factory.DSAnnotationProcessor;
 import org.apache.directory.server.core.partition.Partition;
 import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.shared.ldap.codec.DefaultLdapCodecService;
 import org.apache.directory.shared.ldap.model.message.Control;
 import org.apache.directory.shared.ldap.model.name.Dn;
 import org.apache.directory.shared.ldap.util.JndiUtils;
@@ -80,7 +81,7 @@
         env.put( Context.SECURITY_PRINCIPAL, ServerDNConstants.ADMIN_SYSTEM_DN );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
         env.put( Context.SECURITY_AUTHENTICATION, "simple" );
-        return new InitialLdapContext( env, JndiUtils.toJndiControls( controls ) );
+        return new InitialLdapContext( env, JndiUtils.toJndiControls( new DefaultLdapCodecService(), controls ) );
     }
     
 
diff --git a/server-integ/src/main/java/org/apache/directory/server/integ/ServerIntegrationUtils.java b/server-integ/src/main/java/org/apache/directory/server/integ/ServerIntegrationUtils.java
index 2ea47ff..654172a 100644
--- a/server-integ/src/main/java/org/apache/directory/server/integ/ServerIntegrationUtils.java
+++ b/server-integ/src/main/java/org/apache/directory/server/integ/ServerIntegrationUtils.java
@@ -106,7 +106,8 @@
         env.put( Context.SECURITY_PRINCIPAL, ServerDNConstants.ADMIN_SYSTEM_DN );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
         env.put( Context.SECURITY_AUTHENTICATION, "simple" );
-        return new InitialLdapContext( env, JndiUtils.toJndiControls( controls ) );
+        return new InitialLdapContext( env, JndiUtils.toJndiControls( 
+            ldapServer.getDirectoryService().getLdapCodecService(), controls ) );
     }
 
 
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/bind/MiscBindIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/bind/MiscBindIT.java
index 9ec924c..bad2f3a 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/bind/MiscBindIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/bind/MiscBindIT.java
@@ -65,9 +65,9 @@
 import org.apache.directory.server.ldap.handlers.bind.ntlm.NtlmMechanismHandler;
 import org.apache.directory.server.ldap.handlers.extended.StoredProcedureExtendedOperationHandler;
 import org.apache.directory.shared.asn1.util.Asn1StringUtils;
-import org.apache.directory.shared.ldap.codec.controls.ControlImpl;
 import org.apache.directory.shared.ldap.model.constants.SupportedSaslMechanisms;
 import org.apache.directory.shared.ldap.model.message.Control;
+import org.apache.directory.shared.ldap.model.message.controls.BasicControl;
 import org.apache.directory.shared.ldap.util.JndiUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -354,47 +354,8 @@
     @Test
     public void testFailureWithUnsupportedControl() throws Exception
     {
-        Control unsupported = new ControlImpl( "1.1.1.1" )
-        {
-            boolean isCritical = true;
-            private static final long serialVersionUID = 1L;
-
-
-            @SuppressWarnings("unused")
-            public String getType()
-            {
-                return "1.1.1.1";
-            }
-
-
-            public byte[] getValue()
-            {
-                return new byte[0];
-            }
-
-
-            public void setValue( byte[] value )
-            {
-            }
-
-
-            public boolean isCritical()
-            {
-                return isCritical;
-            }
-
-
-            public void setCritical( boolean isCritical )
-            {
-                this.isCritical = isCritical;
-            }
-
-
-            public String getOid()
-            {
-                return "1.1.1.1";
-            }
-        };
+        Control unsupported = new BasicControl( "1.1.1.1" );
+        unsupported.setCritical( true );
         
         ldapServer.getDirectoryService().setAllowAnonymousAccess( true );
         
@@ -417,8 +378,8 @@
         user.put( oc );
         user.put( "sn", "Bush" );
         user.put( "userPassword", "Aerial" );
-        ctx.setRequestControls( JndiUtils.toJndiControls( new Control[]
-                {unsupported} ) );
+        ctx.setRequestControls( JndiUtils.toJndiControls( ldapServer.getDirectoryService().getLdapCodecService(),
+            new Control[] {unsupported} ) );
 
         try
         {
@@ -430,7 +391,8 @@
         }
 
         unsupported.setCritical( false );
-        ctx.setRequestControls( JndiUtils.toJndiControls( new Control[]{unsupported} ) );
+        ctx.setRequestControls( JndiUtils.toJndiControls( ldapServer.getDirectoryService().getLdapCodecService(),
+            new Control[]{unsupported} ) );
         
         DirContext kate = ctx.createSubcontext( "cn=Kate Bush", user );
         assertNotNull( kate );
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/bind/SaslBindIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/bind/SaslBindIT.java
index c128996..5e64e77 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/bind/SaslBindIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/bind/SaslBindIT.java
@@ -536,7 +536,8 @@
             }
 
             // Retrieve the response back from server to my last request.
-            LdapMessageContainer container = new LdapMessageContainer();
+            LdapMessageContainer container = new LdapMessageContainer( 
+                ldapServer.getDirectoryService().getLdapCodecService() );
             decoder.setLdapMessageContainer( container );
             return (BindResponse) decoder.decode( null, _input_ );
         }
@@ -574,7 +575,8 @@
             }
 
             // Retrieve the response back from server to my last request.
-            LdapMessageContainer container = new LdapMessageContainer();
+            LdapMessageContainer container = new LdapMessageContainer(
+                ldapServer.getDirectoryService().getLdapCodecService() );
             decoder.setLdapMessageContainer( container );
             return ( BindResponse ) decoder.decode( null, _input_ );
         }
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/lookup/LookupPerfIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/lookup/LookupPerfIT.java
index d18fd12..c8f8615 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/lookup/LookupPerfIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/lookup/LookupPerfIT.java
@@ -99,7 +99,9 @@
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
         env.put( Context.SECURITY_AUTHENTICATION, "simple" );
 
-        return new InitialLdapContext( env, JndiUtils.toJndiControls( controls ) );
+        return new InitialLdapContext( env, JndiUtils.toJndiControls( 
+            ldapServer.getDirectoryService().getLdapCodecService(),
+            controls ) );
     }
 
 
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/search/PagedSearchIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/search/PagedSearchIT.java
index 7de519c..608c492 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/search/PagedSearchIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/search/PagedSearchIT.java
@@ -44,6 +44,9 @@
 import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
 import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.shared.asn1.EncoderException;
+import org.apache.directory.shared.ldap.codec.DefaultLdapCodecService;
+import org.apache.directory.shared.ldap.codec.ILdapCodecService;
 import org.apache.directory.shared.ldap.codec.search.controls.pagedSearch.PagedResultsDecorator;
 import org.apache.directory.shared.ldap.model.message.Control;
 import org.apache.directory.shared.ldap.util.JndiUtils;
@@ -197,19 +200,23 @@
     @Rule
     public MultiThreadedMultiInvoker i = new MultiThreadedMultiInvoker( MultiThreadedMultiInvoker.THREADSAFE );
 
+    private ILdapCodecService codec = new DefaultLdapCodecService();
+    
+    
     /**
      * Create the searchControls with a paged size
+     * @throws EncoderException on codec failures
      */
     private SearchControls createSearchControls( DirContext ctx, int sizeLimit, int pagedSize ) 
-        throws NamingException
+        throws NamingException, EncoderException
     {
         SearchControls controls = new SearchControls();
         controls.setCountLimit( sizeLimit );
         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator();
+        PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator( codec );
         pagedSearchControl.setSize( pagedSize );
         
-        ((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls( new Control[] {pagedSearchControl} ) );
+        ((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls(  codec, new Control[] {pagedSearchControl} ) );
         
         return controls;
     }
@@ -217,14 +224,15 @@
     
     /**
      * Create the searchControls with a paged size
+     * @throws EncoderException on codec failures
      */
     private void createNextSearchControls( DirContext ctx, byte[] cookie, int pagedSize ) 
-        throws NamingException
+        throws NamingException, EncoderException
     {
-        PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator();
+        PagedResultsDecorator pagedSearchControl = new PagedResultsDecorator( codec );
         pagedSearchControl.setCookie( cookie );
         pagedSearchControl.setSize( pagedSize );
-        ((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls( new Control[] {pagedSearchControl} ) );
+        ((LdapContext)ctx).setRequestControls( JndiUtils.toJndiControls( codec, new Control[] {pagedSearchControl} ) );
     }
     
     
@@ -247,9 +255,10 @@
     /**
      * Do the loop over the entries, until we can't get any more, or until we
      * reach a limit. It will check that we have got all the expected entries.
+     * @throws EncoderException  on codec failures
      */
     private void doLoop( DirContext ctx, SearchControls controls, int pagedSizeLimit, 
-        int expectedLoop, int expectedNbEntries, boolean expectedException ) throws NamingException
+        int expectedLoop, int expectedNbEntries, boolean expectedException ) throws NamingException, EncoderException
     {
         // Loop over all the elements
         int loop = 0;
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchIT.java
index c2c3c6d..8c5c4c3 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchIT.java
@@ -53,8 +53,11 @@
 import org.apache.directory.shared.ldap.model.message.controls.PersistentSearchImpl;
 import org.apache.directory.shared.ldap.model.message.controls.ChangeType;
 import org.apache.directory.shared.ldap.model.message.controls.EntryChange;
+import org.apache.directory.shared.ldap.codec.DefaultLdapCodecService;
+import org.apache.directory.shared.ldap.codec.ICodecControl;
+import org.apache.directory.shared.ldap.codec.ILdapCodecService;
 import org.apache.directory.shared.ldap.codec.search.controls.entryChange.EntryChangeDecorator;
-import org.apache.directory.shared.ldap.codec.search.controls.entryChange.EntryChangeDecoder;
+import org.apache.directory.shared.ldap.codec.search.controls.persistentSearch.PersistentSearchDecorator;
 import org.apache.directory.shared.ldap.model.message.controls.PersistentSearch;
 import org.apache.directory.shared.ldap.model.exception.LdapException;
 import org.apache.directory.shared.ldap.model.ldif.LdifUtils;
@@ -95,8 +98,8 @@
     private static final String BASE = "ou=system";
     private static final String PERSON_DESCRIPTION = "an American singer-songwriter";
     private static final String RDN = "cn=Tori Amos";
-
-
+    
+    
     /**
      * Creation of required attributes of a person entry.
      */
@@ -522,19 +525,21 @@
     {
         boolean isReady = false;
         PSearchNotification result;
-        final PersistentSearch persistentSearch;
+        final PersistentSearchDecorator persistentSearch;
         LdapContext ctx;
         NamingEnumeration<SearchResult> list;
         
         PSearchListener()
         {
-            persistentSearch = new PersistentSearchImpl();
+            persistentSearch = new PersistentSearchDecorator( ldapServer.getDirectoryService().getLdapCodecService() );
         }
 
 
         PSearchListener( PersistentSearch persistentSearch )
         {
-            this.persistentSearch = persistentSearch;
+            ICodecControl<? extends Control> wrapped = 
+                ldapServer.getDirectoryService().getLdapCodecService().decorate( persistentSearch );
+            this.persistentSearch = ( PersistentSearchDecorator ) wrapped;
         }
 
         
@@ -571,8 +576,8 @@
         public void run()
         {
             LOG.debug( "PSearchListener.run() called." );
+            ILdapCodecService codec = ldapServer.getDirectoryService().getLdapCodecService();
             persistentSearch.setCritical( true );
-            
             persistentSearch.setValue( persistentSearch.getValue() );
 
             Control[] ctxCtls = new Control[] { persistentSearch };
@@ -580,7 +585,7 @@
             try
             {
                 ctx = ( LdapContext ) getWiredContext( ldapServer).lookup( BASE );
-                ctx.setRequestControls( JndiUtils.toJndiControls(ctxCtls) );
+                ctx.setRequestControls( JndiUtils.toJndiControls( codec, ctxCtls) );
                 isReady = true;
                 LOG.debug( "PSearchListener is ready and about to issue persistent search request." );
                 list = ctx.search( "", "objectClass=*", null );
@@ -604,9 +609,7 @@
                                 if ( control.getID().equals(
                                     EntryChange.OID ) )
                                 {
-                                    EntryChangeDecoder decoder = new EntryChangeDecoder();
-                                    ecControl = ( EntryChangeDecorator ) decoder.decode( control.getEncodedValue(), 
-                                            new EntryChangeDecorator() );
+                                    ecControl.setValue( control.getEncodedValue() );
                                 }
                             }
                         }
diff --git a/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java b/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java
index 70ed0a6..da62993 100644
--- a/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java
@@ -743,7 +743,8 @@
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
 
-        ctx.setRequestControls( JndiUtils.toJndiControls( reqControls ) );
+        ctx.setRequestControls( JndiUtils.toJndiControls( ldapServer.getDirectoryService().getLdapCodecService(),
+            reqControls ) );
         NamingEnumeration<SearchResult> enm = ctx.search( "", "(objectClass=*)", searchControls );
         Set<String> results = new HashSet<String>();