You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2018/05/15 22:31:02 UTC

[directory-ldap-api] branch master updated (d70e6f2 -> 73cdfc7)

This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git.


    from d70e6f2  o Fixed a compilation failure o Preparing for the next error refactoring o A bit of commenting
     new a4a06ab  o Refactored api-ldap-codec-standalone error messages o Refactored api-ldap-extras-aci error messages
     new cefbe9e  Added a hand-crafted OpenLDAP schema parser, which is 40x faster than the antlr based one. It only supports AT and OC atm.
     new c2cebda  Some fixes in LdapNetworkConnection
     new 22bc0cc  Fixed some typoes in messages
     new 3bdb996  The Fast OpenLdapSchemaParser and all the associate changes.
     new 73cdfc7  Merge branch 'master' of https://gitbox.apache.org/repos/asf/directory-ldap-api

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/directory/api/i18n/I18n.java   |  254 +-
 .../apache/directory/api/i18n/errors.properties    |  202 +-
 .../apache/directory/api/i18n/messages.properties  |   78 +-
 .../ldap/client/api/DefaultSchemaLoader.java       |   22 +-
 .../ldap/client/api/LdapNetworkConnection.java     |   11 +-
 ldap/codec/core/res.txt                            |  530 ++
 .../api/ldap/codec/BasicControlDecorator.java      |    2 +-
 .../api/ldap/codec/actions/CheckLengthNotNull.java |    2 +-
 .../ldap/codec/actions/controls/AddControl.java    |    6 +-
 .../actions/controls/StoreControlCriticality.java  |    4 +-
 .../codec/actions/controls/StoreControlValue.java  |    3 +-
 .../directory/api/ldap/codec/api/LdapEncoder.java  |    6 +-
 .../proxiedauthz/ProxiedAuthzDecorator.java        |    2 +-
 .../search/entryChange/EntryChangeDecorator.java   |    2 +-
 .../search/pagedSearch/PagedResultsDecorator.java  |    2 +-
 .../PersistentSearchDecorator.java                 |    2 +-
 .../search/subentries/SubentriesDecorator.java     |    2 +-
 .../codec/controls/sort/SortRequestDecorator.java  |    2 +-
 .../codec/controls/sort/SortResponseDecorator.java |    2 +-
 .../codec/decorators/AbandonRequestDecorator.java  |    2 +-
 .../codec/decorators/AddResponseDecorator.java     |    2 +-
 .../codec/decorators/BindRequestDecorator.java     |    6 +-
 .../codec/decorators/BindResponseDecorator.java    |    2 +-
 .../codec/decorators/CompareRequestDecorator.java  |    2 +-
 .../codec/decorators/CompareResponseDecorator.java |    2 +-
 .../codec/decorators/DeleteRequestDecorator.java   |    2 +-
 .../codec/decorators/DeleteResponseDecorator.java  |    2 +-
 .../codec/decorators/ExtendedRequestDecorator.java |    2 +-
 .../decorators/ExtendedResponseDecorator.java      |    2 +-
 .../decorators/IntermediateResponseDecorator.java  |    2 +-
 .../ldap/codec/decorators/LdapResultDecorator.java |    4 +-
 .../codec/decorators/ModifyDnRequestDecorator.java |    2 +-
 .../decorators/ModifyDnResponseDecorator.java      |    2 +-
 .../codec/decorators/ModifyRequestDecorator.java   |    2 +-
 .../codec/decorators/ModifyResponseDecorator.java  |    2 +-
 .../codec/decorators/SearchRequestDecorator.java   |    2 +-
 .../decorators/SearchResultDoneDecorator.java      |    2 +-
 .../decorators/SearchResultEntryDecorator.java     |    2 +-
 .../decorators/SearchResultReferenceDecorator.java |    2 +-
 .../codec/decorators/UnbindRequestDecorator.java   |    2 +-
 .../ldap/codec/osgi/DefaultLdapCodecService.java   |   19 +-
 .../directory/api/ldap/codec/search/AndFilter.java |    4 +-
 .../search/AttributeValueAssertionFilter.java      |    4 +-
 .../api/ldap/codec/search/ConnectorFilter.java     |    2 +-
 .../ldap/codec/search/ExtensibleMatchFilter.java   |    4 +-
 .../directory/api/ldap/codec/search/NotFilter.java |    4 +-
 .../directory/api/ldap/codec/search/OrFilter.java  |    4 +-
 .../api/ldap/codec/search/PresentFilter.java       |    4 +-
 .../api/ldap/codec/search/SubstringFilter.java     |    4 +-
 .../ldap/codec/standalone/CodecFactoryUtil.java    |   65 +-
 .../codec/standalone/StandaloneLdapApiService.java |   13 +-
 .../org/apache/directory/api/ldap/aci/ACIItem.java |    6 +-
 .../directory/api/ldap/aci/ACIItemChecker.java     |    4 +-
 .../directory/api/ldap/aci/ACIItemParser.java      |    4 +-
 .../apache/directory/api/ldap/aci/ACITuple.java    |    4 +-
 .../ldap/aci/protectedItem/RangeOfValuesItem.java  |    3 +-
 .../api/ldap/extras/controls/SyncModifyDnType.java |    3 +-
 .../controls/ppolicy/PasswordPolicyErrorEnum.java  |    3 +-
 .../syncrepl/syncState/SyncStateTypeEnum.java      |    2 +-
 .../controls/vlv/VirtualListViewResultCode.java    |    3 +-
 .../StoredProcedureRequestImpl.java                |    8 +-
 .../intermediate/syncrepl/SyncInfoValueImpl.java   |    3 +-
 .../controls/ad_impl/AdDirSyncDecorator.java       |    2 +-
 .../extras/controls/ad_impl/AdDirSyncGrammar.java  |   13 +-
 .../controls/ad_impl/AdPolicyHintsDecorator.java   |    2 +-
 .../extras/controls/ppolicy_impl/PPolicyInit.java  |    3 +-
 .../ppolicy_impl/PasswordPolicyDecorator.java      |    2 +-
 .../syncrepl_impl/SyncDoneValueDecorator.java      |    2 +-
 .../syncrepl_impl/SyncDoneValueGrammar.java        |    6 +-
 .../syncrepl_impl/SyncRequestValueDecorator.java   |    2 +-
 .../syncrepl_impl/SyncRequestValueGrammar.java     |   14 +-
 .../syncrepl_impl/SyncStateValueDecorator.java     |    2 +-
 .../syncrepl_impl/SyncStateValueGrammar.java       |    8 +-
 .../controls/vlv_impl/InitByOffsetSequence.java    |    3 +-
 .../vlv_impl/InitVirtualListViewRequest.java       |    3 +-
 .../vlv_impl/VirtualListViewRequestDecorator.java  |    2 +-
 .../vlv_impl/VirtualListViewResponseDecorator.java |    2 +-
 .../extended/ads_impl/cancel/CancelGrammar.java    |    4 +-
 .../ads_impl/cancel/CancelRequestDecorator.java    |    4 +-
 .../certGeneration/CertGenerationGrammar.java      |   18 +-
 .../CertGenerationRequestDecorator.java            |    4 +-
 .../EndTransactionRequestDecorator.java            |    2 +-
 .../EndTransactionRequestGrammar.java              |    6 +-
 .../EndTransactionResponseDecorator.java           |    2 +-
 .../EndTransactionResponseGrammar.java             |    6 +-
 .../endTransaction/controls/ControlsGrammar.java   |    2 +-
 .../controls/actions/AddControl.java               |    6 +-
 .../controls/actions/StoreControlCriticality.java  |    4 +-
 .../controls/actions/StoreControlValue.java        |    3 +-
 .../GracefulDisconnectGrammar.java                 |   14 +-
 .../GracefulDisconnectResponseDecorator.java       |    4 +-
 .../gracefulShutdown/GracefulShutdownGrammar.java  |   12 +-
 .../GracefulShutdownRequestDecorator.java          |    4 +-
 .../pwdModify/PasswordModifyRequestDecorator.java  |    2 +-
 .../pwdModify/PasswordModifyRequestGrammar.java    |   13 +-
 .../pwdModify/PasswordModifyResponseDecorator.java |    2 +-
 .../pwdModify/PasswordModifyResponseGrammar.java   |    3 +-
 .../storedProcedure/StoredProcedureGrammar.java    |   21 +-
 .../StoredProcedureRequestDecorator.java           |    9 +-
 .../ads_impl/whoAmI/WhoAmIResponseDecorator.java   |    4 +-
 .../ads_impl/whoAmI/WhoAmIResponseGrammar.java     |   13 +-
 .../syncrepl_impl/SyncInfoValueDecorator.java      |    6 +-
 .../syncrepl_impl/SyncInfoValueGrammar.java        |   76 +-
 .../StoredProcedureLanguageSchemeOption.java       |   26 +-
 .../api/ldap/trigger/TriggerSpecification.java     |   16 +-
 .../ldap/trigger/TriggerSpecificationParser.java   |    6 +-
 ldap/model/src/checkstyle/suppressions.xml         |    1 +
 ldap/model/src/main/antlr/distinguishedName.g      |   12 -
 ldap/model/src/main/antlr/schema-extension.g       |  119 -
 ldap/model/src/main/antlr/schema-qdstring.g        |  162 -
 ldap/model/src/main/antlr/schema-value.g           |  442 --
 ldap/model/src/main/antlr/schema.g                 | 1085 ----
 .../model/schema/parsers/AbstractSchemaParser.java |  153 +-
 .../AttributeTypeDescriptionSchemaParser.java      |   21 +-
 .../model/schema/parsers/ConsoleParserMonitor.java |   72 -
 .../DitContentRuleDescriptionSchemaParser.java     |   21 +-
 .../DitStructureRuleDescriptionSchemaParser.java   |   21 +-
 .../LdapComparatorDescriptionSchemaParser.java     |   21 +-
 .../parsers/LdapSyntaxDescriptionSchemaParser.java |   19 +-
 .../MatchingRuleDescriptionSchemaParser.java       |   20 +-
 .../MatchingRuleUseDescriptionSchemaParser.java    |   20 +-
 .../parsers/NameFormDescriptionSchemaParser.java   |   20 +-
 .../parsers/NormalizerDescriptionSchemaParser.java |   20 +-
 .../ObjectClassDescriptionSchemaParser.java        |   20 +-
 .../model/schema/parsers/OpenLdapSchemaParser.java | 6117 +++++++++++++++++++-
 .../ldap/model/schema/parsers/ParserMonitor.java   |   53 -
 .../model/schema/parsers/ParserMonitorAdapter.java |   55 -
 .../schema/parsers/ReusableAntlrSchemaLexer.java   |   79 -
 .../schema/parsers/ReusableAntlrSchemaParser.java  |   62 -
 .../SyntaxCheckerDescriptionSchemaParser.java      |   21 +-
 .../AttributeTypeDescriptionSyntaxChecker.java     |    2 +-
 .../DitContentRuleDescriptionSyntaxChecker.java    |    2 +-
 .../DitStructureRuleDescriptionSyntaxChecker.java  |    2 +-
 .../LdapSyntaxDescriptionSyntaxChecker.java        |    2 +-
 .../MatchingRuleDescriptionSyntaxChecker.java      |    2 +-
 .../MatchingRuleUseDescriptionSyntaxChecker.java   |    2 +-
 .../NameFormDescriptionSyntaxChecker.java          |    2 +-
 .../ObjectClassDescriptionSyntaxChecker.java       |    2 +-
 .../model/schema/SchemaObjectRendererTest.java     |    8 +-
 ...Test.java => FastOpenLdapSchemaParserTest.java} |   41 +-
 .../schema/parsers/OpenLdapSchemaParserTest.java   |   38 +-
 .../AttributeTypeDescriptionSyntaxCheckerTest.java |    2 +-
 ...DitContentRuleDescriptionSyntaxCheckerTest.java |    2 +-
 ...tStructureRuleDescriptionSyntaxCheckerTest.java |    2 +-
 .../ObjectClassDescriptionSyntaxCheckerTest.java   |    2 +-
 ...uteTypeDescriptionSchemaParserRelaxedTest.java} |  466 +-
 ...buteTypeDescriptionSchemaParserStrictTest.java} |  636 +-
 .../ComparatorDescriptionSchemaParserTest.java     |   21 +-
 ...entRuleDescriptionSchemaParserRelaxedTest.java} |  156 +-
 .../DitContentRuleDescriptionSchemaParserTest.java |  228 +-
 ...ureRuleDescriptionSchemaParserRelaxedTest.java} |   97 +-
 ...tureRuleDescriptionSchemaParserStrictTest.java} |  139 +-
 .../LdapSyntaxDescriptionSchemaParserTest.java     |   19 +-
 .../MatchingRuleDescriptionSchemaParserTest.java   |  146 +-
 ...MatchingRuleUseDescriptionSchemaParserTest.java |  126 +-
 .../NameFormDescriptionSchemaParserTest.java       |  141 +-
 .../NormalizerDescriptionSchemaParserTest.java     |    4 +-
 ...ctClassDescriptionSchemaParserRelaxedTest.java} |  189 +-
 ...ectClassDescriptionSchemaParserStrictTest.java} |  295 +-
 .../syntaxes/parser/SchemaParserTestUtils.java     |  510 +-
 .../SyntaxCheckerDescriptionSchemaParserTest.java  |   14 +-
 .../schema/manager/impl/DefaultSchemaManager.java  |    4 +-
 162 files changed, 9301 insertions(+), 4347 deletions(-)
 create mode 100644 ldap/codec/core/res.txt
 delete mode 100644 ldap/model/src/main/antlr/schema-extension.g
 delete mode 100644 ldap/model/src/main/antlr/schema-qdstring.g
 delete mode 100644 ldap/model/src/main/antlr/schema-value.g
 delete mode 100644 ldap/model/src/main/antlr/schema.g
 delete mode 100644 ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ConsoleParserMonitor.java
 delete mode 100644 ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ParserMonitor.java
 delete mode 100644 ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ParserMonitorAdapter.java
 delete mode 100644 ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ReusableAntlrSchemaLexer.java
 delete mode 100644 ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ReusableAntlrSchemaParser.java
 copy ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/{OpenLdapSchemaParserTest.java => FastOpenLdapSchemaParserTest.java} (96%)
 copy ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{AttributeTypeDescriptionSchemaParserTest.java => AttributeTypeDescriptionSchemaParserRelaxedTest.java} (74%)
 rename ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{AttributeTypeDescriptionSchemaParserTest.java => AttributeTypeDescriptionSchemaParserStrictTest.java} (67%)
 copy ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{DitContentRuleDescriptionSchemaParserTest.java => DitContentRuleDescriptionSchemaParserRelaxedTest.java} (73%)
 copy ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{DitStructureRuleDescriptionSchemaParserTest.java => DitStructureRuleDescriptionSchemaParserRelaxedTest.java} (82%)
 rename ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{DitStructureRuleDescriptionSchemaParserTest.java => DitStructureRuleDescriptionSchemaParserStrictTest.java} (78%)
 copy ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{ObjectClassDescriptionSchemaParserTest.java => ObjectClassDescriptionSchemaParserRelaxedTest.java} (83%)
 rename ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/syntaxes/parser/{ObjectClassDescriptionSchemaParserTest.java => ObjectClassDescriptionSchemaParserStrictTest.java} (76%)

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 03/06: Some fixes in LdapNetworkConnection

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit c2cebdaa13dbe41b5fea393fc588cb1807ca1baa
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed May 2 11:09:13 2018 +0200

    Some fixes in LdapNetworkConnection
---
 .../apache/directory/ldap/client/api/LdapNetworkConnection.java  | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

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 9e30e70..f9c155f 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
@@ -4681,7 +4681,7 @@ public class LdapNetworkConnection extends AbstractLdapConnection implements Lda
             }
 
             // for LDAPS
-            if ( ldapSession == null )
+            if ( ( ldapSession == null ) || !connected.get() )
             {
                 connector.getFilterChain().addFirst( SSL_FILTER_KEY, sslFilter );
             }
@@ -4911,6 +4911,13 @@ public class LdapNetworkConnection extends AbstractLdapConnection implements Lda
      */
     private void writeRequest( Request request ) throws LdapException
     {
+        // If we are meant to be using a secure connection but the ssl filter isn' in the filter chain then
+        // throw immediately
+        if ( config.isUseSsl() && !ldapSession.getFilterChain().contains( "sslFilter" ) )
+        {
+            throw new InvalidConnectionException( "Attempting to send over an insecure connection" );
+        }
+
         // Send the request to the server
         WriteFuture writeFuture = ldapSession.write( request );
 

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 04/06: Fixed some typoes in messages

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit 22bc0cc748834adfeeafb65f6137fc98a9934a66
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed May 2 15:48:39 2018 +0200

    Fixed some typoes in messages
---
 .../main/resources/org/apache/directory/api/i18n/errors.properties | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index f540e57..333f43f 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -220,9 +220,9 @@ ERR_04177=provider monitor class {0} not found
 ERR_04178=provider monitor class {0} does not expose a public default constructor
 ERR_04179=provider monitor class {0} failed during instantiation
 ERR_04180=Could not instantiate provider - environment does not specify {0} property!
-ERR_04181=Count not find the Provider class {0}
-ERR_04182=Count not invoke the Provider''s factory method: {0}.getProvider() - it may not exist!
-ERR_04183=Count not invoke the Provider''s factory method: {0}.getProvider() - it does seem to be a public method!
+ERR_04181=Could not find the Provider class {0}
+ERR_04182=Could not invoke the Provider''s factory method: {0}.getProvider() - it may not exist!
+ERR_04183=Could not invoke the Provider''s factory method: {0}.getProvider() - it does seem to be a public method!
 ERR_04184=Call to Provider''s factory method: {0}.getProvider() threw the following exception:\n{1}
 ERR_04189=The User Provided type cannot be empty or null
 ERR_04190=The User provided name does not contains an ''=''
@@ -890,6 +890,7 @@ ERR_16077_SCHEMA_MANAGER_CANT_BE_LOADED=SchemaManager can't be loaded: {0}
 ERR_16078_CANNOT_LOAD_UNKNOWN_SCHEMA=Cannot load the unknown schema {0}
 ERR_16079_INVALID_SCHEMA_OBJECT_CANNOT_BE_LOADED=the SchemaObject {0} cannot be added, it''s not a valid LoadableSchemaObject.
 
+
 # api-utils     17000 - 17999
 ERR_17000_UNEXPECTED_PARSER_CONDITION=Unexpected parser condition throwing IllegalStateException.
 ERR_17001_FAILED_OPEN_JAR_MANIFEST=Failed to open jar file or manifest.

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 01/06: o Refactored api-ldap-codec-standalone error messages o Refactored api-ldap-extras-aci error messages

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit a4a06ab15f2e9d4e54a397479da2d16060293e9a
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Tue Apr 10 15:15:09 2018 +0200

    o Refactored api-ldap-codec-standalone error messages
    o Refactored api-ldap-extras-aci error messages
---
 .../java/org/apache/directory/api/i18n/I18n.java   | 221 +++++++++++++++------
 .../apache/directory/api/i18n/errors.properties    | 145 ++++++++------
 .../apache/directory/api/i18n/messages.properties  |  78 +++++++-
 .../api/ldap/codec/BasicControlDecorator.java      |   2 +-
 .../api/ldap/codec/actions/CheckLengthNotNull.java |   2 +-
 .../ldap/codec/actions/controls/AddControl.java    |   6 +-
 .../actions/controls/StoreControlCriticality.java  |   4 +-
 .../codec/actions/controls/StoreControlValue.java  |   3 +-
 .../directory/api/ldap/codec/api/LdapEncoder.java  |   6 +-
 .../proxiedauthz/ProxiedAuthzDecorator.java        |   2 +-
 .../search/entryChange/EntryChangeDecorator.java   |   2 +-
 .../search/pagedSearch/PagedResultsDecorator.java  |   2 +-
 .../PersistentSearchDecorator.java                 |   2 +-
 .../search/subentries/SubentriesDecorator.java     |   2 +-
 .../codec/controls/sort/SortRequestDecorator.java  |   2 +-
 .../codec/controls/sort/SortResponseDecorator.java |   2 +-
 .../codec/decorators/AbandonRequestDecorator.java  |   2 +-
 .../codec/decorators/AddResponseDecorator.java     |   2 +-
 .../codec/decorators/BindRequestDecorator.java     |   6 +-
 .../codec/decorators/BindResponseDecorator.java    |   2 +-
 .../codec/decorators/CompareRequestDecorator.java  |   2 +-
 .../codec/decorators/CompareResponseDecorator.java |   2 +-
 .../codec/decorators/DeleteRequestDecorator.java   |   2 +-
 .../codec/decorators/DeleteResponseDecorator.java  |   2 +-
 .../codec/decorators/ExtendedRequestDecorator.java |   2 +-
 .../decorators/ExtendedResponseDecorator.java      |   2 +-
 .../decorators/IntermediateResponseDecorator.java  |   2 +-
 .../ldap/codec/decorators/LdapResultDecorator.java |   4 +-
 .../codec/decorators/ModifyDnRequestDecorator.java |   2 +-
 .../decorators/ModifyDnResponseDecorator.java      |   2 +-
 .../codec/decorators/ModifyRequestDecorator.java   |   2 +-
 .../codec/decorators/ModifyResponseDecorator.java  |   2 +-
 .../codec/decorators/SearchRequestDecorator.java   |   2 +-
 .../decorators/SearchResultDoneDecorator.java      |   2 +-
 .../decorators/SearchResultEntryDecorator.java     |   2 +-
 .../decorators/SearchResultReferenceDecorator.java |   2 +-
 .../codec/decorators/UnbindRequestDecorator.java   |   2 +-
 .../ldap/codec/osgi/DefaultLdapCodecService.java   |  19 +-
 .../directory/api/ldap/codec/search/AndFilter.java |   4 +-
 .../search/AttributeValueAssertionFilter.java      |   4 +-
 .../api/ldap/codec/search/ConnectorFilter.java     |   2 +-
 .../ldap/codec/search/ExtensibleMatchFilter.java   |   4 +-
 .../directory/api/ldap/codec/search/NotFilter.java |   4 +-
 .../directory/api/ldap/codec/search/OrFilter.java  |   4 +-
 .../api/ldap/codec/search/PresentFilter.java       |   4 +-
 .../api/ldap/codec/search/SubstringFilter.java     |   4 +-
 .../ldap/codec/standalone/CodecFactoryUtil.java    |  65 +++---
 .../codec/standalone/StandaloneLdapApiService.java |  13 +-
 .../org/apache/directory/api/ldap/aci/ACIItem.java |   6 +-
 .../directory/api/ldap/aci/ACIItemChecker.java     |   4 +-
 .../directory/api/ldap/aci/ACIItemParser.java      |   4 +-
 .../apache/directory/api/ldap/aci/ACITuple.java    |   4 +-
 .../ldap/aci/protectedItem/RangeOfValuesItem.java  |   3 +-
 .../api/ldap/extras/controls/SyncModifyDnType.java |   3 +-
 .../controls/ppolicy/PasswordPolicyErrorEnum.java  |   3 +-
 .../syncrepl/syncState/SyncStateTypeEnum.java      |   2 +-
 .../controls/vlv/VirtualListViewResultCode.java    |   3 +-
 .../StoredProcedureRequestImpl.java                |   8 +-
 .../intermediate/syncrepl/SyncInfoValueImpl.java   |   3 +-
 .../controls/ad_impl/AdDirSyncDecorator.java       |   2 +-
 .../extras/controls/ad_impl/AdDirSyncGrammar.java  |  13 +-
 .../controls/ad_impl/AdPolicyHintsDecorator.java   |   2 +-
 .../extras/controls/ppolicy_impl/PPolicyInit.java  |   3 +-
 .../ppolicy_impl/PasswordPolicyDecorator.java      |   2 +-
 .../syncrepl_impl/SyncDoneValueDecorator.java      |   2 +-
 .../syncrepl_impl/SyncDoneValueGrammar.java        |   6 +-
 .../syncrepl_impl/SyncRequestValueDecorator.java   |   2 +-
 .../syncrepl_impl/SyncRequestValueGrammar.java     |  14 +-
 .../syncrepl_impl/SyncStateValueDecorator.java     |   2 +-
 .../syncrepl_impl/SyncStateValueGrammar.java       |   8 +-
 .../controls/vlv_impl/InitByOffsetSequence.java    |   3 +-
 .../vlv_impl/InitVirtualListViewRequest.java       |   3 +-
 .../vlv_impl/VirtualListViewRequestDecorator.java  |   2 +-
 .../vlv_impl/VirtualListViewResponseDecorator.java |   2 +-
 .../extended/ads_impl/cancel/CancelGrammar.java    |   4 +-
 .../ads_impl/cancel/CancelRequestDecorator.java    |   4 +-
 .../certGeneration/CertGenerationGrammar.java      |  18 +-
 .../CertGenerationRequestDecorator.java            |   4 +-
 .../EndTransactionRequestDecorator.java            |   2 +-
 .../EndTransactionRequestGrammar.java              |   6 +-
 .../EndTransactionResponseDecorator.java           |   2 +-
 .../EndTransactionResponseGrammar.java             |   6 +-
 .../endTransaction/controls/ControlsGrammar.java   |   2 +-
 .../controls/actions/AddControl.java               |   6 +-
 .../controls/actions/StoreControlCriticality.java  |   4 +-
 .../controls/actions/StoreControlValue.java        |   3 +-
 .../GracefulDisconnectGrammar.java                 |  14 +-
 .../GracefulDisconnectResponseDecorator.java       |   4 +-
 .../gracefulShutdown/GracefulShutdownGrammar.java  |  12 +-
 .../GracefulShutdownRequestDecorator.java          |   4 +-
 .../pwdModify/PasswordModifyRequestDecorator.java  |   2 +-
 .../pwdModify/PasswordModifyRequestGrammar.java    |  13 +-
 .../pwdModify/PasswordModifyResponseDecorator.java |   2 +-
 .../pwdModify/PasswordModifyResponseGrammar.java   |   3 +-
 .../storedProcedure/StoredProcedureGrammar.java    |  21 +-
 .../StoredProcedureRequestDecorator.java           |   9 +-
 .../ads_impl/whoAmI/WhoAmIResponseDecorator.java   |   4 +-
 .../ads_impl/whoAmI/WhoAmIResponseGrammar.java     |  13 +-
 .../syncrepl_impl/SyncInfoValueDecorator.java      |   6 +-
 .../syncrepl_impl/SyncInfoValueGrammar.java        |  76 +++----
 .../StoredProcedureLanguageSchemeOption.java       |  26 ++-
 .../api/ldap/trigger/TriggerSpecification.java     |  16 +-
 .../ldap/trigger/TriggerSpecificationParser.java   |   6 +-
 .../directory/api/ldap/model/ldif/LdifEntry.java   |   2 +-
 .../schema/manager/impl/DefaultSchemaManager.java  |   4 +-
 105 files changed, 630 insertions(+), 433 deletions(-)

diff --git a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
index 640b46d..5027889 100644
--- a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
+++ b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
@@ -153,11 +153,6 @@ public enum I18n
     ERR_03208_TIMEOUT( "ERR_03208_TIMEOUT" ),
 
     // ldap
-    ERR_04001_NULL_IDENTIFICATION_TAG( "ERR_04001_NULL_IDENTIFICATION_TAG" ),
-    ERR_04002_BAD_PRECENDENCE( "ERR_04002_BAD_PRECENDENCE" ),
-    ERR_04003_NULL_AUTHENTICATION_LEVEL( "ERR_04003_NULL_AUTHENTICATION_LEVEL" ),
-    ERR_04004_PARSER_FAILURE_ACI_ITEM( "ERR_04004_PARSER_FAILURE_ACI_ITEM" ),
-    ERR_04005( "ERR_04005" ),
     ERR_04006( "ERR_04006" ),
     ERR_04007( "ERR_04007" ),
     ERR_04008( "ERR_04008" ),
@@ -175,26 +170,6 @@ public enum I18n
     ERR_04020( "ERR_04020" ),
     ERR_04021( "ERR_04021" ),
     ERR_04022( "ERR_04022" ),
-    ERR_04023( "ERR_04023" ),
-    ERR_04024( "ERR_04024" ),
-    ERR_04025( "ERR_04025" ),
-    ERR_04026( "ERR_04026" ),
-    ERR_04027( "ERR_04027" ),
-    ERR_04028( "ERR_04028" ),
-    ERR_04029( "ERR_04029" ),
-    ERR_04030( "ERR_04030" ),
-    ERR_04031( "ERR_04031" ),
-    ERR_04032( "ERR_04032" ),
-    ERR_04033( "ERR_04033" ),
-    ERR_04034( "ERR_04034" ),
-    ERR_04035( "ERR_04035" ),
-    ERR_04036( "ERR_04036" ),
-    ERR_04037( "ERR_04037" ),
-    ERR_04038( "ERR_04038" ),
-    ERR_04039( "ERR_04039" ),
-    ERR_04040( "ERR_04040" ),
-    ERR_04041( "ERR_04041" ),
-    ERR_04042( "ERR_04042" ),
     ERR_04043( "ERR_04043" ),
     ERR_04044( "ERR_04044" ),
     ERR_04045( "ERR_04045" ),
@@ -247,11 +222,6 @@ public enum I18n
     ERR_04093( "ERR_04093" ),
     ERR_04094( "ERR_04094" ),
     ERR_04095( "ERR_04095" ),
-    ERR_04096_NULL_CONTROL_LENGTH( "ERR_04096_NULL_CONTROL_LENGTH" ),
-    ERR_04097_NULL_CONTROL_OID( "ERR_04097_NULL_CONTROL_OID" ),
-    ERR_04098_INVALID_CONTROL_OID( "ERR_04098_INVALID_CONTROL_OID" ),
-    ERR_04099_INVALID_CONTROL_LIST( "ERR_04099_INVALID_CONTROL_LIST" ),
-    ERR_04100_BAD_CONTROL_CRITICALITY( "ERR_04100_BAD_CONTROL_CRITICALITY" ),
     ERR_04101( "ERR_04101" ),
     ERR_04102( "ERR_04102" ),
     ERR_04103( "ERR_04103" ),
@@ -276,17 +246,9 @@ public enum I18n
     ERR_04142( "ERR_04142" ),
     ERR_04143( "ERR_04143" ),
     ERR_04156( "ERR_04156" ),
-    ERR_04163( "ERR_04163" ),
-    ERR_04164( "ERR_04164" ),
-    ERR_04165_PAYLOAD_DECODING_ERROR( "ERR_04165_PAYLOAD_DECODING_ERROR" ),
-    ERR_04167( "ERR_04167" ),
     ERR_04169( "ERR_04169" ),
     ERR_04170( "ERR_04170" ),
     ERR_04171( "ERR_04171" ),
-    ERR_04172( "ERR_04172" ),
-    ERR_04174( "ERR_04174" ),
-    ERR_04175( "ERR_04175" ),
-    ERR_04176( "ERR_04176" ),
     ERR_04177( "ERR_04177" ),
     ERR_04178( "ERR_04178" ),
     ERR_04179( "ERR_04179" ),
@@ -339,9 +301,6 @@ public enum I18n
     ERR_04298( "ERR_04298" ),
     ERR_04299( "ERR_04299" ),
     ERR_04300( "ERR_04300" ),
-    ERR_04331( "ERR_04331" ),
-    ERR_04332( "ERR_04332" ),
-    ERR_04333( "ERR_04333" ),
     ERR_04334( "ERR_04334" ),
     ERR_04337( "ERR_04337" ),
     ERR_04338( "ERR_04338" ),
@@ -412,32 +371,103 @@ public enum I18n
     ERR_04479_INVALID_SYNTAX_VALUE( "ERR_04479_INVALID_SYNTAX_VALUE" ),
     ERR_04480_END_OF_STREAM( "ERR_04480_END_OF_STREAM" ),
     ERR_04481_ENTRY_NULL_VALUE( "ERR_04481_ENTRY_NULL_VALUE" ),
-    ERR_04490_BAD_END_TRANSACTION_COMMIT( "ERR_04490_BAD_END_TRANSACTION_COMMIT" ),
-    ERR_04491_BAD_END_TRANSACTION_MESSAGE_ID( "ERR_04490_BAD_END_TRANSACTION_MESSAGE_ID" ),
     
     // ldap-client-api  4100-
     ERR_4100_TLS_HANDSHAKE_ERROR( "ERR_4100_TLS_HANDSHAKE_ERROR" ),
 
-    // ldap-constants
+    // api-ldap-codec-standalone 6000-6999
+    ERR_06000_FAILED_TO_LOAD_DEFAULT_CODEC_FACTORY( "ERR_06000_FAILED_TO_LOAD_DEFAULT_CODEC_FACTORY" ),
+    
+    // api-ldap-extras-aci   7000-7999
+    ERR_07000_FILTER( "ERR_07000_FILTER" ),
+    ERR_07001_NULL_IDENTIFICATION_TAG( "ERR_07001_NULL_IDENTIFICATION_TAG" ),
+    ERR_07002_BAD_PRECENDENCE( "ERR_07002_BAD_PRECENDENCE" ),
+    ERR_07003_NULL_AUTHENTICATION_LEVEL( "ERR_07003_NULL_AUTHENTICATION_LEVEL" ),
+    ERR_07004_PARSER_FAILURE_ACI_ITEM( "ERR_07004_PARSER_FAILURE_ACI_ITEM" ),
+
+    // api-ldap-extras-codec 8000-8999
+    // api-ldap-extras-codec <>           8000-8099
+    ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER( "ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER" ),
+    ERR_08001_CANNOT_DECODE_REFRESH_DELETES( "ERR_08001_CANNOT_DECODE_REFRESH_DELETES" ),
+
+    // api-ldap-extras-codec controls     8100-8199
+    ERR_08100_SYNC_REQUEST_VALUE_MODE_DECODING_FAILED( "ERR_08100_SYNC_REQUEST_VALUE_MODE_DECODING_FAILED" ),
+    ERR_08101_RELOAD_HINT_DECODING_FAILED( "ERR_08101_RELOAD_HINT_DECODING_FAILED" ),
+    ERR_08102_SYNC_STATE_VALUE_MODE_DECODING_FAILED( "ERR_08102_SYNC_STATE_VALUE_MODE_DECODING_FAILED" ),
+    ERR_08103_BAD_CONTROL_CRITICALITY( "ERR_08103_BAD_CONTROL_CRITICALITY" ),
+    ERR_08104_AD_DIR_SYNC_FLAG_DECODING_FAILURE( "ERR_08104_AD_DIR_SYNC_FLAG_DECODING_FAILURE" ),
+    ERR_08105_AD_DIR_SYNC_FLAG_DECODING_ERROR( "ERR_08105_AD_DIR_SYNC_FLAG_DECODING_ERROR" ), 
+    ERR_08106_AD_DIR_SYNC_MAX_RETURN_LENGTH_DECODING_ERROR( "ERR_08106_AD_DIR_SYNC_MAX_RETURN_LENGTH_DECODING_ERROR" ), 
+
+
+    // api-ldap-extras-codec extended     8200-8399
+    ERR_08200_CANCELID_DECODING_FAILED( "ERR_08200_CANCELID_DECODING_FAILED" ),
+    ERR_08201_INVALID_TARGET_DN( "ERR_08201_INVALID_TARGET_DN" ),
+    ERR_08202_NULL_TARGET_DN_DECODING_FAILED( "ERR_08202_NULL_TARGET_DN_DECODING_FAILED" ),
+    ERR_08203_INVALID_ISSUER_DN( "ERR_08203_INVALID_ISSUER_DN" ),
+    ERR_08204_INVALID_SUBJECT_DN( "ERR_08204_INVALID_SUBJECT_DN" ),
+    ERR_08205_CANNOT_DECODE_DELAY( "ERR_08205_CANNOT_DECODE_DELAY" ),
+    ERR_08206_TIME_OFFLINE_DECODING_FAILED( "ERR_08206_TIME_OFFLINE_DECODING_FAILED" ),
+    ERR_08207_SP_LANGUAGE_NULL( "ERR_08207_SP_LANGUAGE_NULL" ),
+    ERR_08208_NULL_PROCEDURE( "ERR_08208_NULL_PROCEDURE" ),
+    ERR_08209_NULL_PARAMETER_TYPE( "ERR_08209_NULL_PARAMETER_TYPE" ),
+    ERR_08210_NULL_PARAMETER_VALUE( "ERR_08210_NULL_PARAMETER_VALUE" ),
+    ERR_08211_EMPTY_PARAMETER_VALUE( "ERR_08211_EMPTY_PARAMETER_VALUE" ),
+    ERR_08212_PDU_BUFFER_TOO_SMALL( "ERR_08212_PDU_BUFFER_TOO_SMALL" ),
+    ERR_08213_NULL_CONTROL_LENGTH( "ERR_08213_NULL_CONTROL_LENGTH" ),
+    ERR_08214_NULL_OID( "ERR_08214_NULL_OID" ),
+    ERR_08215_INVALID_CONTROL_OID( "ERR_08215_INVALID_CONTROL_OID" ),
+    ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED( "ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED" ),
+    ERR_08217_PAYLOAD_DECODING_ERROR( "ERR_08217_PAYLOAD_DECODING_ERROR" ),
+    ERR_08218_CERT_GENERATE_PAYLOAD_ENCODING_FAILED( "ERR_08218_CERT_GENERATE_PAYLOAD_ENCODING_FAILED" ),
+    ERR_08219_RESPONSE_DECODING_FAILED( "ERR_08219_RESPONSE_DECODING_FAILED" ),
+    ERR_08220_SP_PAYLOAD_ENCODING_FAILED( "ERR_08220_SP_PAYLOAD_ENCODING_FAILED" ),
+    ERR_08221_BAD_END_TRANSACTION_COMMIT( "ERR_08221_BAD_END_TRANSACTION_COMMIT" ),
+    ERR_08222_BAD_END_TRANSACTION_MESSAGE_ID( "ERR_08222_BAD_END_TRANSACTION_MESSAGE_ID" ),
+    ERR_08223_INVALID_CONTROL_LIST( "ERR_08223_INVALID_CONTROL_LIST" ),
+    ERR_08224_NULL_URL_DECODING_FAILURE( "ERR_08224_NULL_URL_DECODING_FAILURE" ),
+    ERR_08225_URL_DECODING_FAILURE( "ERR_08225_URL_DECODING_FAILURE" ),
+    ERR_08226_AUTHZID_TOO_SHORT_MISSING_U_OR_DN( "ERR_08226_AUTHZID_TOO_SHORT_MISSING_U_OR_DN" ),
+    ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN( "ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN" ),
+    ERR_08228_DECORATED_SP_NULL( "ERR_08228_DECORATED_SP_NULL" ),
+    ERR_08229_UNEXPECTED_SYNC_INFO( "ERR_08229_UNEXPECTED_SYNC_INFO" ),
+
+
 
-    // ldap-jndi
-    // no exceptions to translate
+    // api-ldap-extras-codec intermediate 8300-8399
+    ERR_08300_REFRESH_DONE_DECODING_FAILED( "ERR_08300_REFRESH_DONE_DECODING_FAILED" ),
+    ERR_08301_REFRESH_DELETES_DECODING_FAILED( "ERR_08301_REFRESH_DELETES_DECODING_FAILED" ),
+    ERR_08302_BAD_UUID_VALUE_INCORRECT_LENGTH( "ERR_08302_BAD_UUID_VALUE_INCORRECT_LENGTH" ),
 
+    // api-ldap-extras-codec-api 9000-9999
+    // api-ldap-extras-codec-api <>           9000 -  9099
+    // api-ldap-extras-codec-api controls     9100 -  9199
+    ERR_9100_UNKNOWN_PASSWORD_POLICY_ERROR( "ERR_9100_UNKNOWN_PASSWORD_POLICY_ERROR" ),
+    ERR_9101_UNKNOWN_MODIFY_DN_OP_TYPE( "ERR_9101_UNKNOWN_MODIFY_DN_OP_TYPE" ),
+    ERR_9102_UNKNOWN_VLV_RESPONSE( "ERR_9102_UNKNOWN_VLV_RESPONSE" ),
+    ERR_9103_UNKNOWN_SYNC_STATE_TYPE( "ERR_9103_UNKNOWN_SYNC_STATE_TYPE" ),
+    ERR_9104_CLASS_LOADING_OF_PROC_TYPE_NOT_IMPLEMENTED( "ERR_9104_CLASS_LOADING_OF_PROC_TYPE_NOT_IMPLEMENTED" ),
+    ERR_9105_CONVERSION_VALUE_TO_JAVA_NOT_IMPLEMENTED( "ERR_9105_CONVERSION_VALUE_TO_JAVA_NOT_IMPLEMENTED" ),
 
-    // ldap-schema-manager
-    ERR_11001( "ERR_11001" ),
-    ERR_11003( "ERR_11003" ),
-    ERR_11004( "ERR_11004" ),
-    ERR_11005( "ERR_11005" ),
-    ERR_11006( "ERR_11006" ),
-    ERR_11007( "ERR_11007" ),
+    // api-ldap-extras-codec-api extended     9200 -  9299
+    ERR_9200_INTERGER_DECODING_FAILURE( "ERR_9200_INTERGER_DECODING_FAILURE" ),
 
-    // ldap-schema-manager
+    // api-ldap-extras-codec-api intermediate 9300 -  9399
+    ERR_9300_UNEXPECTED_SYNCINFO( "ERR_9300_UNEXPECTED_SYNCINFO" ),
+
+    // api-ldap-extras-sp 10000-10999 
+
+    // api-ldap-extras-trigger 11000-11999 
+    ERR_11000_TRIGGER_SPECIFICATION_INIT_WITH_NULL( "ERR_11000_TRIGGER_SPECIFICATION_INIT_WITH_NULL" ),
+    ERR_11001_TRIGGER_SPECIFICATION_INIT_WITH_EPTY_SPEC_LIST( "ERR_11001_TRIGGER_SPECIFICATION_INIT_WITH_EPTY_SPEC_LIST" ),
+    ERR_11002_TRIGGER_SPECIFICATION_PARSER_FAILURE( "ERR_11002_TRIGGER_SPECIFICATION_PARSER_FAILURE" ),
+
+    // api-ldap-extra-utils 12000-12999
     ERR_12000_CANNOT_PROCESS_EMPTY_DN( "ERR_12000_CANNOT_PROCESS_EMPTY_DN" ),
     ERR_12001_CANNOT_ADD_NODE_CHILD_EXISTS( "ERR_12001_CANNOT_ADD_NODE_CHILD_EXISTS" ),
     ERR_12002_CANNOT_ADD_NODE_ALREADY_EXISTS( "ERR_12002_CANNOT_ADD_NODE_ALREADY_EXISTS" ),
     
-    // api-ldap-model 13000 - 13999
+    // api-ldap-model <> 13000 - 13999
     ERR_13000_INVALID_LENGTH( "ERR_13000_INVALID_LENGTH" ),
     ERR_13001_INVALID_MAXOLEN( "ERR_13001_INVALID_MAXOLEN" ),
     ERR_13002_BAD_NUMBERS_OF_ROUNDS( "ERR_13002_BAD_NUMBERS_OF_ROUNDS" ),
@@ -479,7 +509,7 @@ public enum I18n
     ERR_13039_INVALID_CHAR_AT_LDAP_URL_END( "ERR_13039_INVALID_CHAR_AT_LDAP_URL_END" ),
     ERR_13040_INVALID_URL_ENCODING( "ERR_13040_INVALID_URL_ENCODING" ),
 
-    //   cursor         13100 - 13199
+    // api-ldap-model cursor 13100 - 13199
     ERR_13100_FAILURE_ON_UNDERLYING_CURSOR( "ERR_13100_FAILURE_ON_UNDERLYING_CURSOR" ),
     ERR_13101_MONITOR( "ERR_13101_MONITOR" ),
     ERR_13102_UNSUPPORTED_OPERATION( "ERR_13102_UNSUPPORTED_OPERATION" ),
@@ -495,7 +525,7 @@ public enum I18n
     ERR_13112_CANNOT_ACCESS_IF_BEFORE_FIRST( "ERR_13112_CANNOT_ACCESS_IF_BEFORE_FIRST" ),
     ERR_13113_CANNOT_ACCESS_IF_AFTER_LAST( "ERR_13113_CANNOT_ACCESS_IF_AFTER_LAST" ),
     
-    //   entry          13200 - 13299
+    // api-ldap-model entry 13200 - 13299
     ERR_13200_VALUE_CANT_BE_NORMALIZED( "ERR_13200_VALUE_CANT_BE_NORMALIZED" ),
     ERR_13201_EMPTY_OPTION_NOT_ALLOWED( "ERR_13201_EMPTY_OPTION_NOT_ALLOWED" ),
     ERR_13202_INVALID_OID_MISSING_NUMBER( "ERR_13202_INVALID_OID_MISSING_NUMBER" ),
@@ -548,7 +578,7 @@ public enum I18n
     ERR_13249_NO_COMPARATOR_FOR_AT( "ERR_13249_NO_COMPARATOR_FOR_AT" ),
     ERR_13250_VALUE_MISSING_AT_THE_END( "ERR_13250_VALUE_MISSING_AT_THE_END" ),
     
-    //   filter         13300 - 13399
+    // api-ldap-model filter 13300 - 13399
     ERR_13300_BAD_PLACE_HOLDERS_NUMBER( "ERR_13300_BAD_PLACE_HOLDERS_NUMBER" ),
     ERR_13301_NO_ORDERING_MR_FOR_AT( "ERR_13301_NO_ORDERING_MR_FOR_AT" ),
     ERR_13302_CANNOT_CREATE_NODE_NULL_ATTR( "ERR_13302_CANNOT_CREATE_NODE_NULL_ATTR" ),
@@ -569,7 +599,7 @@ public enum I18n
     ERR_13317_NO_MORE_THAN_ONE_ELEM_IN_NOT( "ERR_13317_NO_MORE_THAN_ONE_ELEM_IN_NOT" ),
     ERR_13318_INVALID_ATTR_IN_REFINEMENT( "ERR_13318_INVALID_ATTR_IN_REFINEMENT" ),
 
-    //   ldif           13400 - 13499
+    // api-ldap-model ldif 13400 - 13499
     ERR_13400_ENTRY_WITH_TWO_DNS( "ERR_13400_ENTRY_WITH_TWO_DNS" ),
     ERR_13401_CHANGE_NOT_ALLOWED( "ERR_13401_CHANGE_NOT_ALLOWED" ),
     ERR_13402_EXPECTING_ATTRIBUTE_TYPE( "ERR_13402_EXPECTING_ATTRIBUTE_TYPE" ),
@@ -647,7 +677,7 @@ public enum I18n
     ERR_13474_LINE_LENGTH_TOO_SHORT( "ERR_13474_LINE_LENGTH_TOO_SHORT" ),
     ERR_13475_UNKNOWN_ATTRIBUTETYPE( "ERR_13475_UNKNOWN_ATTRIBUTETYPE" ),
     
-    //   message        13500 - 13599
+    // api-ldap-model message 13500 - 13599
     ERR_13500_UNDEFINED_CHANGETYPE( "ERR_13500_UNDEFINED_CHANGETYPE" ),
     ERR_13501_UNKNOWN_JNDI_SCOPE( "ERR_13501_UNKNOWN_JNDI_SCOPE" ),
     ERR_13502_UNKNOWN_LDAP_URL_SCOPE( "ERR_13502_UNKNOWN_LDAP_URL_SCOPE" ),
@@ -666,7 +696,7 @@ public enum I18n
     ERR_13515_UNEXPECTED_MOD_OP( "ERR_13515_UNEXPECTED_MOD_OP" ),
     ERR_13516_UNEXPECTED_MESSAGE_TYPE( "ERR_13516_UNEXPECTED_MESSAGE_TYPE" ),
 
-    //   name           13600 - 13699
+    // api-ldap-model name 13600 - 13699
     ERR_13600_TYPE_IS_NULL_OR_EMPTY( "ERR_13600_TYPE_IS_NULL_OR_EMPTY" ),
     ERR_13601_EXPECTED_COMMA_SEMI_COLON( "ERR_13601_EXPECTED_COMMA_SEMI_COLON" ),
     ERR_13602_RDN_EMPTY( "ERR_13602_RDN_EMPTY" ),
@@ -695,7 +725,7 @@ public enum I18n
     ERR_13625_INVALID_RDN( "ERR_13625_INVALID_RDN" ),
     ERR_13626_INVALID_RDN_DUPLICATE_AVA( "ERR_13626_INVALID_RDN_DUPLICATE_AVA" ),
 
-    //   schema        13700 - 13899
+    // api-ldap-model schema 13700 - 13899
     ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT( "ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT" ),
     ERR_13701_CANNOT_MODIFY_AT_REGISTRY_COPY( "ERR_13701_CANNOT_MODIFY_AT_REGISTRY_COPY" ),
     ERR_13702_CANNOT_MODIFY_CMP_REGISTRY_COPY( "ERR_13702_CANNOT_MODIFY_CMP_REGISTRY_COPY" ),
@@ -867,6 +897,8 @@ public enum I18n
     ERR_16075_CANNOT_ACCESS_NORM_CTOR( "ERR_16075_CANNOT_ACCESS_NORM_CTOR" ),
     ERR_16076_NOT_A_SCHEMA_DEFINITION( "ERR_16076_NOT_A_SCHEMA_DEFINITION" ),
     ERR_16077_SCHEMA_MANAGER_CANT_BE_LOADED( "ERR_16077_SCHEMA_MANAGER_CANT_BE_LOADED" ),
+    ERR_16078_CANNOT_LOAD_UNKNOWN_SCHEMA( "ERR_16078_CANNOT_LOAD_UNKNOWN_SCHEMA" ),
+    ERR_16079_INVALID_SCHEMA_OBJECT_CANNOT_BE_LOADED( "ERR_16079_INVALID_SCHEMA_OBJECT_CANNOT_BE_LOADED" ),
 
     // api-utils    17000 - 17999
     ERR_17000_UNEXPECTED_PARSER_CONDITION( "ERR_17000_UNEXPECTED_PARSER_CONDITION" ),
@@ -1023,6 +1055,71 @@ public enum I18n
     MSG_03244_CONNECTION_RETRYING( "MSG_03244_CONNECTION_RETRYING" ),
     MSG_03245_CONNECTION_ERROR( "MSG_03245_CONNECTION_ERROR" ),
 
+    // api-ldap-codec-standalone 6000-6999
+    MSG_06000_REGISTERED_CONTROL_FACTORY( "MSG_06000_REGISTERED_CONTROL_FACTORY" ),
+    MSG_06001_REGISTERED_EXTENDED_OP_FACTORY( "MSG_06001_REGISTERED_EXTENDED_OP_FACTORY" ),
+    MSG_06002_REGISTERED_INTERMEDIATE_FACTORY( "MSG_06002_REGISTERED_INTERMEDIATE_FACTORY" ),
+    MSG_06003_CONTROL_FACTORY_ALREADY_LOADED( "MSG_06003_CONTROL_FACTORY_ALREADY_LOADED" ),
+    MSG_06004_REGISTERED_CONTROL_FACTORY( "MSG_06004_REGISTERED_CONTROL_FACTORY" ),
+    MSG_06005_EXTENDED_OP_FACTORY_ALREADY_LOADED( "MSG_06005_EXTENDED_OP_FACTORY_ALREADY_LOADED" ),
+    MSG_06006_INTERMEDIATE_FACTORY_ALREADY_LOADED( "MSG_06006_INTERMEDIATE_FACTORY_ALREADY_LOADED" ),
+
+    // api-ldap-extras-aci   7000-7999
+
+    // api-ldap-extras-codec 8000-8999
+    // api-ldap-extras-codec <>           8000-8099
+    MSG_08000_COOKIE( "MSG_08000_COOKIE" ),
+    MSG_08001_REFRESH_DELETES( "MSG_08001_REFRESH_DELETES�" ),
+    
+    // api-ldap-extras-codec controls     8100-8199
+    MSG_08100_MODE( "MSG_08100_MODE" ),
+    MSG_08101_FLAGS( "MSG_08101_FLAGS" ),
+    MSG_08102_MAX_RETURN_LENGTH( "MSG_08102_MAX_RETURN_LENGTH" ),
+    MSG_08103_PP_RESPONSE_CONTROL_CONTAINER_INITIALIZED( "MSG_08103_PP_RESPONSE_CONTROL_CONTAINER_INITIALIZED" ),
+    MSG_08104_RELOAD_HINT( "MSG_08104_RELOAD_HINT" ),
+    MSG_08105_SYNC_STATE_TYPE( "MSG_08105_SYNC_STATE_TYPE" ),
+    MSG_08106_ENTRY_UUID( "MSG_08106_ENTRY_UUID" ),
+    MSG_08107_VLV_REQUEST_CONTAINER_INITIALIZED( "MSG_08107_VLV_REQUEST_CONTAINER_INITIALIZED" ),
+    
+    // api-ldap-extras-codec extended     8200-8399
+    MSG_08200_CANCEL_ID( "MSG_08200_CANCEL_ID" ),
+    MSG_08201_CONTROL_OID( "MSG_08201_CONTROL_OID" ),
+    MSG_08202_CONTROL_CRITICALITY( "MSG_08202_CONTROL_CRITICALITY" ),
+    MSG_08203_CONTROL_VALUE( "MSG_08203_CONTROL_VALUE" ),
+    MSG_08204_DELAY( "MSG_08204_DELAY" ),
+    MSG_08205_GEN_PASSWORD( "MSG_08205_GEN_PASSWORD" ),
+    MSG_08206_IDENTIFIER( "MSG_08206_IDENTIFIER" ),
+    MSG_08207_ISSUER_DN( "MSG_08207_ISSUER_DN" ),
+    MSG_08208_NEW_PASSWORD( "MSG_08208_NEW_PASSWORD" ),
+    MSG_08209_OLD_PASSWORD( "MSG_08209_OLD_PASSWORD" ),
+    MSG_08210_PARAMETER_TYPE_FOUND( "MSG_08210_PARAMETER_TYPE_FOUND" ),
+    MSG_08211_PARAMETER_VALUE_FOUND( "MSG_08211_PARAMETER_VALUE_FOUND" ),
+    MSG_08212_PROCEDURE_FOUND( "MSG_08212_PROCEDURE_FOUND" ),
+    MSG_08213_SP_LANGUAGE_FOUND( "MSG_08213_SP_LANGUAGE_FOUND" ),
+    MSG_08214_STORES_A_REFERRAL( "MSG_08214_STORES_A_REFERRAL" ),
+    MSG_08215_TARGET_DN( "MSG_08215_TARGET_DN" ),
+    MSG_08216_TIME_OFFLINE( "MSG_08216_TIME_OFFLINE" ),
+    MSG_08217_USER_IDENTITY( "MSG_08217_USER_IDENTITY" ),
+    MSG_08218_KEY_ALGORITHM( "MSG_08218_KEY_ALGORITHM" ),
+    MSG_08219_SUBJECT_DN( "MSG_08219_SUBJECT_DN" ),
+
+    // api-ldap-extras-codec intermediate 8300-8399
+    MSG_08300_NEW_COOKIE( "MSG_08300_NEW_COOKIE" ),
+    MSG_08301_REFRESH_DONE( "MSG_08301_REFRESH_DONE" ),
+    MSG_08302_UUID( "MSG_08302_UUID" ),
+
+    // api-ldap-extras-codec-api 9000-9999
+    // api-ldap-extras-codec-api <>           9000 -  9099
+    // api-ldap-extras-codec-api controls     9100 -  9199
+    // api-ldap-extras-codec-api extended     9200 -  9299
+    // api-ldap-extras-codec-api intermediate 9300 -  9399
+
+    // api-ldap-extras-sp 10000-10999
+
+    // api-ldap-extras-trigger 11000-11999
+
+    // api-ldap-extra-utils <> 12000-12999
+
     // api-ldap-model 13000 - 13999
     //   cursor         13100 - 13199
     MSG_13100_CLOSING_EMPTY_CURSOR( "MSG_13100_CLOSING_EMPTY_CURSOR" ),
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index c1e457b..b780933 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -120,11 +120,6 @@ ERR_03207_SOMETHING_WRONG_HAPPENED=Message failed: something wrong has occurred
 ERR_03208_TIMEOUT=Timeout has occurred
 
 # ldap
-ERR_04001_NULL_IDENTIFICATION_TAG=identificationTag parameter is null
-ERR_04002_BAD_PRECENDENCE=precedence parameter not in [0-255]: {0}
-ERR_04003_NULL_AUTHENTICATION_LEVEL=authenticationLevel parameter is null
-ERR_04004_PARSER_FAILURE_ACI_ITEM=Parser failure on ACIItem:\n\t{0}\nAntlr exception trace:\n{1} [Line:{2} - Column:{3}]
-ERR_04005=The PDU buffer size is too small !
 ERR_04006=The And filter PDU must not be empty
 ERR_04007=The attribute description is empty
 ERR_04008=The type can''t be null
@@ -142,26 +137,6 @@ ERR_04019=The substring any filter is empty
 ERR_04020=The substring final filter is empty
 ERR_04021=The URL {0} is not valid: {1}
 ERR_04022=The type cannot be null in a MatchingRuleAssertion
-ERR_04023=Cannot put a PDU in a null buffer !
-ERR_04024=failed to decode the refreshDeletes flag for SyncDoneValueControl
-ERR_04025=failed to decode the refreshDone flag for SyncInfoValueControl
-ERR_04026=failed to decode the refreshDeletes flag for SyncInfoValueControl
-ERR_04027=Bad UUID value, its length is incorrect ( it should be 16 bytes long)
-ERR_04028=failed to decode the mode for SyncRequestValueControl
-ERR_04029=failed to decode the reloadHint flag for SyncRequestValueControl
-ERR_04030=failed to decode the mode for SyncStateValueControl
-ERR_04031=failed to decode the cancelId, the value should be between 0 and 2^31-1, it is ''{0}''
-ERR_04032=invalid target DN {0}
-ERR_04033=failed to decode the target DN, it cannot be null or empty it is ''{0}''
-ERR_04034=invalid issuer DN {0}
-ERR_04035=invalid subject DN {0}
-ERR_04036=failed to decode the delay, the value should be between 0 and 86400 seconds, it is ''{0}''
-ERR_04037=failed to decode the timeOffline, the value should be between 0 and 720 minutes, it is ''{0}''
-ERR_04038=The stored procedure language is null
-ERR_04039=The procedure can''t be null
-ERR_04040=The parameter type can''t be null
-ERR_04041=The parameter value can''t be null
-ERR_04042=The parameter value is empty. This is not allowed.
 ERR_04043=The request name must not be null
 ERR_04044=failed to decode the changeType for EntryChangeControl
 ERR_04045=The previousDN field should not contain anything if the changeType is not MODDN
@@ -214,11 +189,6 @@ ERR_04092=The new superior must not be null if the flag ''delete old DN'' is set
 ERR_04093=The attribute description must not be null
 ERR_04094=The CompareResponse must not be null
 ERR_04095=The name must not be null
-ERR_04096_NULL_CONTROL_LENGTH=The length of a control must not be null
-ERR_04097_NULL_CONTROL_OID=The OID must not be null
-ERR_04098_INVALID_CONTROL_OID=The control type {0} is not a valid OID
-ERR_04099_INVALID_CONTROL_LIST=Invalid control list {0}: {1}
-ERR_04100_BAD_CONTROL_CRITICALITY=The control criticality flag {0} is invalid: {1}. It should be 0 or 255
 ERR_04101=The scope is not in [0..2]: {0}
 ERR_04102=The derefAlias is not in [0..3]: {0}
 ERR_04103=The sizeLimit is not a valid Integer: {0}
@@ -242,18 +212,10 @@ ERR_04138=The removal of values for the missing ''{0}'' attribute is not possibl
 ERR_04141={0} is not an acceptable result code.
 ERR_04142=Only UNWILLING_TO_PERFORM and UNAVAILABLE_CRITICAL_EXTENSION result codes are allowed to be used with this exception
 ERR_04143=Only the following LDAP result codes can be used: {0}
-ERR_04163=Unknown SyncStateTypeEnum value {0}
-ERR_04164=Failed to encode payload GracefulShutdownRequest
-ERR_04165_PAYLOAD_DECODING_ERROR=failed to decode payload
-ERR_04167=Failed to encode payload CertGenerateRequest
 ERR_04168=the OID is fixed: {0}
 ERR_04169=Failed to decode response value
 ERR_04170=Failed while parsing LDAP url {0}
 ERR_04171=Failed to encode message value.
-ERR_04172=Failed while decoding response
-ERR_04174=Failed to encode payload StoredProcedureRequest
-ERR_04175=class loading of procedure type not implemented
-ERR_04176=conversion of value to java type not implemented
 ERR_04177=provider monitor class {0} not found
 ERR_04178=provider monitor class {0} does not expose a public default constructor
 ERR_04179=provider monitor class {0} failed during instantiation
@@ -306,9 +268,6 @@ ERR_04296=The MatchingRule {0} does not have a comparator. This is invalid
 ERR_04298=The AttributeType {0} does not have a superior nor a Syntax. This is invalid
 ERR_04299=The ObjectClass {0} has some AttribteType in MAY which is already declared in one of its superior MUST
 ERR_04300=The ObjectClass {0} can''t have itself as a superior, or a cycle has been detected while processing the superior''s tree, or this superior has already been added: \n{1}
-ERR_04331=TriggerSpecification cannot be initialized with any NULL argument.
-ERR_04332=TriggerSpecification cannot be initialized with emtpy SPSPec list.
-ERR_04333=Parser failure on Trigger Specification:\n\t{0}\nAntlr exception trace:\n{1}
 ERR_04334=Overlapping partitions are not allowed
 ERR_04337=The Array must not be null
 ERR_04338=Index: {0}, Length: {1}
@@ -379,28 +338,92 @@ ERR_04476=Cannot set an AttributeType {0} when another one ({1}) is already pres
 ERR_04479_INVALID_SYNTAX_VALUE= The value ''{0}'' does not respect the AttributeType ''{1}'' syntax
 ERR_04480_END_OF_STREAM=End of stream
 ERR_04481_ENTRY_NULL_VALUE=Entry can''t be null
-ERR_04490_BAD_END_TRANSACTION_COMMIT=The EndTransactionRequest Commit value {0} is invalid: {1}. It should be 0 or 255
-ERR_04490_BAD_END_TRANSACTION_MESSAGE_ID=The endTransactionResponse UpdateControl MessageID value {0} is invalid: {1}. It should be a numeric value
 
 ERR_4100_TLS_HANDSHAKE_ERROR=The TLS handshake failed
 
-# ldap-constants
-
-# ldap-schema-manager
-ERR_11001=Cannot load the unknown schema {0}
-ERR_11003=Need to implement factory method for creating a DitContentRule
-ERR_11004=Need to implement factory method for creating a DitStructureRule
-ERR_11005=Need to implement factory method for creating a MatchingRuleUse
-ERR_11006=Need to implement factory method for creating a NameForm
-ERR_11007=the SchemaObject {0} cannot be added, it''s not a valid LoadableSchemaObject.
-ERR_11008=Oid {0} for new schema entity is not unique.
-ERR_11009=Cannot add the SchemaObject {0} into a non existing schema {1} 
-ERR_11010=Cannot inject the SchemaObject {0} as it''s not associated with a schema
-ERR_11011=Oid {0} for new schema entity does not exist.
-ERR_11012=Cannot remove {0} for the registries, it would become inconsistent. The following SchemaObjects are referencing this SchemaObject: {1}
-ERR_11013=Cannot delete the SchemaObject {0} as it''s not associated with a schema
-
-# ldif
+# api-ldap-codec-standalone 6000-6999
+ERR_06000_FAILED_TO_LOAD_DEFAULT_CODEC_FACTORY=Failed to load default codec factory.
+
+# api-ldap-extras-aci   7000-7999
+ERR_07000_FILTER=filter
+ERR_07001_NULL_IDENTIFICATION_TAG=identificationTag parameter is null
+ERR_07002_BAD_PRECENDENCE=precedence parameter not in [0-255]: {0}
+ERR_07003_NULL_AUTHENTICATION_LEVEL=authenticationLevel parameter is null
+ERR_07004_PARSER_FAILURE_ACI_ITEM=Parser failure on ACIItem:\n\t{0}\nAntlr exception trace:\n{1} [Line:{2} - Column:{3}]
+
+# api-ldap-extras-codec 8000-8999
+# api-ldap-extras-codec <>           8000-8099
+ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER=Cannot put a PDU in a null buffer !
+ERR_08001_CANNOR_DECODE_REFRESH_DELETES=failed to decode the refreshDeletes flag for SyncDoneValueControl
+
+# api-ldap-extras-codec controls     8100-8199
+ERR_08100_SYNC_REQUEST_VALUE_MODE_DECODING_FAILED=failed to decode the mode for SyncRequestValueControl
+ERR_08101_RELOAD_HINT_DECODING_FAILED=failed to decode the reloadHint flag for SyncRequestValueControl
+ERR_08102_SYNC_STATE_VALUE_MODE_DECODING_FAILED=failed to decode the mode for SyncStateValueControl
+ERR_08103_BAD_CONTROL_CRITICALITY=The control criticality flag {0} is invalid: {1}. It should be 0 or 255
+ERR_08104_AD_DIR_SYNC_FLAG_DECODING_FAILURE=Error while decoding the AdDirSync flag, unknown value: {0}
+ERR_08105_AD_DIR_SYNC_FLAG_DECODING_ERROR=Error while decoding the AdDirSync flag: 
+ERR_08106_AD_DIR_SYNC_MAX_RETURN_LENGTH_DECODING_ERROR=Error while decoding the AdDirSync maxReturnLength: 
+
+# api-ldap-extras-codec extended     8200-8399
+ERR_08200_CANCELID_DECODING_FAILED=failed to decode the cancelId, the value should be between 0 and 2^31-1, it is ''{0}''
+ERR_08201_INVALID_TARGET_DN=invalid target DN {0}
+ERR_08202_NULL_TARGET_DN_DECODING_FAILED=failed to decode the target DN, it cannot be null or empty it is ''{0}''
+ERR_08203_INVALID_ISSUER_DN=invalid issuer DN {0}
+ERR_08204_INVALID_SUBJECT_DN=invalid subject DN {0}
+ERR_08205_CANNOT_DECODE_DELAY=failed to decode the delay, the value should be between 0 and 86400 seconds, it is ''{0}''
+ERR_08206_TIME_OFFLINE_DECODING_FAILED=failed to decode the timeOffline, the value should be between 0 and 720 minutes, it is ''{0}''
+ERR_08207_SP_LANGUAGE_NULL=The stored procedure language is null
+ERR_08208_NULL_PROCEDURE=The procedure can''t be null
+ERR_08209_NULL_PARAMETER_TYPE=The parameter type can''t be null
+ERR_08210_NULL_PARAMETER_VALUE=The parameter value can''t be null
+ERR_08211_EMPTY_PARAMETER_VALUE=The parameter value is empty. This is not allowed.
+ERR_08212_PDU_BUFFER_TOO_SMALL=The PDU buffer size is too small !
+ERR_08213_NULL_CONTROL_LENGTH=The length of a control must not be null
+ERR_08214_NULL_OID=The OID must not be null
+ERR_08215_INVALID_CONTROL_OID=The control type {0} is not a valid OID
+ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED=Failed to encode payload GracefulShutdownRequest
+ERR_08217_PAYLOAD_DECODING_ERROR=failed to decode payload
+ERR_08218_CERT_GENERATE_PAYLOAD_ENCODING_FAILED=Failed to encode payload CertGenerateRequest
+ERR_08219_RESPONSE_DECODING_FAILED=Failed while decoding response
+ERR_08220_SP_PAYLOAD_ENCODING_FAILED=Failed to encode payload StoredProcedureRequest
+ERR_08221_BAD_END_TRANSACTION_COMMIT=The EndTransactionRequest Commit value {0} is invalid: {1}. It should be 0 or 255
+ERR_08222_BAD_END_TRANSACTION_MESSAGE_ID=The endTransactionResponse UpdateControl MessageID value {0} is invalid: {1}. It should be a numeric value
+ERR_08223_INVALID_CONTROL_LIST=Invalid control list {0}: {1}
+ERR_08224_NULL_URL_DECODING_FAILURE=failed to decode a null URL
+ERR_08225_URL_DECODING_FAILURE=failed to decode the URL ''{0}''
+ERR_08226_AUTHZID_TOO_SHORT_MISSING_U_OR_DN=authzId too short. Must starts with either u: or dn:
+ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN=authzId Must starts with either u: or dn:, it starts with {0}
+ERR_08228_DECORATED_SP_NULL=decorated stored procedure request is null
+ERR_08229_UNEXPECTED_SYNC_INFO=Unexpected SynchronizationInfo: {0}
+
+# api-ldap-extras-codec intermediate 8300-8399
+ERR_08300_REFRESH_DONE_DECODING_FAILED=failed to decode the refreshDone flag for SyncInfoValueControl
+ERR_08301_REFRESH_DELETES_DECODING_FAILED=failed to decode the refreshDeletes flag for SyncInfoValueControl
+ERR_08302_BAD_UUID_VALUE_INCORRECT_LENGTH=Bad UUID value, its length is incorrect ( it should be 16 bytes long)
+
+# api-ldap-extras-codec-api 9000-9999
+# api-ldap-extras-codec-api <>           9000 -  9099
+# api-ldap-extras-codec-api controls     9100 -  9199
+ERR_9100_UNKNOWN_PASSWORD_POLICY_ERROR=Unknown password policy error value {0}
+ERR_9101_UNKNOWN_MODIFY_DN_OP_TYPE=Unknown modify dn operation type {0}
+ERR_9102_UNKNOWN_VLV_RESPONSE=Unknown VLV response result code {0}
+ERR_9103_UNKNOWN_SYNC_STATE_TYPE=Unknown SyncStateTypeEnum value {0}
+ERR_9104_CLASS_LOADING_OF_PROC_TYPE_NOT_IMPLEMENTED=class loading of procedure type not implemented
+ERR_9105_CONVERSION_VALUE_TO_JAVA_NOT_IMPLEMENTED=conversion of value to java type not implemented
+
+# api-ldap-extras-codec-api extended     9200 -  9299
+ERR_9200_INTERGER_DECODING_FAILURE=Failed to decode INTEGER: {0}
+
+# api-ldap-extras-codec-api intermediate 9300 -  9399
+ERR_9300_UNEXPECTED_SYNCINFO=Unexpected SynchronizationInfo: {0}
+
+# api-ldap-extras-sp 10000-10999
+
+# api-ldap-extras-trigger 11000-11999
+ERR_11000_TRIGGER_SPECIFICATION_INIT_WITH_NULL=TriggerSpecification cannot be initialized with any NULL argument.
+ERR_11001_TRIGGER_SPECIFICATION_INIT_WITH_EPTY_SPEC_LIST=TriggerSpecification cannot be initialized with emtpy SPSPec list.
+ERR_11002_TRIGGER_SPECIFICATION_PARSER_FAILURE=Parser failure on Trigger Specification:\n\t{0}\nAntlr exception trace:\n{1}
 
 # api-ldap-extra-utils <> 12000-12999
 ERR_12000_CANNOT_PROCESS_EMPTY_DN=Cannot process an empty Dn
@@ -836,6 +859,8 @@ ERR_16074_CANNOT_ACCESS_NORM_CTOR_CLASS=Cannot access the normalizer class const
 ERR_16075_CANNOT_ACCESS_NORM_CTOR=Cannot access the normalizer class constructor: {0}
 ERR_16076_NOT_A_SCHEMA_DEFINITION=The first entry in the LDIF file is not a schema definition
 ERR_16077_SCHEMA_MANAGER_CANT_BE_LOADED=SchemaManager can't be loaded: {0}
+ERR_16078_CANNOT_LOAD_UNKNOWN_SCHEMA=Cannot load the unknown schema {0}
+ERR_16079_INVALID_SCHEMA_OBJECT_CANNOT_BE_LOADED=the SchemaObject {0} cannot be added, it''s not a valid LoadableSchemaObject.
 
 # api-utils     17000 - 17999
 ERR_17000_UNEXPECTED_PARSER_CONDITION=Unexpected parser condition throwing IllegalStateException.
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/messages.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/messages.properties
index d06818c..4a59224 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/messages.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/messages.properties
@@ -96,14 +96,74 @@ MSG_03243_MESSAGE_RECEIVED=-------> {} Message received <-------
 MSG_03244_CONNECTION_RETRYING=------>>   Cannot get the connection... Retrying
 MSG_03245_CONNECTION_ERROR=------>> Connection error: {}
 
+# api-ldap-codec-standalone 6000-6999
+MSG_06000_REGISTERED_CONTROL_FACTORY=Registered pre-bundled control factory: {0}
+MSG_06001_REGISTERED_EXTENDED_OP_FACTORY=Registered pre-bundled extended operation factory: {0}
+MSG_06002_REGISTERED_INTERMEDIATE_FACTORY=Registered pre-bundled intermediate response factory: {0}
+MSG_06003_CONTROL_FACTORY_ALREADY_LOADED=Factory for control {0} was already loaded
+MSG_06004_REGISTERED_CONTROL_FACTORY=Registered control factory: {0}
+MSG_06005_EXTENDED_OP_FACTORY_ALREADY_LOADED=Factory for extended operation {0} was already loaded
+MSG_06006_INTERMEDIATE_FACTORY_ALREADY_LOADED=Factory for Intermediate Response {0} was already loaded
 
+# api-ldap-extras-aci   7000-7999
 
+# api-ldap-extras-codec 8000-8999
+# api-ldap-extras-codec <>           8000-8099
+MSG_08000_COOKIE=cookie = {0}
+MSG_08001_REFRESH_DELETES=refreshDeletes = {0}
 
+# api-ldap-extras-codec controls     8100-8199
+MSG_08100_MODE=Mode =  {0}
+MSG_08101_FLAGS=flags = {0}
+MSG_08102_MAX_RETURN_LENGTH=maxReturnLength = {0}
+MSG_08103_PP_RESPONSE_CONTROL_CONTAINER_INITIALIZED=PasswordPolicyResponseControlContainer initialized
+MSG_08104_RELOAD_HINT=reloadHint = {0}
+MSG_08105_SYNC_STATE_TYPE=SyncStateType = {0}
+MSG_08106_ENTRY_UUID=entryUUID = {0}
+MSG_08107_VLV_REQUEST_CONTAINER_INITIALIZED=VirtualListViewRequestContainer initialized
 
-# ldap model messages
+# api-ldap-extras-codec extended     8200-8399
+MSG_08200_CANCEL_ID=CancelId = {0}
+MSG_08201_CONTROL_OID=Control OID: {0}
+MSG_08202_CONTROL_CRITICALITY=Control criticality: {0}
+MSG_08203_CONTROL_VALUE=Control value: {0}
+MSG_08204_DELAY=Delay = {0}
+MSG_08205_GEN_PASSWORD=GenPassword = (ignored for security reasons)
+MSG_08206_IDENTIFIER=Identifier = {0}
+MSG_08207_ISSUER_DN=Issuer Dn = {0}
+MSG_08208_NEW_PASSWORD=NewPassword = (ignored for security reasons)
+MSG_08209_OLD_PASSWORD=OldPassword = (ignored for security reasons)
+MSG_08210_PARAMETER_TYPE_FOUND=Parameter type found: {0}
+MSG_08211_PARAMETER_VALUE_FOUND=Parameter value found: {0}
+MSG_08212_PROCEDURE_FOUND=Procedure found: {0}
+MSG_08213_SP_LANGUAGE_FOUND=SP language found: {0}
+MSG_08214_STORES_A_REFERRAL=Stores a referral: {0}
+MSG_08215_TARGET_DN=Target Dn = {0}
+MSG_08216_TIME_OFFLINE=Time Offline = {0}
+MSG_08217_USER_IDENTITY=UserIdentity = {0}
+MSG_08218_KEY_ALGORITHM=Key algorithm = {0}
+MSG_08219_SUBJECT_DN=Subject Dn = {0}
 
-# api-ldap-model 13000-13999
-#   cursor       13100-13199
+# api-ldap-extras-codec intermediate 8300-8399
+MSG_08300_NEW_COOKIE=newcookie = {0}
+MSG_08301_REFRESH_DONE=refreshDone = {0}
+MSG_08302_UUID=UUID = {0}
+
+# api-ldap-extras-codec-api 9000-9999
+# api-ldap-extras-codec-api <>           9000 -  9099
+# api-ldap-extras-codec-api controls     9100 -  9199
+# api-ldap-extras-codec-api extended     9200 -  9299
+# api-ldap-extras-codec-api intermediate 9300 -  9399
+
+
+# api-ldap-extras-sp 10000-10999
+
+# api-ldap-extras-trigger 11000-11999
+
+# api-ldap-extra-utils <> 12000-12999
+
+# api-ldap-model <> 13000-13999
+# api-ldap-model cursor       13100-13199
 MSG_13100_CLOSING_EMPTY_CURSOR=Closing EmptyCursor {0}
 MSG_13101_CLOSING_LIST_CURSOR=Closing ListCursor {0}
 MSG_13102_CLOSING_SET_CURSOR=Closing SetCursor {0}
@@ -113,15 +173,15 @@ MSG_13104_CREATING_LIST_CURSOR=Creating ListCursor {0}
 MSG_13105_CREATING_SET_CURSOR=Creating SetCursor {0}
 MSG_13106_CREATING_SINGLE_CURSOR=Creating SingletonCursor {0}
 
-#   entry       13200-13299
+# api-ldap-model entry       13200-13299
 MSG_13200_CANT_STORE_ATTRIBUTE=The attribute ''{0}'' cannot be stored
 MSG_13201_DN_CANT_BE_NORMALIZED=The Dn ''{0}'' cannot be normalized
 MSG_13202_AT_IS_NULL=The attributeType is null
 MSG_13203_MISSING_ATTRIBUTE_IN_ENTRY=The attribute ''{0}'' does not exist in the entry
 
-#   filter       13300-13399
+# api-ldap-model filter       13300-13399
 
-#   ldif         13400-13499
+# api-ldap-model ldif         13400-13499
 MSG_13400_LDIF_VERSION=Ldif version: {0}
 MSG_13401_PARSED_NO_ENTRY=Parsed no entry.
 MSG_13402_PARSED_ONE_ENTRY=Parsed one entry.
@@ -138,12 +198,12 @@ MSG_13412_NEXT_RETURNING_LDIF=next(): -- returning ldif {0}\n
 MSG_13413_NO_VERSION_ASSUMING_1=No version information: assuming version: 1
 MSG_13414_LDIF_FILE_EMPTY=The ldif file is empty
 
-#   message      13500-13599
+# api-ldap-model message      13500-13599
 MSG_13500_ATTRIBUTE_NOT_IN_SCHEMA=Requested attribute {0} does not exist in the schema, it will be ignored
 
-#   name         13600-13699
+# api-ldap-model name         13600-13699
 
-#   schema       13700-13899
+# api-ldap-model schema       13700-13899
 MSG_13700_FAILED_TO_NORMALIZE=Failed to normalize: {0}
 MSG_13701_SYNTAX_VALID=Syntax valid for ''{0}''
 MSG_13702_REMOVED_FROM_REGISTRY=Removed {0} with oid {1} from the registry
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/BasicControlDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/BasicControlDecorator.java
index 019bec6..5baa3cc 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/BasicControlDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/BasicControlDecorator.java
@@ -93,7 +93,7 @@ public class BasicControlDecorator extends ControlDecorator<Control>
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         if ( valueLength != 0 )
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/CheckLengthNotNull.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/CheckLengthNotNull.java
index ed23577..4dd90ba 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/CheckLengthNotNull.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/CheckLengthNotNull.java
@@ -62,7 +62,7 @@ public class CheckLengthNotNull extends GrammarAction<LdapMessageContainer<Messa
         // The Length should be null
         if ( expectedLength == 0 )
         {
-            String msg = I18n.err( I18n.ERR_04096_NULL_CONTROL_LENGTH );
+            String msg = I18n.err( I18n.ERR_08213_NULL_CONTROL_LENGTH );
             LOG.error( msg );
 
             // This will generate a PROTOCOL_ERROR
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java
index 3664262..a294c2c 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java
@@ -69,7 +69,7 @@ public class AddControl extends GrammarAction<LdapMessageContainer<MessageDecora
         // We have to handle the special case of a 0 length OID
         if ( tlv.getLength() == 0 )
         {
-            String msg = I18n.err( I18n.ERR_04097_NULL_CONTROL_OID );
+            String msg = I18n.err( I18n.ERR_08214_NULL_OID );
             LOG.error( msg );
 
             // This will generate a PROTOCOL_ERROR
@@ -82,7 +82,7 @@ public class AddControl extends GrammarAction<LdapMessageContainer<MessageDecora
         // The OID is encoded as a String, not an Object Id
         if ( !Oid.isOid( oidValue ) )
         {
-            String msg = I18n.err( I18n.ERR_04098_INVALID_CONTROL_OID, oidValue );
+            String msg = I18n.err( I18n.ERR_08215_INVALID_CONTROL_OID, oidValue );
             LOG.error( msg );
 
             // This will generate a PROTOCOL_ERROR
@@ -100,7 +100,7 @@ public class AddControl extends GrammarAction<LdapMessageContainer<MessageDecora
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control OID : {}", oidValue );
+            LOG.debug( I18n.msg( I18n.MSG_08201_CONTROL_OID, oidValue ) );
         }
     }
 }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java
index c8f88a9..a5a6f4c 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java
@@ -88,7 +88,7 @@ public class StoreControlCriticality extends GrammarAction<LdapMessageContainer<
         catch ( BooleanDecoderException bde )
         {
             LOG.error( I18n
-                .err( I18n.ERR_04100_BAD_CONTROL_CRITICALITY, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+                .err( I18n.ERR_08103_BAD_CONTROL_CRITICALITY, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
 
             // This will generate a PROTOCOL_ERROR
             throw new DecoderException( bde.getMessage(), bde );
@@ -99,7 +99,7 @@ public class StoreControlCriticality extends GrammarAction<LdapMessageContainer<
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control criticality : {}", control.isCritical() );
+            LOG.debug( I18n.msg( I18n.MSG_08202_CONTROL_CRITICALITY, control.isCritical() ) );
         }
     }
 }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlValue.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlValue.java
index 5c6d8a8..a679119 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlValue.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlValue.java
@@ -24,6 +24,7 @@ import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
 import org.apache.directory.api.asn1.ber.tlv.BerValue;
 import org.apache.directory.api.asn1.ber.tlv.TLV;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.codec.api.LdapMessageContainer;
 import org.apache.directory.api.ldap.codec.api.MessageDecorator;
@@ -90,7 +91,7 @@ public class StoreControlValue extends GrammarAction<LdapMessageContainer<Messag
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control value : " + Strings.dumpBytes( control.getValue() ) );
+            LOG.debug( I18n.msg( I18n.MSG_08203_CONTROL_VALUE, Strings.dumpBytes( control.getValue() ) ) );
         }
     }
 }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
index 911a545..cea5292 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
@@ -100,7 +100,7 @@ public class LdapEncoder
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -114,7 +114,7 @@ public class LdapEncoder
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         // The control type
@@ -172,7 +172,7 @@ public class LdapEncoder
             }
             catch ( BufferOverflowException boe )
             {
-                throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+                throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
             }
 
             // The message Id
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/proxiedauthz/ProxiedAuthzDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/proxiedauthz/ProxiedAuthzDecorator.java
index 2a5f3e8..83d4471 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/proxiedauthz/ProxiedAuthzDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/proxiedauthz/ProxiedAuthzDecorator.java
@@ -118,7 +118,7 @@ public class ProxiedAuthzDecorator extends ControlDecorator<ProxiedAuthz> implem
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         if ( getAuthzId() != null )
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeDecorator.java
index beb3477..3ccb71a 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeDecorator.java
@@ -148,7 +148,7 @@ public class EntryChangeDecorator extends ControlDecorator<EntryChange> implemen
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsDecorator.java
index d20a419..6ebde73 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsDecorator.java
@@ -127,7 +127,7 @@ public class PagedResultsDecorator extends ControlDecorator<PagedResults> implem
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Now encode the PagedSearch specific part
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchDecorator.java
index 9bbe748..6e8f0bf 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchDecorator.java
@@ -117,7 +117,7 @@ public class PersistentSearchDecorator extends ControlDecorator<PersistentSearch
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Now encode the PagedSearch specific part
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesDecorator.java
index bc2453c..1abfb55 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesDecorator.java
@@ -97,7 +97,7 @@ public class SubentriesDecorator extends ControlDecorator<Subentries> implements
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Now encode the Subentries specific part
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java
index d7147e2..f047b91 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java
@@ -133,7 +133,7 @@ public class SortRequestDecorator extends ControlDecorator<SortRequest> implemen
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseDecorator.java
index b9fcdcc..7d66c0d 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseDecorator.java
@@ -105,7 +105,7 @@ public class SortResponseDecorator extends ControlDecorator<SortResponse> implem
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AbandonRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AbandonRequestDecorator.java
index fd42ba4..927ec79 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AbandonRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AbandonRequestDecorator.java
@@ -143,7 +143,7 @@ public AbandonRequest addAllControls( Control[] controls )
         }
         catch ( BufferOverflowException boe )
         {
-            String msg = I18n.err( I18n.ERR_04005 );
+            String msg = I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL );
             throw new EncoderException( msg, boe );
         }
 
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AddResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AddResponseDecorator.java
index c34d1ba..de3ec5e 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AddResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/AddResponseDecorator.java
@@ -114,7 +114,7 @@ public class AddResponseDecorator extends ResponseDecorator<AddResponse> impleme
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
     }
 }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindRequestDecorator.java
index f758b1a..6324299 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindRequestDecorator.java
@@ -397,7 +397,7 @@ public class BindRequestDecorator extends SingleReplyRequestDecorator<BindReques
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         // The version (LDAP V3 only)
@@ -443,7 +443,7 @@ public class BindRequestDecorator extends SingleReplyRequestDecorator<BindReques
             }
             catch ( BufferOverflowException boe )
             {
-                String msg = I18n.err( I18n.ERR_04005 );
+                String msg = I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL );
                 throw new EncoderException( msg, boe );
             }
         }
@@ -467,7 +467,7 @@ public class BindRequestDecorator extends SingleReplyRequestDecorator<BindReques
             }
             catch ( BufferOverflowException boe )
             {
-                String msg = I18n.err( I18n.ERR_04005 );
+                String msg = I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL );
                 throw new EncoderException( msg, boe );
             }
         }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindResponseDecorator.java
index 32210f8..278dc94 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/BindResponseDecorator.java
@@ -158,7 +158,7 @@ public class BindResponseDecorator extends ResponseDecorator<BindResponse> imple
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareRequestDecorator.java
index f2c3594..323253f 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareRequestDecorator.java
@@ -272,7 +272,7 @@ public CompareRequest removeControl( Control control )
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         // The attributeDesc
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareResponseDecorator.java
index 5c2316e..1c095be 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/CompareResponseDecorator.java
@@ -116,7 +116,7 @@ public class CompareResponseDecorator extends ResponseDecorator<CompareResponse>
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteRequestDecorator.java
index 6679995..e1f9bac 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteRequestDecorator.java
@@ -175,7 +175,7 @@ public class DeleteRequestDecorator extends SingleReplyRequestDecorator<DeleteRe
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteResponseDecorator.java
index 7e65b49..a1f03f0 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/DeleteResponseDecorator.java
@@ -101,7 +101,7 @@ public class DeleteResponseDecorator extends ResponseDecorator<DeleteResponse>
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
index f3b0149..d46e957 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
@@ -241,7 +241,7 @@ public ExtendedRequest addControl( Control control )
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedResponseDecorator.java
index 27a1642..81b0aee 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedResponseDecorator.java
@@ -214,7 +214,7 @@ public class ExtendedResponseDecorator<R extends ExtendedResponse> extends Respo
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/IntermediateResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/IntermediateResponseDecorator.java
index f24817b..33f852b 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/IntermediateResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/IntermediateResponseDecorator.java
@@ -195,7 +195,7 @@ public class IntermediateResponseDecorator<I extends IntermediateResponse> exten
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/LdapResultDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/LdapResultDecorator.java
index 935b341..064ebf0 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/LdapResultDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/LdapResultDecorator.java
@@ -258,7 +258,7 @@ public class LdapResultDecorator implements LdapResult, Decorator<LdapResult>
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         if ( decoratedLdapResult.isDefaultSuccess() )
@@ -276,7 +276,7 @@ public class LdapResultDecorator implements LdapResult, Decorator<LdapResult>
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         // The matchedDN
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnRequestDecorator.java
index dffbbde..e88e3f6 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnRequestDecorator.java
@@ -307,7 +307,7 @@ public class ModifyDnRequestDecorator extends SingleReplyRequestDecorator<Modify
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnResponseDecorator.java
index d524a49..cb80479 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyDnResponseDecorator.java
@@ -99,7 +99,7 @@ public class ModifyDnResponseDecorator extends ResponseDecorator<ModifyDnRespons
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyRequestDecorator.java
index bd81320..deb42d7 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyRequestDecorator.java
@@ -609,7 +609,7 @@ public class ModifyRequestDecorator extends SingleReplyRequestDecorator<ModifyRe
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyResponseDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyResponseDecorator.java
index e9d332e..a7ed73c 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyResponseDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ModifyResponseDecorator.java
@@ -100,7 +100,7 @@ public class ModifyResponseDecorator extends ResponseDecorator<ModifyResponse>
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
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 be38b25..0461796 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
@@ -1052,7 +1052,7 @@ public class SearchRequestDecorator extends MessageDecorator<SearchRequest> impl
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultDoneDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultDoneDecorator.java
index bb6bece..c3dcac4 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultDoneDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultDoneDecorator.java
@@ -102,7 +102,7 @@ public class SearchResultDoneDecorator extends ResponseDecorator<SearchResultDon
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultEntryDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultEntryDecorator.java
index 6da9799..97af95c 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultEntryDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultEntryDecorator.java
@@ -391,7 +391,7 @@ public class SearchResultEntryDecorator extends MessageDecorator<SearchResultEnt
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultReferenceDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultReferenceDecorator.java
index 497de34..d29cd95 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultReferenceDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchResultReferenceDecorator.java
@@ -167,7 +167,7 @@ public class SearchResultReferenceDecorator extends MessageDecorator<SearchResul
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/UnbindRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/UnbindRequestDecorator.java
index e446a2e..8017e49 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/UnbindRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/UnbindRequestDecorator.java
@@ -128,7 +128,7 @@ public class UnbindRequestDecorator extends RequestDecorator<UnbindRequest> impl
         }
         catch ( BufferOverflowException boe )
         {
-            String msg = I18n.err( I18n.ERR_04005 );
+            String msg = I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL );
             throw new EncoderException( msg, boe );
         }
 
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java
index 1580ce6..efa7088 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java
@@ -32,6 +32,7 @@ import javax.naming.ldap.BasicControl;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.EncoderException;
 import org.apache.directory.api.asn1.ber.Asn1Container;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.BasicControlDecorator;
 import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.codec.api.ControlFactory;
@@ -120,7 +121,7 @@ public class DefaultLdapCodecService implements LdapApiService
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", cascadeFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, cascadeFactory.getOid() ) );
         }
 
         ControlFactory<EntryChange> entryChangeFactory = new EntryChangeFactory( this );
@@ -128,7 +129,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", entryChangeFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, entryChangeFactory.getOid() ) );
         }
 
         ControlFactory<ManageDsaIT> manageDsaItFactory = new ManageDsaITFactory( this );
@@ -136,7 +137,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", manageDsaItFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, manageDsaItFactory.getOid() ) );
         }
 
         ControlFactory<ProxiedAuthz> proxiedAuthzFactory = new ProxiedAuthzFactory( this );
@@ -144,7 +145,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", proxiedAuthzFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, proxiedAuthzFactory.getOid() ) );
         }
 
         ControlFactory<PagedResults> pageResultsFactory = new PagedResultsFactory( this );
@@ -152,7 +153,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", pageResultsFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, pageResultsFactory.getOid() ) );
         }
 
         ControlFactory<PersistentSearch> persistentSearchFactory = new PersistentSearchFactory( this );
@@ -160,7 +161,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", persistentSearchFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, persistentSearchFactory.getOid() ) );
         }
 
         ControlFactory<Subentries> subentriesFactory = new SubentriesFactory( this );
@@ -168,7 +169,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", subentriesFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, subentriesFactory.getOid() ) );
         }
 
         ControlFactory<SortRequest> sortRequestFactory = new SortRequestFactory( this );
@@ -176,7 +177,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", sortRequestFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortRequestFactory.getOid() ) );
         }
 
         ControlFactory<SortResponse> sortResponseFactory = new SortResponseFactory( this );
@@ -184,7 +185,7 @@ public class DefaultLdapCodecService implements LdapApiService
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", sortResponseFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortResponseFactory.getOid() ) );
         }
     }
 
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AndFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AndFilter.java
index 5e3661b..fb0397a 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AndFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AndFilter.java
@@ -109,7 +109,7 @@ public class AndFilter extends ConnectorFilter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -120,7 +120,7 @@ public class AndFilter extends ConnectorFilter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         super.encode( buffer );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AttributeValueAssertionFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AttributeValueAssertionFilter.java
index 4d75c99..ae74966 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AttributeValueAssertionFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/AttributeValueAssertionFilter.java
@@ -186,7 +186,7 @@ public class AttributeValueAssertionFilter extends Filter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -218,7 +218,7 @@ public class AttributeValueAssertionFilter extends Filter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         // The attribute desc
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ConnectorFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ConnectorFilter.java
index 9b74ea8..7954996 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ConnectorFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ConnectorFilter.java
@@ -132,7 +132,7 @@ public abstract class ConnectorFilter extends Filter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // encode each filter
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java
index 39ca640..581f503 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java
@@ -265,7 +265,7 @@ public class ExtensibleMatchFilter extends Filter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -321,7 +321,7 @@ public class ExtensibleMatchFilter extends Filter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java
index 977dc13..2854f15 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java
@@ -141,7 +141,7 @@ public class NotFilter extends ConnectorFilter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -152,7 +152,7 @@ public class NotFilter extends ConnectorFilter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         super.encode( buffer );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/OrFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/OrFilter.java
index dfded38..5dccebc 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/OrFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/OrFilter.java
@@ -108,7 +108,7 @@ public class OrFilter extends ConnectorFilter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -119,7 +119,7 @@ public class OrFilter extends ConnectorFilter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         super.encode( buffer );
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/PresentFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/PresentFilter.java
index bf4c957..fe501ca 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/PresentFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/PresentFilter.java
@@ -119,7 +119,7 @@ public class PresentFilter extends Filter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -131,7 +131,7 @@ public class PresentFilter extends Filter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java
index cd1d885..a5c193e 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java
@@ -292,7 +292,7 @@ public class SubstringFilter extends Filter
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         try
@@ -346,7 +346,7 @@ public class SubstringFilter extends Filter
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return buffer;
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 9aa56cf..2ed50bc 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
@@ -22,6 +22,7 @@ package org.apache.directory.api.ldap.codec.standalone;
 
 import java.util.Map;
 
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.ControlFactory;
 import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
 import org.apache.directory.api.ldap.codec.api.IntermediateResponseFactory;
@@ -113,7 +114,7 @@ public final class CodecFactoryUtil
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", cascadeFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, cascadeFactory.getOid() ) );
         }
 
         ControlFactory<EntryChange> entryChangeFactory = new EntryChangeFactory( apiService );
@@ -121,7 +122,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", entryChangeFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, entryChangeFactory.getOid() ) );
         }
 
         ControlFactory<ManageDsaIT> manageDsaITFactory = new ManageDsaITFactory( apiService );
@@ -129,7 +130,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", manageDsaITFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, manageDsaITFactory.getOid() ) );
         }
 
         ControlFactory<ProxiedAuthz> proxiedAuthzFactory = new ProxiedAuthzFactory( apiService );
@@ -137,7 +138,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", proxiedAuthzFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, proxiedAuthzFactory.getOid() ) );
         }
 
         ControlFactory<PagedResults> pagedResultsFactory = new PagedResultsFactory( apiService );
@@ -145,7 +146,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", pagedResultsFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, pagedResultsFactory.getOid() ) );
         }
 
         ControlFactory<PersistentSearch> persistentSearchFactory = new PersistentSearchFactory( apiService );
@@ -153,7 +154,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", persistentSearchFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, persistentSearchFactory.getOid() ) );
         }
 
         ControlFactory<Subentries> subentriesFactory = new SubentriesFactory( apiService );
@@ -161,7 +162,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", subentriesFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, subentriesFactory.getOid() ) );
         }
         
         ControlFactory<SortRequest> sortRequestFactory = new SortRequestFactory( apiService );
@@ -169,7 +170,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", sortRequestFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortRequestFactory.getOid() ) );
         }
 
         ControlFactory<SortResponse> sortResponseFactory = new SortResponseFactory( apiService );
@@ -177,7 +178,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", sortResponseFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortResponseFactory.getOid() ) );
         }
 
         // Extra controls
@@ -186,7 +187,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", adDirSyncFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, adDirSyncFactory.getOid() ) );
         }
         
         ControlFactory<AdShowDeleted> adShowDeletedFactory = new AdShowDeletedFactory( apiService );
@@ -194,7 +195,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", adShowDeletedFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, adShowDeletedFactory.getOid() ) );
         }
         
         ControlFactory<AdPolicyHints> adPolicyHintsFactory = new AdPolicyHintsFactory( apiService );
@@ -202,7 +203,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", adPolicyHintsFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, adPolicyHintsFactory.getOid() ) );
         }
 
         ControlFactory<ChangeNotifications> changeNotificationsFactory = new ChangeNotificationsFactory( apiService );
@@ -210,7 +211,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", changeNotificationsFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, changeNotificationsFactory.getOid() ) );
         }
 
         ControlFactory<PermissiveModify> permissiveModifyFactory = new PermissiveModifyFactory( apiService );
@@ -218,7 +219,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", permissiveModifyFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, permissiveModifyFactory.getOid() ) );
         }
 
         ControlFactory<PasswordPolicy> passwordPolicyFactory = new PasswordPolicyFactory( apiService );
@@ -226,7 +227,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", passwordPolicyFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, passwordPolicyFactory.getOid() ) );
         }
 
         ControlFactory<SyncDoneValue> syncDoneValueFactory = new SyncDoneValueFactory( apiService );
@@ -234,7 +235,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", syncDoneValueFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, syncDoneValueFactory.getOid() ) );
         } 
 
         ControlFactory<SyncRequestValue> syncRequestValueFactory = new SyncRequestValueFactory( apiService );
@@ -242,7 +243,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", syncRequestValueFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, syncRequestValueFactory.getOid() ) );
         }
 
         ControlFactory<SyncStateValue> syncStateValueFactory = new SyncStateValueFactory( apiService );
@@ -250,7 +251,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", syncStateValueFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, syncStateValueFactory.getOid() ) );
         }
 
         ControlFactory<TransactionSpecification> transactionSpecificationFactory = new TransactionSpecificationFactory( apiService );
@@ -258,7 +259,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", transactionSpecificationFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, transactionSpecificationFactory.getOid() ) );
         }
 
         ControlFactory<VirtualListViewRequest> virtualListViewRequestFactory = new VirtualListViewRequestFactory(
@@ -267,7 +268,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", virtualListViewRequestFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, virtualListViewRequestFactory.getOid() ) );
         }
 
         ControlFactory<VirtualListViewResponse> virtualListViewResponseFactory = new VirtualListViewResponseFactory(
@@ -276,7 +277,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled control factory: {}", virtualListViewResponseFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, virtualListViewResponseFactory.getOid() ) );
         }
     }
 
@@ -306,7 +307,7 @@ public final class CodecFactoryUtil
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", cancelFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, cancelFactory.getOid() ) );
         }
 
         CertGenerationFactory certGenerationFactory = new CertGenerationFactory( apiService );
@@ -314,7 +315,7 @@ public final class CodecFactoryUtil
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", certGenerationFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, certGenerationFactory.getOid() ) );
         }
 
         EndTransactionFactory endTransactionFactory = new EndTransactionFactory( apiService );
@@ -322,7 +323,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", endTransactionFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, endTransactionFactory.getOid() ) );
         }
 
         GracefulDisconnectFactory gracefulDisconnectFactory = new GracefulDisconnectFactory( apiService );
@@ -330,7 +331,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", gracefulDisconnectFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, gracefulDisconnectFactory.getOid() ) );
         }
 
         GracefulShutdownFactory gracefulShutdownFactory = new GracefulShutdownFactory( apiService );
@@ -338,7 +339,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", gracefulShutdownFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, gracefulShutdownFactory.getOid() ) );
         }
 
         PasswordModifyFactory passwordModifyFactory = new PasswordModifyFactory( apiService );
@@ -346,7 +347,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", passwordModifyFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, passwordModifyFactory.getOid() ) );
         }
 
         StartTlsFactory startTlsFactory = new StartTlsFactory( apiService );
@@ -354,7 +355,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", startTlsFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, startTlsFactory.getOid() ) );
         }
 
         StartTransactionFactory startTransactionFactory = new StartTransactionFactory( apiService );
@@ -362,7 +363,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", startTransactionFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, startTransactionFactory.getOid() ) );
         }
 
         StoredProcedureFactory storedProcedureFactory = new StoredProcedureFactory( apiService );
@@ -370,7 +371,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", storedProcedureFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, storedProcedureFactory.getOid() ) );
         }
 
         WhoAmIFactory whoAmIFactory = new WhoAmIFactory( apiService );
@@ -378,7 +379,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", whoAmIFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, whoAmIFactory.getOid() ) );
         }
     }
 
@@ -400,7 +401,7 @@ public final class CodecFactoryUtil
         
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled intermediate response factory: {}", syncInfoValueFactory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06002_REGISTERED_INTERMEDIATE_FACTORY, syncInfoValueFactory.getOid() ) );
         }
     }
 }
diff --git a/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/StandaloneLdapApiService.java b/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/StandaloneLdapApiService.java
index cf951ae..24fa0e3 100644
--- a/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/StandaloneLdapApiService.java
+++ b/ldap/codec/standalone/src/main/java/org/apache/directory/api/ldap/codec/standalone/StandaloneLdapApiService.java
@@ -24,6 +24,7 @@ import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.ControlFactory;
 import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
 import org.apache.directory.api.ldap.codec.api.IntermediateResponseFactory;
@@ -199,7 +200,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
             }
             catch ( Exception cause )
             {
-                throw new RuntimeException( "Failed to load default codec factory.", cause );
+                throw new RuntimeException( I18n.err( I18n.ERR_06000_FAILED_TO_LOAD_DEFAULT_CODEC_FACTORY ), cause );
             }
         }
     }
@@ -328,7 +329,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
         {
             if ( LOG.isDebugEnabled() )
             {
-                LOG.debug( "Factory for control {} was already loaded", controlFQCN );
+                LOG.debug( I18n.msg( I18n.MSG_06003_CONTROL_FACTORY_ALREADY_LOADED, controlFQCN ) );
             }
             
             return;
@@ -348,7 +349,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered control factory: {}", factory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06004_REGISTERED_CONTROL_FACTORY, factory.getOid() ) );
         }
     }
 
@@ -378,7 +379,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
         {
             if ( LOG.isDebugEnabled() )
             {
-                LOG.debug( "Factory for extended operation {} was already loaded", extendedOperationFQCN );
+                LOG.debug( I18n.msg( I18n.MSG_06005_EXTENDED_OP_FACTORY_ALREADY_LOADED, extendedOperationFQCN ) );
             }
             
             return;
@@ -401,7 +402,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
 
         if ( LOG.isInfoEnabled() )
         {
-            LOG.info( "Registered pre-bundled extended operation factory: {}", factory.getOid() );
+            LOG.info( I18n.msg( I18n.MSG_06001_REGISTERED_EXTENDED_OP_FACTORY, factory.getOid() ) );
         }
     }
 
@@ -431,7 +432,7 @@ public class StandaloneLdapApiService extends DefaultLdapCodecService
         {
             if ( LOG.isDebugEnabled() )
             {
-                LOG.debug( "Factory for Intermediate Response {} was already loaded", intermediateResponseFQCN );
+                LOG.debug( I18n.msg( I18n.MSG_06006_INTERMEDIATE_FACTORY_ALREADY_LOADED, intermediateResponseFQCN ) );
             }
             
             return;
diff --git a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItem.java b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItem.java
index e518fce..c687304 100644
--- a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItem.java
+++ b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItem.java
@@ -58,17 +58,17 @@ public abstract class ACIItem
     {
         if ( identificationTag == null )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04001_NULL_IDENTIFICATION_TAG ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07001_NULL_IDENTIFICATION_TAG ) );
         }
 
         if ( ( precedence < 0 ) || ( precedence > 255 ) )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04002_BAD_PRECENDENCE, precedence ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07002_BAD_PRECENDENCE, precedence ) );
         }
 
         if ( authenticationLevel == null )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04003_NULL_AUTHENTICATION_LEVEL ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07003_NULL_AUTHENTICATION_LEVEL ) );
         }
 
         this.identificationTag = identificationTag;
diff --git a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemChecker.java b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemChecker.java
index 094f8b8..1b816cb 100644
--- a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemChecker.java
+++ b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemChecker.java
@@ -98,12 +98,12 @@ public class ACIItemChecker
         catch ( TokenStreamException e )
         {
             throw new ParseException( I18n
-                .err( I18n.ERR_04004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), 0 );
+                .err( I18n.ERR_07004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), 0 );
         }
         catch ( RecognitionException e )
         {
             throw new ParseException( I18n
-                .err( I18n.ERR_04004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), e.getColumn() );
+                .err( I18n.ERR_07004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), e.getColumn() );
         }
     }
 
diff --git a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemParser.java b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemParser.java
index c0f0a55..1f0fe95 100644
--- a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemParser.java
+++ b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACIItemParser.java
@@ -130,13 +130,13 @@ public class ACIItemParser
         catch ( TokenStreamException e )
         {
             throw new ParseException( I18n
-                .err( I18n.ERR_04004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), 0 );
+                .err( I18n.ERR_07004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage() ), 0 );
         }
         catch ( RecognitionException e )
         {
             throw new ParseException(
                 I18n
-                    .err( I18n.ERR_04004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage(), e.getLine(),
+                    .err( I18n.ERR_07004_PARSER_FAILURE_ACI_ITEM, spec, e.getLocalizedMessage(), e.getLine(),
                         e.getColumn() ), e.getColumn() );
         }
 
diff --git a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACITuple.java b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACITuple.java
index dfd2251..6a4c22a 100644
--- a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACITuple.java
+++ b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/ACITuple.java
@@ -77,12 +77,12 @@ public class ACITuple
     {
         if ( authenticationLevel == null )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04003_NULL_AUTHENTICATION_LEVEL ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07003_NULL_AUTHENTICATION_LEVEL ) );
         }
 
         if ( precedence < 0 || precedence > 255 )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04002_BAD_PRECENDENCE, precedence ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07002_BAD_PRECENDENCE, precedence ) );
         }
 
         this.userClasses = Collections.unmodifiableCollection( new ArrayList<UserClass>( userClasses ) );
diff --git a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/protectedItem/RangeOfValuesItem.java b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/protectedItem/RangeOfValuesItem.java
index c0c7814..47647f4 100644
--- a/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/protectedItem/RangeOfValuesItem.java
+++ b/ldap/extras/aci/src/main/java/org/apache/directory/api/ldap/aci/protectedItem/RangeOfValuesItem.java
@@ -20,6 +20,7 @@
 package org.apache.directory.api.ldap.aci.protectedItem;
 
 
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.aci.ProtectedItem;
 import org.apache.directory.api.ldap.model.filter.ExprNode;
 
@@ -44,7 +45,7 @@ public class RangeOfValuesItem extends ProtectedItem
     {
         if ( filter == null )
         {
-            throw new IllegalArgumentException( "filter" );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_07000_FILTER ) );
         }
 
         this.filter = filter;
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/SyncModifyDnType.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/SyncModifyDnType.java
index d89d917..62bf4c9 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/SyncModifyDnType.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/SyncModifyDnType.java
@@ -20,6 +20,7 @@
 
 package org.apache.directory.api.ldap.extras.controls;
 
+import org.apache.directory.api.i18n.I18n;
 
 /**
  * The type of MODDN modification. One of MOVE, RENAME or MOVE_AND_RENAME
@@ -78,7 +79,7 @@ public enum SyncModifyDnType
                 return MOVE_AND_RENAME;
 
             default:
-                throw new IllegalArgumentException( "unknown modify dn operantion type " + value );
+                throw new IllegalArgumentException( I18n.err( I18n.ERR_9101_UNKNOWN_MODIFY_DN_OP_TYPE, value ) );
         }
     }
 }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy/PasswordPolicyErrorEnum.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy/PasswordPolicyErrorEnum.java
index 6bab93f..bbf82d9 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy/PasswordPolicyErrorEnum.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy/PasswordPolicyErrorEnum.java
@@ -20,6 +20,7 @@
 
 package org.apache.directory.api.ldap.extras.controls.ppolicy;
 
+import org.apache.directory.api.i18n.I18n;
 
 /**
  *  constants representing PasswordPolicyErrorS as stated in the <a href="http://tools.ietf.org/html/draft-behera-ldap-password-policy-10">draft</a>
@@ -103,7 +104,7 @@ public enum PasswordPolicyErrorEnum
 
             default:
 
-                throw new IllegalArgumentException( "unknown password policy error value " + val );
+                throw new IllegalArgumentException( I18n.err( I18n.ERR_9100_UNKNOWN_PASSWORD_POLICY_ERROR, val ) );
         }
     }
 
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl/syncState/SyncStateTypeEnum.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl/syncState/SyncStateTypeEnum.java
index 18d6c9e..9bbd314 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl/syncState/SyncStateTypeEnum.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl/syncState/SyncStateTypeEnum.java
@@ -110,7 +110,7 @@ public enum SyncStateTypeEnum
             return MODDN;
         }
 
-        throw new IllegalArgumentException( I18n.err( I18n.ERR_04163, value ) );
+        throw new IllegalArgumentException( I18n.err( I18n.ERR_9103_UNKNOWN_SYNC_STATE_TYPE, value ) );
     }
 
 }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv/VirtualListViewResultCode.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv/VirtualListViewResultCode.java
index 292f0c1..96bed52 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv/VirtualListViewResultCode.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv/VirtualListViewResultCode.java
@@ -20,6 +20,7 @@
 
 package org.apache.directory.api.ldap.extras.controls.vlv;
 
+import org.apache.directory.api.i18n.I18n;
 
 /**
  * Enumeration of the result codes of a Virtual List View response control as specified in draft-ietf-ldapext-ldapv3-vlv-09.
@@ -144,7 +145,7 @@ public enum VirtualListViewResultCode
                 return OTHER;
 
             default:
-                throw new IllegalArgumentException( "Unknown VLV response result code " + code );
+                throw new IllegalArgumentException( I18n.err( I18n.ERR_9102_UNKNOWN_VLV_RESPONSE, code ) );
         }
     }
 }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/storedProcedure/StoredProcedureRequestImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/storedProcedure/StoredProcedureRequestImpl.java
index b2a32b9..2238086 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/storedProcedure/StoredProcedureRequestImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/storedProcedure/StoredProcedureRequestImpl.java
@@ -236,7 +236,7 @@ public class StoredProcedureRequestImpl extends AbstractExtendedRequest implemen
     @Override
     public Class<?> getJavaParameterType( int index )
     {
-        throw new NotImplementedException( I18n.err( I18n.ERR_04175 ) );
+        throw new NotImplementedException( I18n.err( I18n.ERR_9104_CLASS_LOADING_OF_PROC_TYPE_NOT_IMPLEMENTED ) );
     }
 
 
@@ -280,8 +280,8 @@ public class StoredProcedureRequestImpl extends AbstractExtendedRequest implemen
                     }
                     catch ( IntegerDecoderException e )
                     {
-                        throw new RuntimeException( "Failed to decode INTEGER: "
-                            + Strings.dumpBytes( ( byte[] ) obj ), e );
+                        throw new RuntimeException( I18n.err( I18n.ERR_9200_INTERGER_DECODING_FAILURE,
+                            Strings.dumpBytes( ( byte[] ) obj ) ), e );
                     }
                 }
                 else
@@ -301,7 +301,7 @@ public class StoredProcedureRequestImpl extends AbstractExtendedRequest implemen
     @Override
     public Object getJavaParameterValue( int index )
     {
-        throw new NotImplementedException( I18n.err( I18n.ERR_04176 ) );
+        throw new NotImplementedException( I18n.err( I18n.ERR_9105_CONVERSION_VALUE_TO_JAVA_NOT_IMPLEMENTED ) );
     }
 
 
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl/SyncInfoValueImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl/SyncInfoValueImpl.java
index 248bd3c..d09a3bc 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl/SyncInfoValueImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl/SyncInfoValueImpl.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.message.IntermediateResponseImpl;
 import org.apache.directory.api.util.Strings;
 
@@ -336,7 +337,7 @@ public class SyncInfoValueImpl extends IntermediateResponseImpl implements SyncI
                 break;
 
             default:
-                throw new IllegalArgumentException( "Unexpected SynchronizationInfo: " + getType() );
+                throw new IllegalArgumentException( I18n.err( I18n.ERR_9300_UNEXPECTED_SYNCINFO, getType() ) );
         }
 
         return sb.toString();
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncDecorator.java
index 2b7fbd3..7228182 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncDecorator.java
@@ -216,7 +216,7 @@ public class AdDirSyncDecorator extends ControlDecorator<AdDirSync> implements A
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Encode the SEQ
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncGrammar.java
index 81e2189..1c8bcd8 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdDirSyncGrammar.java
@@ -30,6 +30,7 @@ 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.i18n.I18n;
 import org.apache.directory.api.ldap.extras.controls.ad.AdDirSyncFlag;
 import org.apache.directory.api.util.Strings;
 import org.slf4j.Logger;
@@ -119,21 +120,21 @@ public final class AdDirSyncGrammar extends AbstractGrammar<AdDirSyncContainer>
                             
                             if ( flags == null )
                             {
-                                String msg = "Error while decoding the AdDirSync flag, unknown value : " + flagValue;
+                                String msg = I18n.err( I18n.ERR_08104_AD_DIR_SYNC_FLAG_DECODING_FAILURE, flagValue );
                                 LOG.error( msg );
                                 throw new DecoderException( msg );
                             }
                             
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "flags = {}", flags.toString() );
+                                LOG.debug( I18n.msg( I18n.MSG_08101_FLAGS, flags.toString() ) );
                             }
                             
                             container.getAdDirSyncControl().setFlags( flags );
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = "Error while decoding the AdDirSync flag : " + ide.getMessage();
+                            String msg = I18n.err( I18n.ERR_08105_AD_DIR_SYNC_FLAG_DECODING_ERROR, ide.getMessage() );
                             LOG.error( msg, ide );
                             throw new DecoderException( msg, ide );
                         }
@@ -165,14 +166,14 @@ public final class AdDirSyncGrammar extends AbstractGrammar<AdDirSyncContainer>
                             
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "maxReturnLength = {}", maxReturnLength );
+                                LOG.debug( I18n.msg( I18n.MSG_08102_MAX_RETURN_LENGTH, maxReturnLength ) );
                             }
                             
                             container.getAdDirSyncControl().setMaxReturnLength( maxReturnLength );
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = "Error while decoding the AdDirSync maxReturnLength : " + ide.getMessage();
+                            String msg = I18n.err( I18n.ERR_08106_AD_DIR_SYNC_MAX_RETURN_LENGTH_DECODING_ERROR, ide.getMessage() );
                             LOG.error( msg, ide );
                             throw new DecoderException( msg, ide );
                         }
@@ -201,7 +202,7 @@ public final class AdDirSyncGrammar extends AbstractGrammar<AdDirSyncContainer>
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getAdDirSyncControl().setCookie( cookie );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdPolicyHintsDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdPolicyHintsDecorator.java
index bddf91d..992639a 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdPolicyHintsDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ad_impl/AdPolicyHintsDecorator.java
@@ -94,7 +94,7 @@ public class AdPolicyHintsDecorator extends ControlDecorator<AdPolicyHints>
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PPolicyInit.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PPolicyInit.java
index 3906a58..e258263 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PPolicyInit.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PPolicyInit.java
@@ -22,6 +22,7 @@ package org.apache.directory.api.ldap.extras.controls.ppolicy_impl;
 
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
+import org.apache.directory.api.i18n.I18n;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,7 +56,7 @@ public class PPolicyInit extends GrammarAction<PasswordPolicyContainer>
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "PasswordPolicyResponseControlContainer initialized" );
+            LOG.debug( I18n.msg( I18n.MSG_08103_PP_RESPONSE_CONTROL_CONTAINER_INITIALIZED ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PasswordPolicyDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PasswordPolicyDecorator.java
index 903ff8a..a21a38c 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PasswordPolicyDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/ppolicy_impl/PasswordPolicyDecorator.java
@@ -162,7 +162,7 @@ public class PasswordPolicyDecorator extends ControlDecorator<PasswordPolicy> im
 
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Encode the Sequence tag
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueDecorator.java
index dae0e98..a80253c 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueDecorator.java
@@ -119,7 +119,7 @@ public class SyncDoneValueDecorator extends ControlDecorator<SyncDoneValue> impl
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Encode the SEQ
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueGrammar.java
index 562ef5b..5985532 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncDoneValueGrammar.java
@@ -112,7 +112,7 @@ public final class SyncDoneValueGrammar extends AbstractGrammar<SyncDoneValueCon
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getSyncDoneValueControl().setCookie( cookie );
@@ -134,7 +134,7 @@ public final class SyncDoneValueGrammar extends AbstractGrammar<SyncDoneValueCon
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "refreshDeletes = {}", refreshDeletes );
+                            LOG.debug( I18n.msg( I18n.MSG_08001_REFRESH_DELETES, refreshDeletes ) );
                         }
 
                         container.getSyncDoneValueControl().setRefreshDeletes( refreshDeletes );
@@ -144,7 +144,7 @@ public final class SyncDoneValueGrammar extends AbstractGrammar<SyncDoneValueCon
                     }
                     catch ( BooleanDecoderException be )
                     {
-                        String msg = I18n.err( I18n.ERR_04024 );
+                        String msg = I18n.err( I18n.ERR_08001_CANNOT_DECODE_REFRESH_DELETES );
                         LOG.error( msg, be );
                         throw new DecoderException( msg, be );
                     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueDecorator.java
index e504071..b284a80 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueDecorator.java
@@ -196,7 +196,7 @@ public class SyncRequestValueDecorator extends ControlDecorator<SyncRequestValue
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Encode the SEQ
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueGrammar.java
index f62e167..1c3b5a2 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncRequestValueGrammar.java
@@ -126,7 +126,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "Mode = " + modeEnum );
+                                LOG.debug( I18n.msg( I18n.MSG_08100_MODE, modeEnum ) );
                             }
 
                             container.getSyncRequestValueControl().setMode( modeEnum );
@@ -136,7 +136,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = I18n.err( I18n.ERR_04028 );
+                            String msg = I18n.err( I18n.ERR_08100_SYNC_REQUEST_VALUE_MODE_DECODING_FAILED );
                             LOG.error( msg, ide );
                             throw new DecoderException( msg, ide );
                         }
@@ -165,7 +165,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = " + Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getSyncRequestValueControl().setCookie( cookie );
@@ -199,7 +199,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "reloadHint = " + reloadHint );
+                                LOG.debug( I18n.msg( I18n.MSG_08104_RELOAD_HINT, reloadHint ) );
                             }
 
                             container.getSyncRequestValueControl().setReloadHint( reloadHint );
@@ -209,7 +209,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
                         }
                         catch ( BooleanDecoderException bde )
                         {
-                            String msg = I18n.err( I18n.ERR_04029 );
+                            String msg = I18n.err( I18n.ERR_08101_RELOAD_HINT_DECODING_FAILED );
                             LOG.error( msg, bde );
                             throw new DecoderException( msg, bde );
                         }
@@ -240,7 +240,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "reloadHint = " + reloadHint );
+                                LOG.debug( I18n.msg( I18n.MSG_08104_RELOAD_HINT, reloadHint ) );
                             }
 
                             container.getSyncRequestValueControl().setReloadHint( reloadHint );
@@ -250,7 +250,7 @@ public final class SyncRequestValueGrammar extends AbstractGrammar<SyncRequestVa
                         }
                         catch ( BooleanDecoderException bde )
                         {
-                            String msg = I18n.err( I18n.ERR_04029 );
+                            String msg = I18n.err( I18n.ERR_08101_RELOAD_HINT_DECODING_FAILED );
                             LOG.error( msg, bde );
                             throw new DecoderException( msg, bde );
                         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueDecorator.java
index 1cbeb4d..02ccf0a 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueDecorator.java
@@ -180,7 +180,7 @@ public class SyncStateValueDecorator extends ControlDecorator<SyncStateValue> im
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         // Encode the SEQ
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueGrammar.java
index d773868..d0613d8 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/syncrepl_impl/SyncStateValueGrammar.java
@@ -119,7 +119,7 @@ public final class SyncStateValueGrammar extends AbstractGrammar<SyncStateValueC
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "SyncStateType = {}", syncStateTypeEnum );
+                            LOG.debug( I18n.msg( I18n.MSG_08105_SYNC_STATE_TYPE, syncStateTypeEnum ) );
                         }
 
                         container.getSyncStateValueControl().setSyncStateType( syncStateTypeEnum );
@@ -129,7 +129,7 @@ public final class SyncStateValueGrammar extends AbstractGrammar<SyncStateValueC
                     }
                     catch ( IntegerDecoderException ide )
                     {
-                        String msg = I18n.err( I18n.ERR_04030 );
+                        String msg = I18n.err( I18n.ERR_08102_SYNC_STATE_VALUE_MODE_DECODING_FAILED );
                         LOG.error( msg, ide );
                         throw new DecoderException( msg, ide );
                     }
@@ -158,7 +158,7 @@ public final class SyncStateValueGrammar extends AbstractGrammar<SyncStateValueC
 
                     if ( LOG.isDebugEnabled() )
                     {
-                        LOG.debug( "entryUUID = {}", Strings.dumpBytes( entryUUID ) );
+                        LOG.debug( I18n.msg( I18n.MSG_08106_ENTRY_UUID, Strings.dumpBytes( entryUUID ) ) );
                     }
 
                     container.getSyncStateValueControl().setEntryUUID( entryUUID );
@@ -190,7 +190,7 @@ public final class SyncStateValueGrammar extends AbstractGrammar<SyncStateValueC
 
                     if ( LOG.isDebugEnabled() )
                     {
-                        LOG.debug( "cookie = {}", cookie );
+                        LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                     }
 
                     container.getSyncStateValueControl().setCookie( cookie );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitByOffsetSequence.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitByOffsetSequence.java
index dad7ffa..9aaf96b 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitByOffsetSequence.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitByOffsetSequence.java
@@ -22,6 +22,7 @@ package org.apache.directory.api.ldap.extras.controls.vlv_impl;
 
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
+import org.apache.directory.api.i18n.I18n;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +53,7 @@ public class InitByOffsetSequence extends GrammarAction<VirtualListViewRequestCo
     {
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "VirtualListViewRequestContainer initialized" );
+            LOG.debug( I18n.msg( I18n.MSG_08107_VLV_REQUEST_CONTAINER_INITIALIZED ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitVirtualListViewRequest.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitVirtualListViewRequest.java
index 8fb2472..8b23a11 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitVirtualListViewRequest.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/InitVirtualListViewRequest.java
@@ -22,6 +22,7 @@ package org.apache.directory.api.ldap.extras.controls.vlv_impl;
 
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
+import org.apache.directory.api.i18n.I18n;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +53,7 @@ public class InitVirtualListViewRequest extends GrammarAction<VirtualListViewReq
     {
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "VirtualListViewRequestContainer initialized" );
+            LOG.debug( I18n.msg( I18n.MSG_08107_VLV_REQUEST_CONTAINER_INITIALIZED ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewRequestDecorator.java
index 10809a0..9c2adc7 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewRequestDecorator.java
@@ -125,7 +125,7 @@ public class VirtualListViewRequestDecorator extends ControlDecorator<VirtualLis
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewResponseDecorator.java
index a4a4bc7..10a704a 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/controls/vlv_impl/VirtualListViewResponseDecorator.java
@@ -105,7 +105,7 @@ public class VirtualListViewResponseDecorator extends ControlDecorator<VirtualLi
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         buffer.put( UniversalTag.SEQUENCE.getValue() );
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelGrammar.java
index 8bd5bd7..551f6da 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelGrammar.java
@@ -119,7 +119,7 @@ public final class CancelGrammar extends AbstractGrammar<CancelContainer>
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "CancelId = " + cancelId );
+                                LOG.debug( I18n.msg( I18n.MSG_08200_CANCEL_ID, cancelId ) );
                             }
 
                             cancelContainer.getCancel().setCancelId( cancelId );
@@ -127,7 +127,7 @@ public final class CancelGrammar extends AbstractGrammar<CancelContainer>
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = I18n.err( I18n.ERR_04031, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08200_CANCELID_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg, ide );
                         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelRequestDecorator.java
index 74d0a7f..8d26e17 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/cancel/CancelRequestDecorator.java
@@ -106,7 +106,7 @@ public class CancelRequestDecorator extends ExtendedRequestDecorator<CancelReque
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04164 ), e );
+                LOG.error( I18n.err( I18n.ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
@@ -144,7 +144,7 @@ public class CancelRequestDecorator extends ExtendedRequestDecorator<CancelReque
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationGrammar.java
index 1765937..750f549 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationGrammar.java
@@ -121,14 +121,14 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "Target Dn = " + targetDN );
+                            LOG.debug( I18n.msg( I18n.MSG_08215_TARGET_DN, targetDN ) );
                         }
 
                         if ( ( targetDN != null ) && ( targetDN.trim().length() > 0 ) )
                         {
                             if ( !Dn.isValid( targetDN ) )
                             {
-                                String msg = I18n.err( I18n.ERR_04032, targetDN );
+                                String msg = I18n.err( I18n.ERR_08201_INVALID_TARGET_DN, targetDN );
                                 LOG.error( msg );
                                 throw new DecoderException( msg );
                             }
@@ -137,7 +137,7 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
                         }
                         else
                         {
-                            String msg = I18n.err( I18n.ERR_04033, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08202_NULL_TARGET_DN_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -167,14 +167,14 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "Issuer Dn = " + issuerDN );
+                            LOG.debug( I18n.msg( I18n.MSG_08207_ISSUER_DN, issuerDN ) );
                         }
 
                         if ( ( issuerDN != null ) && ( issuerDN.trim().length() > 0 ) )
                         {
                             if ( !Dn.isValid( issuerDN ) )
                             {
-                                String msg = I18n.err( I18n.ERR_04034, issuerDN );
+                                String msg = I18n.err( I18n.ERR_08203_INVALID_ISSUER_DN, issuerDN );
                                 LOG.error( msg );
                                 throw new DecoderException( msg );
                             }
@@ -207,14 +207,14 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "subject Dn = " + subjectDN );
+                            LOG.debug( I18n.msg( I18n.MSG_08219_SUBJECT_DN, subjectDN ) );
                         }
 
                         if ( ( subjectDN != null ) && ( subjectDN.trim().length() > 0 ) )
                         {
                             if ( !Dn.isValid( subjectDN ) )
                             {
-                                String msg = I18n.err( I18n.ERR_04035, subjectDN );
+                                String msg = I18n.err( I18n.ERR_08204_INVALID_SUBJECT_DN, subjectDN );
                                 LOG.error( msg );
                                 throw new DecoderException( msg );
                             }
@@ -223,7 +223,7 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
                         }
                         else
                         {
-                            String msg = I18n.err( I18n.ERR_04033, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08202_NULL_TARGET_DN_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -253,7 +253,7 @@ public class CertGenerationGrammar extends AbstractGrammar<CertGenerationContain
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "key algorithm = " + keyAlgorithm );
+                            LOG.debug( I18n.msg( I18n.MSG_08218_KEY_ALGORITHM, keyAlgorithm ) );
                         }
 
                         if ( keyAlgorithm != null && ( keyAlgorithm.trim().length() > 0 ) )
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationRequestDecorator.java
index c6cc968..53733f9 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/certGeneration/CertGenerationRequestDecorator.java
@@ -99,7 +99,7 @@ public class CertGenerationRequestDecorator extends ExtendedRequestDecorator<Cer
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
@@ -119,7 +119,7 @@ public class CertGenerationRequestDecorator extends ExtendedRequestDecorator<Cer
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04167 ), e );
+                LOG.error( I18n.err( I18n.ERR_08218_CERT_GENERATE_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
index 5e3dc36..6a1cf59 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
@@ -140,7 +140,7 @@ public class EndTransactionRequestDecorator extends ExtendedRequestDecorator<End
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestGrammar.java
index c9cd9d7..7ba512f 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestGrammar.java
@@ -125,7 +125,7 @@ public class EndTransactionRequestGrammar extends AbstractGrammar<EndTransaction
                         catch ( BooleanDecoderException bde )
                         {
                             LOG.error( I18n
-                                .err( I18n.ERR_04490_BAD_END_TRANSACTION_COMMIT, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+                                .err( I18n.ERR_08221_BAD_END_TRANSACTION_COMMIT, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
 
                             // This will generate a PROTOCOL_ERROR
                             throw new DecoderException( bde.getMessage(), bde );
@@ -156,7 +156,7 @@ public class EndTransactionRequestGrammar extends AbstractGrammar<EndTransaction
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "Identifier = {}", Strings.dumpBytes( identifier ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08206_IDENTIFIER, Strings.dumpBytes( identifier ) ) );
                         }
 
                         if ( identifier == null )
@@ -195,7 +195,7 @@ public class EndTransactionRequestGrammar extends AbstractGrammar<EndTransaction
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "Identifier = {}", Strings.dumpBytes( identifier ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08206_IDENTIFIER, Strings.dumpBytes( identifier ) ) );
                         }
 
                         if ( identifier == null )
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
index 8f40a6c..692b6d2 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
@@ -107,7 +107,7 @@ public class EndTransactionResponseDecorator extends ExtendedResponseDecorator<E
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseGrammar.java
index 7de1d99..ecb6a32 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseGrammar.java
@@ -143,7 +143,7 @@ public class EndTransactionResponseGrammar extends AbstractGrammar<EndTransactio
                         catch ( IntegerDecoderException ide )
                         {
                             LOG.error( I18n
-                                .err( I18n.ERR_04490_BAD_END_TRANSACTION_COMMIT, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+                                .err( I18n.ERR_08221_BAD_END_TRANSACTION_COMMIT, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
 
                             // This will generate a PROTOCOL_ERROR
                             throw new DecoderException( ide.getMessage(), ide );
@@ -226,7 +226,7 @@ public class EndTransactionResponseGrammar extends AbstractGrammar<EndTransactio
                         catch ( IntegerDecoderException ide )
                         {
                             LOG.error( I18n
-                                .err( I18n.ERR_04491_BAD_END_TRANSACTION_MESSAGE_ID, Strings.dumpBytes( value.getData() ), 
+                                .err( I18n.ERR_08222_BAD_END_TRANSACTION_MESSAGE_ID, Strings.dumpBytes( value.getData() ), 
                                     ide.getMessage() ) );
 
                             // This will generate a PROTOCOL_ERROR
@@ -275,7 +275,7 @@ public class EndTransactionResponseGrammar extends AbstractGrammar<EndTransactio
                         {
                             // Add an error
                             LOG.error( I18n
-                                .err( I18n.ERR_04099_INVALID_CONTROL_LIST, Strings.dumpBytes( value.getData() ), 
+                                .err( I18n.ERR_08223_INVALID_CONTROL_LIST, Strings.dumpBytes( value.getData() ), 
                                     de.getMessage() ) );
 
                             // This will generate a PROTOCOL_ERROR
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/ControlsGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/ControlsGrammar.java
index 0b8ab50..2ebbdbe 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/ControlsGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/ControlsGrammar.java
@@ -84,7 +84,7 @@ public class ControlsGrammar extends AbstractGrammar<ControlsContainer>
                         // The Length should be null
                         if ( expectedLength == 0 )
                         {
-                            String msg = I18n.err( I18n.ERR_04096_NULL_CONTROL_LENGTH );
+                            String msg = I18n.err( I18n.ERR_08213_NULL_CONTROL_LENGTH );
                             LOG.error( msg );
 
                             // This will generate a PROTOCOL_ERROR
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/AddControl.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/AddControl.java
index aa3f76b..fbe584b 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/AddControl.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/AddControl.java
@@ -67,7 +67,7 @@ public class AddControl extends GrammarAction<ControlsContainer>
         // We have to handle the special case of a 0 length OID
         if ( tlv.getLength() == 0 )
         {
-            String msg = I18n.err( I18n.ERR_04097_NULL_CONTROL_OID );
+            String msg = I18n.err( I18n.ERR_08214_NULL_OID );
             LOG.error( msg );
 
             // This will generate a PROTOCOL_ERROR
@@ -80,7 +80,7 @@ public class AddControl extends GrammarAction<ControlsContainer>
         // The OID is encoded as a String, not an Object Id
         if ( !Oid.isOid( oidValue ) )
         {
-            String msg = I18n.err( I18n.ERR_04098_INVALID_CONTROL_OID, oidValue );
+            String msg = I18n.err( I18n.ERR_08215_INVALID_CONTROL_OID, oidValue );
             LOG.error( msg );
 
             // This will generate a PROTOCOL_ERROR
@@ -97,7 +97,7 @@ public class AddControl extends GrammarAction<ControlsContainer>
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control OID : {}", oidValue );
+            LOG.debug( I18n.msg( I18n.MSG_08201_CONTROL_OID, oidValue ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlCriticality.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlCriticality.java
index 1517c5b..c3d4026 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlCriticality.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlCriticality.java
@@ -85,7 +85,7 @@ public class StoreControlCriticality extends GrammarAction<ControlsContainer>
         catch ( BooleanDecoderException bde )
         {
             LOG.error( I18n
-                .err( I18n.ERR_04100_BAD_CONTROL_CRITICALITY, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+                .err( I18n.ERR_08103_BAD_CONTROL_CRITICALITY, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
 
             // This will generate a PROTOCOL_ERROR
             throw new DecoderException( bde.getMessage(), bde );
@@ -96,7 +96,7 @@ public class StoreControlCriticality extends GrammarAction<ControlsContainer>
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control criticality : {}", control.isCritical() );
+            LOG.debug( I18n.msg( I18n.MSG_08202_CONTROL_CRITICALITY, control.isCritical() ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlValue.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlValue.java
index 114b5db..d668dfa 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlValue.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/controls/actions/StoreControlValue.java
@@ -23,6 +23,7 @@ package org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction.co
 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
 import org.apache.directory.api.asn1.ber.tlv.BerValue;
 import org.apache.directory.api.asn1.ber.tlv.TLV;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.CodecControl;
 import org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction.controls.ControlsContainer;
 import org.apache.directory.api.util.Strings;
@@ -84,7 +85,7 @@ public class StoreControlValue extends GrammarAction<ControlsContainer>
 
         if ( LOG.isDebugEnabled() )
         {
-            LOG.debug( "Control value : {}", Strings.dumpBytes( control.getValue() ) );
+            LOG.debug( I18n.msg( I18n.MSG_08203_CONTROL_VALUE, Strings.dumpBytes( control.getValue() ) ) );
         }
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectGrammar.java
index 8050f50..3cc89d0 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectGrammar.java
@@ -83,7 +83,7 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
 
                     if ( LOG.isDebugEnabled() )
                     {
-                        LOG.debug( "Delay = " + delay );
+                        LOG.debug( I18n.msg( I18n.MSG_08204_DELAY, delay ) );
                     }
 
                     container.getGracefulDisconnectResponse().setDelay( delay );
@@ -91,7 +91,7 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
                 }
                 catch ( IntegerDecoderException ide )
                 {
-                    String msg = I18n.err( I18n.ERR_04036, Strings.dumpBytes( value.getData() ) );
+                    String msg = I18n.err( I18n.ERR_08205_CANNOT_DECODE_DELAY, Strings.dumpBytes( value.getData() ) );
                     LOG.error( msg );
                     throw new DecoderException( msg, ide );
                 }
@@ -112,7 +112,7 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
                 {
                     if ( Strings.isEmpty( value.getData() ) )
                     {
-                        String msg = "failed to decode a null URL";
+                        String msg = I18n.err( I18n.ERR_08224_NULL_URL_DECODING_FAILURE );
                         LOG.error( msg );
                         throw new DecoderException( msg );
                     }
@@ -125,12 +125,12 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
 
                     if ( LOG.isDebugEnabled() )
                     {
-                        LOG.debug( "Stores a referral : {}", ldapUrl );
+                        LOG.debug( I18n.msg( I18n.MSG_08214_STORES_A_REFERRAL, ldapUrl ) );
                     }
                 }
                 catch ( LdapURLEncodingException luee )
                 {
-                    String msg = "failed to decode the URL '" + Strings.dumpBytes( value.getData() ) + "'";
+                    String msg = I18n.err( I18n.ERR_08225_URL_DECODING_FAILURE, Strings.dumpBytes( value.getData() ) );
                     LOG.error( msg );
                     throw new DecoderException( msg, luee );
                 }
@@ -153,7 +153,7 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
 
                     if ( LOG.isDebugEnabled() )
                     {
-                        LOG.debug( "Time Offline = " + timeOffline );
+                        LOG.debug( I18n.msg( I18n.MSG_08216_TIME_OFFLINE, timeOffline ) );
                     }
 
                     container.getGracefulDisconnectResponse().setTimeOffline( timeOffline );
@@ -161,7 +161,7 @@ public final class GracefulDisconnectGrammar extends AbstractGrammar<GracefulDis
                 }
                 catch ( IntegerDecoderException ide )
                 {
-                    String msg = I18n.err( I18n.ERR_04037, Strings.dumpBytes( value.getData() ) );
+                    String msg = I18n.err( I18n.ERR_08206_TIME_OFFLINE_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
                     LOG.error( msg );
                     throw new DecoderException( msg, ide );
                 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectResponseDecorator.java
index 4b9ed69..e7064c6 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulDisconnect/GracefulDisconnectResponseDecorator.java
@@ -93,7 +93,7 @@ public class GracefulDisconnectResponseDecorator extends ExtendedResponseDecorat
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04164 ), e );
+                LOG.error( I18n.err( I18n.ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
@@ -127,7 +127,7 @@ public class GracefulDisconnectResponseDecorator extends ExtendedResponseDecorat
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04172 ), e );
+            LOG.error( I18n.err( I18n.ERR_08219_RESPONSE_DECODING_FAILED ), e );
         }
     }
 
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownGrammar.java
index bf06a30..615713c 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownGrammar.java
@@ -123,7 +123,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "Time Offline = " + timeOffline );
+                                LOG.debug( I18n.msg( I18n.MSG_08216_TIME_OFFLINE, timeOffline ) );
                             }
 
                             container.getGracefulShutdownRequest().setTimeOffline( timeOffline );
@@ -131,7 +131,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = I18n.err( I18n.ERR_04037, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08206_TIME_OFFLINE_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg, ide );
                         }
@@ -165,7 +165,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "Delay = " + delay );
+                                LOG.debug( I18n.msg( I18n.MSG_08204_DELAY, delay ) );
                             }
 
                             container.getGracefulShutdownRequest().setDelay( delay );
@@ -173,7 +173,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = I18n.err( I18n.ERR_04036, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08205_CANNOT_DECODE_DELAY, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg, ide );
                         }
@@ -209,7 +209,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "Delay = " + delay );
+                                LOG.debug( I18n.msg( I18n.MSG_08204_DELAY, delay ) );
                             }
 
                             gracefulShutdownContainer.getGracefulShutdownRequest().setDelay( delay );
@@ -217,7 +217,7 @@ public final class GracefulShutdownGrammar extends AbstractGrammar<GracefulShutd
                         }
                         catch ( IntegerDecoderException ide )
                         {
-                            String msg = I18n.err( I18n.ERR_04036, Strings.dumpBytes( value.getData() ) );
+                            String msg = I18n.err( I18n.ERR_08205_CANNOT_DECODE_DELAY, Strings.dumpBytes( value.getData() ) );
                             LOG.error( msg );
                             throw new DecoderException( msg, ide );
                         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownRequestDecorator.java
index d00b3b2..284d176 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/gracefulShutdown/GracefulShutdownRequestDecorator.java
@@ -89,7 +89,7 @@ public class GracefulShutdownRequestDecorator extends ExtendedRequestDecorator<G
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
@@ -109,7 +109,7 @@ public class GracefulShutdownRequestDecorator extends ExtendedRequestDecorator<G
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04164 ), e );
+                LOG.error( I18n.err( I18n.ERR_08216_GRACEFUL_SHUTDOWN_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestDecorator.java
index 19f9988..11bc78a 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestDecorator.java
@@ -87,7 +87,7 @@ public class PasswordModifyRequestDecorator extends ExtendedRequestDecorator<Pas
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestGrammar.java
index 3bae478..fa472fe 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyRequestGrammar.java
@@ -27,6 +27,7 @@ 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.UniversalTag;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
 import org.apache.directory.api.ldap.extras.extended.pwdModify.PasswordModifyRequestImpl;
 import org.apache.directory.api.util.Strings;
@@ -121,7 +122,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "UserIdentity = " + Strings.dumpBytes( userIdentity ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08217_USER_IDENTITY, Strings.dumpBytes( userIdentity ) ) );
                         }
 
                         if ( userIdentity == null )
@@ -161,7 +162,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "oldPassword = " + Strings.dumpBytes( oldPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08209_OLD_PASSWORD ) );
                         }
 
                         if ( oldPassword == null )
@@ -202,7 +203,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "newPassword = " + Strings.dumpBytes( newPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08208_NEW_PASSWORD ) );
                         }
 
                         if ( newPassword == null )
@@ -242,7 +243,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "OldPassword = " + Strings.dumpBytes( oldPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08209_OLD_PASSWORD ) );
                         }
 
                         if ( oldPassword == null )
@@ -282,7 +283,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "NewPassword = " + Strings.dumpBytes( newPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08208_NEW_PASSWORD ) );
                         }
 
                         if ( newPassword == null )
@@ -322,7 +323,7 @@ public class PasswordModifyRequestGrammar extends AbstractGrammar<PasswordModify
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "NewPassword = " + Strings.dumpBytes( newPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08208_NEW_PASSWORD ) );
                         }
 
                         if ( newPassword == null )
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseDecorator.java
index 866ec99..a501e35 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseDecorator.java
@@ -88,7 +88,7 @@ public class PasswordModifyResponseDecorator extends ExtendedResponseDecorator<P
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseGrammar.java
index befe46a..ddc3991 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/pwdModify/PasswordModifyResponseGrammar.java
@@ -27,6 +27,7 @@ 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.UniversalTag;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
 import org.apache.directory.api.ldap.extras.extended.pwdModify.PasswordModifyResponseImpl;
 import org.apache.directory.api.util.Strings;
@@ -119,7 +120,7 @@ public class PasswordModifyResponseGrammar extends AbstractGrammar<PasswordModif
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "GenPassword = " + Strings.dumpBytes( genPassword ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08205_GEN_PASSWORD ) );
                         }
 
                         if ( genPassword == null )
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureGrammar.java
index 2e86b49..2955ad4 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureGrammar.java
@@ -42,10 +42,7 @@ import org.slf4j.LoggerFactory;
  */
 public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedureContainer>
 {
-    //~ Static fields/initializers -----------------------------------------------------------------
-
     /** The logger */
-    //private static final Logger log = LoggerFactory.getLogger( StoredProcedureGrammar.class );
     static final Logger LOG = LoggerFactory.getLogger( StoredProcedureGrammar.class );
 
     /** The instance of grammar. StoredProcedureGrammar is a singleton. */
@@ -103,7 +100,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
                         if ( tlv.getLength() == 0 )
                         {
                             // We can't have a void language !
-                            String msg = I18n.err( I18n.ERR_04038 );
+                            String msg = I18n.err( I18n.ERR_08207_SP_LANGUAGE_NULL );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -114,7 +111,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "SP language found: " + language );
+                                LOG.debug( I18n.msg( I18n.MSG_08213_SP_LANGUAGE_FOUND, language ) );
                             }
 
                             storedProcedure.setLanguage( language );
@@ -141,7 +138,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
                         if ( tlv.getLength() == 0 )
                         {
                             // We can't have a void procedure !
-                            String msg = I18n.err( I18n.ERR_04039 );
+                            String msg = I18n.err( I18n.ERR_08208_NULL_PROCEDURE );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -154,7 +151,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
 
                         if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "Procedure found : " + storedProcedure.getProcedureSpecification() );
+                            LOG.debug( I18n.msg( I18n.MSG_08212_PROCEDURE_FOUND, storedProcedure.getProcedureSpecification() ) );
                         }
                     }
                 } );
@@ -204,7 +201,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
                         if ( tlv.getLength() == 0 )
                         {
                             // We can't have a void parameter type !
-                            String msg = I18n.err( I18n.ERR_04040 );
+                            String msg = I18n.err( I18n.ERR_08209_NULL_PARAMETER_TYPE );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -221,7 +218,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
 
                             if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "Parameter type found : " + Strings.dumpBytes( parameterType ) );
+                                LOG.debug( I18n.msg( I18n.MSG_08210_PARAMETER_TYPE_FOUND, Strings.dumpBytes( parameterType ) ) );
                             }
 
                         }
@@ -251,7 +248,7 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
                         if ( tlv.getLength() == 0 )
                         {
                             // We can't have a void parameter value !
-                            String msg = I18n.err( I18n.ERR_04041 );
+                            String msg = I18n.err( I18n.ERR_08210_NULL_PARAMETER_VALUE );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
@@ -269,12 +266,12 @@ public final class StoredProcedureGrammar extends AbstractGrammar<StoredProcedur
 
                                 if ( LOG.isDebugEnabled() )
                                 {
-                                    LOG.debug( "Parameter value found : " + Strings.dumpBytes( parameterValue ) );
+                                    LOG.debug( I18n.msg( I18n.MSG_08211_PARAMETER_VALUE_FOUND, Strings.dumpBytes( parameterValue ) ) );
                                 }
                             }
                             else
                             {
-                                String msg = I18n.err( I18n.ERR_04042 );
+                                String msg = I18n.err( I18n.ERR_08211_EMPTY_PARAMETER_VALUE );
                                 LOG.error( msg );
                                 throw new DecoderException( msg );
                             }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureRequestDecorator.java
index ea0fead..819e3d5 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/storedProcedure/StoredProcedureRequestDecorator.java
@@ -80,9 +80,10 @@ public class StoredProcedureRequestDecorator extends ExtendedRequestDecorator<St
     public StoredProcedureRequestDecorator( LdapApiService codec, StoredProcedureRequest decoratedRequest )
     {
         super( codec, decoratedRequest );
+        
         if ( decoratedRequest == null )
         {
-            throw new NullPointerException( "decorated stored procedulre request is null" );
+            throw new NullPointerException( I18n.err( I18n.ERR_08228_DECORATED_SP_NULL ) );
         }
     }
 
@@ -229,7 +230,7 @@ public class StoredProcedureRequestDecorator extends ExtendedRequestDecorator<St
         }
         catch ( BufferOverflowException boe )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
+            throw new EncoderException( I18n.err( I18n.ERR_08212_PDU_BUFFER_TOO_SMALL ), boe );
         }
 
         return bb;
@@ -300,7 +301,7 @@ public class StoredProcedureRequestDecorator extends ExtendedRequestDecorator<St
         }
         catch ( Exception e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
@@ -320,7 +321,7 @@ public class StoredProcedureRequestDecorator extends ExtendedRequestDecorator<St
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04174 ), e );
+                LOG.error( I18n.err( I18n.ERR_08220_SP_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java
index 064e6c6..27949a5 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseDecorator.java
@@ -82,7 +82,7 @@ public class WhoAmIResponseDecorator extends ExtendedResponseDecorator<WhoAmIRes
         }
         catch ( DecoderException e )
         {
-            LOG.error( I18n.err( I18n.ERR_04165_PAYLOAD_DECODING_ERROR ), e );
+            LOG.error( I18n.err( I18n.ERR_08217_PAYLOAD_DECODING_ERROR ), e );
             throw new RuntimeException( e );
         }
     }
@@ -102,7 +102,7 @@ public class WhoAmIResponseDecorator extends ExtendedResponseDecorator<WhoAmIRes
             }
             catch ( EncoderException e )
             {
-                LOG.error( I18n.err( I18n.ERR_04167 ), e );
+                LOG.error( I18n.err( I18n.ERR_08218_CERT_GENERATE_PAYLOAD_ENCODING_FAILED ), e );
                 throw new RuntimeException( e );
             }
         }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java
index c5e2681..0e9a0bb 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/whoAmI/WhoAmIResponseGrammar.java
@@ -26,6 +26,7 @@ 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.UniversalTag;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
 import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponseImpl;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
@@ -98,7 +99,7 @@ public class WhoAmIResponseGrammar extends AbstractGrammar<WhoAmIResponseContain
                                     // Error
                                 case 1:
                                     // Error
-                                    String msg = "authzId too short. Must starts with either u: or dn:";
+                                    String msg = I18n.err( I18n.ERR_08226_AUTHZID_TOO_SHORT_MISSING_U_OR_DN );
                                     LOG.error( msg );
                                     throw new DecoderException( msg );
 
@@ -110,7 +111,7 @@ public class WhoAmIResponseGrammar extends AbstractGrammar<WhoAmIResponseContain
                                     }
                                     else
                                     {
-                                        msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data );
+                                        msg = I18n.err( I18n.ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN, Strings.utf8ToString( data ) );
                                         LOG.error( msg );
                                         throw new DecoderException( msg );
                                     }
@@ -128,7 +129,7 @@ public class WhoAmIResponseGrammar extends AbstractGrammar<WhoAmIResponseContain
                                             }
                                             else
                                             {
-                                                msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data );
+                                                msg = I18n.err( I18n.ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN, Strings.utf8ToString( data ) );
                                                 LOG.error( msg );
                                                 throw new DecoderException( msg );
                                             }
@@ -154,14 +155,14 @@ public class WhoAmIResponseGrammar extends AbstractGrammar<WhoAmIResponseContain
                                                 }
                                                 else
                                                 {
-                                                    msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data );
+                                                    msg = I18n.err( I18n.ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN, Strings.utf8ToString( data ) );
                                                     LOG.error( msg );
                                                     throw new DecoderException( msg );
                                                 }
                                             }
                                             else
                                             {
-                                                msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data );
+                                                msg = I18n.err( I18n.ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN, Strings.utf8ToString( data ) );
                                                 LOG.error( msg );
                                                 throw new DecoderException( msg );
                                             }
@@ -169,7 +170,7 @@ public class WhoAmIResponseGrammar extends AbstractGrammar<WhoAmIResponseContain
                                             break;
 
                                         default :
-                                            msg = "authzId Must starts with either u: or dn:, it starts with " + Strings.utf8ToString( data );
+                                            msg = I18n.err( I18n.ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN, Strings.utf8ToString( data ) );
                                             LOG.error( msg );
                                             throw new DecoderException( msg );
                                     }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueDecorator.java
index d3796b4..c3fa94d 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueDecorator.java
@@ -342,7 +342,7 @@ public class SyncInfoValueDecorator extends IntermediateResponseDecorator<SyncIn
     {
         if ( buffer == null )
         {
-            throw new EncoderException( I18n.err( I18n.ERR_04023 ) );
+            throw new EncoderException( I18n.err( I18n.ERR_08000_CANNOT_PUT_A_PDU_IN_NULL_BUFFER ) );
         }
 
         switch ( getDecorated().getSyncInfoValueType() )
@@ -436,7 +436,7 @@ public class SyncInfoValueDecorator extends IntermediateResponseDecorator<SyncIn
                 break;
 
             default:
-                throw new IllegalArgumentException( "Unexpected SynchronizationInfo: " + getType() );
+                throw new IllegalArgumentException( I18n.err( I18n.ERR_08229_UNEXPECTED_SYNC_INFO, getType() ) );
         }
 
         return buffer;
@@ -546,7 +546,7 @@ public class SyncInfoValueDecorator extends IntermediateResponseDecorator<SyncIn
                         break;
 
                     default:
-                        throw new IllegalArgumentException( "Unexpected SynchronizationInfo: " + getType() );
+                        throw new IllegalArgumentException( I18n.err( I18n.ERR_08229_UNEXPECTED_SYNC_INFO, getType() ) );
                 }
 
                 value = buffer.array();
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueGrammar.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueGrammar.java
index c3ce17e..a740075 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueGrammar.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/intermediate/syncrepl_impl/SyncInfoValueGrammar.java
@@ -107,10 +107,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
 
                         byte[] newCookie = value.getData();
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "newcookie = {}", Strings.dumpBytes( newCookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08300_NEW_COOKIE, Strings.dumpBytes( newCookie ) ) );
                         }
 
                         syncInfoValue.setCookie( newCookie );
@@ -172,10 +171,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
 
                         byte[] cookie = value.getData();
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getSyncInfoValue().setCookie( cookie );
@@ -212,10 +210,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDone = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDone = {}", refreshDone );
+                                LOG.debug( I18n.msg( I18n.MSG_08301_REFRESH_DONE, refreshDone ) );
                             }
 
                             syncInfoValue.setRefreshDone( refreshDone );
@@ -227,7 +224,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04025 );
+                            String msg = I18n.err( I18n.ERR_08300_REFRESH_DONE_DECODING_FAILED );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -262,10 +259,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDone = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDone = {}", refreshDone );
+                                LOG.debug( I18n.msg( I18n.MSG_08301_REFRESH_DONE, refreshDone ) );
                             }
 
                             syncInfoValue.setRefreshDone( refreshDone );
@@ -277,7 +273,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04025 );
+                            String msg = I18n.err( I18n.ERR_08300_REFRESH_DONE_DECODING_FAILED );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -337,10 +333,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
 
                         byte[] cookie = value.getData();
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getSyncInfoValue().setCookie( cookie );
@@ -377,10 +372,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDone = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDone = {}", refreshDone );
+                                LOG.debug( I18n.msg( I18n.MSG_08301_REFRESH_DONE, refreshDone ) );
                             }
 
                             syncInfoValue.setRefreshDone( refreshDone );
@@ -392,7 +386,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04025 );
+                            String msg = I18n.err( I18n.ERR_08300_REFRESH_DONE_DECODING_FAILED );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -427,10 +421,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDone = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDone = {}", refreshDone );
+                                LOG.debug( I18n.msg( I18n.MSG_08301_REFRESH_DONE, refreshDone ) );
                             }
 
                             syncInfoValue.setRefreshDone( refreshDone );
@@ -442,7 +435,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04025 );
+                            String msg = I18n.err( I18n.ERR_08300_REFRESH_DONE_DECODING_FAILED );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -498,10 +491,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
 
                         byte[] cookie = value.getData();
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "cookie = {}", Strings.dumpBytes( cookie ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
                         }
 
                         container.getSyncInfoValue().setCookie( cookie );
@@ -534,10 +526,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDeletes = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDeletes = {}", refreshDeletes );
+                                LOG.debug( I18n.msg( I18n.MSG_08001_REFRESH_DELETES, refreshDeletes ) );
                             }
 
                             syncInfoValue.setRefreshDeletes( refreshDeletes );
@@ -546,7 +537,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04026 );
+                            String msg = I18n.err( I18n.ERR_08301_REFRESH_DELETES_DECODING_FAILED );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -578,10 +569,9 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         {
                             boolean refreshDeletes = BooleanDecoder.parse( value );
 
-                            if ( LOG.isDebugEnabled()
- )
+                            if ( LOG.isDebugEnabled() )
                             {
-                                LOG.debug( "refreshDeletes = {}", refreshDeletes );
+                                LOG.debug( I18n.msg( I18n.MSG_08001_REFRESH_DELETES, refreshDeletes ) );
                             }
 
                             syncInfoValue.setRefreshDeletes( refreshDeletes );
@@ -590,7 +580,7 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         }
                         catch ( BooleanDecoderException be )
                         {
-                            String msg = I18n.err( I18n.ERR_04024 );
+                            String msg = I18n.err( I18n.ERR_08001_CANNOT_DECODE_REFRESH_DELETES );
                             LOG.error( msg, be );
                             throw new DecoderException( msg, be );
                         }
@@ -691,15 +681,14 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         // UUID must be exactly 16 bytes long
                         if ( ( uuid == null ) || ( uuid.length != 16 ) )
                         {
-                            String msg = I18n.err( I18n.ERR_04027 );
+                            String msg = I18n.err( I18n.ERR_08302_BAD_UUID_VALUE_INCORRECT_LENGTH );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "UUID = {}", Strings.dumpBytes( uuid ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08302_UUID, Strings.dumpBytes( uuid ) ) );
                         }
 
                         // Store the UUID in the UUIDs list
@@ -737,15 +726,14 @@ public final class SyncInfoValueGrammar extends AbstractGrammar<SyncInfoValueCon
                         // UUID must be exactly 16 bytes long
                         if ( ( uuid == null ) || ( uuid.length != 16 ) )
                         {
-                            String msg = I18n.err( I18n.ERR_04027 );
+                            String msg = I18n.err( I18n.ERR_08302_BAD_UUID_VALUE_INCORRECT_LENGTH );
                             LOG.error( msg );
                             throw new DecoderException( msg );
                         }
 
-                        if ( LOG.isDebugEnabled()
- )
+                        if ( LOG.isDebugEnabled() )
                         {
-                            LOG.debug( "UUID = {}", Strings.dumpBytes( uuid ) );
+                            LOG.debug( I18n.msg( I18n.MSG_08302_UUID, Strings.dumpBytes( uuid ) ) );
                         }
 
                         // Store the UUID in the UUIDs list
diff --git a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/StoredProcedureLanguageSchemeOption.java b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/StoredProcedureLanguageSchemeOption.java
index bdbc1ed..bd69628 100644
--- a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/StoredProcedureLanguageSchemeOption.java
+++ b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/StoredProcedureLanguageSchemeOption.java
@@ -58,16 +58,6 @@ public class StoredProcedureLanguageSchemeOption implements StoredProcedureOptio
      * {@inheritDoc}
      */
     @Override
-    public String toString()
-    {
-        return "language " + "\"" + language + "\"";
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public int hashCode()
     {
         int h = 37;
@@ -88,15 +78,19 @@ public class StoredProcedureLanguageSchemeOption implements StoredProcedureOptio
         {
             return true;
         }
+        
         if ( obj == null )
         {
             return false;
         }
+        
         if ( getClass() != obj.getClass() )
         {
             return false;
         }
-        final StoredProcedureLanguageSchemeOption other = ( StoredProcedureLanguageSchemeOption ) obj;
+        
+        StoredProcedureLanguageSchemeOption other = ( StoredProcedureLanguageSchemeOption ) obj;
+     
         if ( language == null )
         {
             if ( other.language != null )
@@ -108,7 +102,17 @@ public class StoredProcedureLanguageSchemeOption implements StoredProcedureOptio
         {
             return false;
         }
+        
         return true;
     }
 
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString()
+    {
+        return "language " + "\"" + language + "\"";
+    }
 }
diff --git a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecification.java b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecification.java
index b335c2c..bf0928e 100644
--- a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecification.java
+++ b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecification.java
@@ -55,12 +55,12 @@ public class TriggerSpecification
         
         if ( ( ldapOperation == null ) || ( actionTime == null ) || ( spSpecs == null ) )
         {
-            throw new NullArgumentException( I18n.err( I18n.ERR_04331 ) );
+            throw new NullArgumentException( I18n.err( I18n.ERR_11000_TRIGGER_SPECIFICATION_INIT_WITH_NULL ) );
         }
         
         if ( spSpecs.isEmpty() )
         {
-            throw new IllegalArgumentException( I18n.err( I18n.ERR_04332 ) );
+            throw new IllegalArgumentException( I18n.err( I18n.ERR_11001_TRIGGER_SPECIFICATION_INIT_WITH_EPTY_SPEC_LIST ) );
         }
         
         this.ldapOperation = ldapOperation;
@@ -173,6 +173,7 @@ public class TriggerSpecification
             h = h * 17 + ( ( name == null ) ? 0 : name.hashCode() );
             h = h * 17 + ( ( options == null ) ? 0 : options.hashCode() );
             h = h * 17 + ( ( parameters == null ) ? 0 : parameters.hashCode() );
+            
             return h;
         }
 
@@ -187,15 +188,19 @@ public class TriggerSpecification
             {
                 return true;
             }
+            
             if ( obj == null )
             {
                 return false;
             }
+            
             if ( getClass() != obj.getClass() )
             {
                 return false;
             }
-            final SPSpec other = ( SPSpec ) obj;
+            
+            SPSpec other = ( SPSpec ) obj;
+            
             if ( name == null )
             {
                 if ( other.name != null )
@@ -207,6 +212,7 @@ public class TriggerSpecification
             {
                 return false;
             }
+            
             if ( options == null )
             {
                 if ( other.options != null )
@@ -218,6 +224,7 @@ public class TriggerSpecification
             {
                 return false;
             }
+            
             if ( parameters == null )
             {
                 if ( other.parameters != null )
@@ -229,9 +236,8 @@ public class TriggerSpecification
             {
                 return false;
             }
+            
             return true;
         }
-
     }
-
 }
diff --git a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecificationParser.java b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecificationParser.java
index 6f56bc4..99fa040 100644
--- a/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecificationParser.java
+++ b/ldap/extras/trigger/src/main/java/org/apache/directory/api/ldap/trigger/TriggerSpecificationParser.java
@@ -126,12 +126,14 @@ public class TriggerSpecificationParser
         }
         catch ( TokenStreamException e )
         {
-            String msg = I18n.err( I18n.ERR_04333, spec, e.getLocalizedMessage() );
+            String msg = I18n.err( I18n.ERR_11002_TRIGGER_SPECIFICATION_PARSER_FAILURE, spec, e.getLocalizedMessage() );
+            
             throw new ParseException( msg, 0 );
         }
         catch ( RecognitionException e )
         {
-            String msg = I18n.err( I18n.ERR_04333, spec, e.getLocalizedMessage() );
+            String msg = I18n.err( I18n.ERR_11002_TRIGGER_SPECIFICATION_PARSER_FAILURE, spec, e.getLocalizedMessage() );
+            
             throw new ParseException( msg, e.getColumn() );
         }
 
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 f133077..7b00e4d 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
@@ -240,7 +240,7 @@ public class LdifEntry implements Cloneable, Externalizable, Iterable<Attribute>
         if ( valueExpected )
         {
             throw new LdapInvalidAttributeValueException( ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX, I18n
-                .err( I18n.ERR_12087 ) );
+                .err( I18n.ERR_13250_VALUE_MISSING_AT_THE_END ) );
         }
 
         // Now, parse the Ldif and convert it to a LdifEntry
diff --git a/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/manager/impl/DefaultSchemaManager.java b/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/manager/impl/DefaultSchemaManager.java
index 6372018..9e7393a 100644
--- a/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/manager/impl/DefaultSchemaManager.java
+++ b/ldap/schema/data/src/main/java/org/apache/directory/api/ldap/schema/manager/impl/DefaultSchemaManager.java
@@ -274,7 +274,7 @@ public class DefaultSchemaManager implements SchemaManager
             else
             {
                 throw new LdapUnwillingToPerformException( ResultCodeEnum.UNWILLING_TO_PERFORM, I18n.err(
-                    I18n.ERR_11001, schemaName ) );
+                    I18n.ERR_16078_CANNOT_LOAD_UNKNOWN_SCHEMA, schemaName ) );
             }
         }
 
@@ -1965,7 +1965,7 @@ public class DefaultSchemaManager implements SchemaManager
             {
                 // We have an invalid SchemaObject, no need to go any further
                 Throwable error = new LdapUnwillingToPerformException( ResultCodeEnum.UNWILLING_TO_PERFORM, I18n.err(
-                    I18n.ERR_11007, schemaObject.getOid() ) );
+                    I18n.ERR_16079_INVALID_SCHEMA_OBJECT_CANNOT_BE_LOADED, schemaObject.getOid() ) );
                 errors.add( error );
             }
         }

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 06/06: Merge branch 'master' of https://gitbox.apache.org/repos/asf/directory-ldap-api

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit 73cdfc7cb5f29fcb81f7f262625a423079b61a95
Merge: 3bdb996 d70e6f2
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed May 16 00:30:42 2018 +0200

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


-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 02/06: Added a hand-crafted OpenLDAP schema parser, which is 40x faster than the antlr based one. It only supports AT and OC atm.

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit cefbe9ea42d9b9abd7eb5854139817a83b3c7a45
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed May 2 10:58:51 2018 +0200

    Added a hand-crafted OpenLDAP schema parser, which is 40x faster than
    the antlr based one.
    It only supports AT and OC atm.
---
 .../java/org/apache/directory/api/i18n/I18n.java   |   29 +
 .../apache/directory/api/i18n/errors.properties    |   28 +
 ldap/model/src/checkstyle/suppressions.xml         |    1 +
 .../schema/parsers/FastOpenLdapSchemaParser.java   | 2266 ++++++++++++++++++++
 ...Test.java => FastOpenLdapSchemaParserTest.java} |   31 +-
 .../schema/parsers/OpenLdapSchemaParserTest.java   |   22 +
 6 files changed, 2373 insertions(+), 4 deletions(-)

diff --git a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
index 5027889..4c541f3 100644
--- a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
+++ b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
@@ -807,6 +807,35 @@ public enum I18n
     ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST( "ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST" ),
     ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY( "ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY" ),
 
+    ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE( "ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE" ),
+    ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE( "ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE" ),
+    ERR_13782_END_OF_FILE( "ERR_13782_END_OF_FILE" ),
+    ERR_13783_SPACE_EXPECTED( "ERR_13783_SPACE_EXPECTED" ),
+    ERR_13784_BAD_OID_TWO_ZEROES( "ERR_13785_BAD_OID_CONSECUTIVE_DOTS" ),
+    ERR_13785_BAD_OID_CONSECUTIVE_DOTS( "" ),
+    ERR_13786_BAD_OID_DOT_AT_THE_END( "ERR_13786_BAD_OID_DOT_AT_THE_END" ),
+    ERR_13787_OID_EXPECTED( "ERR_13787_OID_EXPECTED" ),
+    ERR_13788_LEAD_KEY_CHAR_EXPECTED( "ERR_13788_LEAD_KEY_CHAR_EXPECTED" ),
+    ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START( "ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START" ),
+    ERR_13790_NOT_A_KEYSTRING( "ERR_13790_NOT_A_KEYSTRING" ),
+    ERR_13791_KEYCHAR_EXPECTED( "ERR_13791_KEYCHAR_EXPECTED" ),
+    ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END( "ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END" ),
+    ERR_13793_NO_CLOSING_PAREN( "ERR_13793_NO_CLOSING_PAREN" ),
+    ERR_13794_MORE_OIDS_EXPECTED( "ERR_13794_MORE_OIDS_EXPECTED" ),
+    ERR_13795_OPENED_BRACKET_NOT_CLOSED( "ERR_13795_OPENED_BRACKET_NOT_CLOSED" ),
+    ERR_13796_USAGE_EXPECTED( "ERR_13796_USAGE_EXPECTED" ),
+    ERR_13797_USAGE_UNKNOWN( "ERR_13797_USAGE_UNKNOWN" ),
+    ERR_13798_AT_DESCRIPTION_INVALID( "ERR_13798_AT_DESCRIPTION_INVALID" ),
+    ERR_13799_SYNTAX_OR_SUP_REQUIRED( "ERR_13799_SYNTAX_OR_SUP_REQUIRED" ),
+    ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION( "ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION" ),
+    ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL( "ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL" ),
+    ERR_13802_EXTENSION_SHOULD_START_WITH_X( "ERR_13802_EXTENSION_SHOULD_START_WITH_X" ),
+    ERR_13803_OC_DESCRIPTION_INVALID( "ERR_13803_OC_DESCRIPTION_INVALID" ),
+    ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID( "ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID" ),
+    ERR_13805_OBJECT_IDENTIFIER_INVALID_OID( "ERR_13805_OBJECT_IDENTIFIER_INVALID_OID" ),
+    ERR_13806_UNEXPECTED_ELEMENT_READ( "ERR_13806_UNEXPECTED_ELEMENT_READ" ),
+
+    
     // api-ldap-net-mina 14000 - 14999
 
     // api-ldap-schema-converter    15000 - 15999
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index b780933..f540e57 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -770,6 +770,34 @@ ERR_13777_COLLECTIVE_NOT_MULTI_VALUED=The Collective Attribute ({0}) cannot be s
 ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST=The Collective Attribute ({0}) cannot be added in the MUST list of the {1} ObjectClass
 ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY=The Collective Attribute ({0}) cannot be added in the MAY list of the {1} ObjectClass
 
+ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE=Can''t have a {0} twice in an AttributeTypeDescription (line {1}, col {2})
+ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE=Can''t have a {0} twice in an ObjectClassDescription (line {1}, col {2})
+ERR_13782_END_OF_FILE=End of file met (line {0}, col {1})
+ERR_13783_SPACE_EXPECTED=Space expected (line {0}, col {1})
+ERR_13784_BAD_OID_TWO_ZEROES=Bad OID, we have a number that starts with ''0'' (line {0}, col {1})
+ERR_13785_BAD_OID_CONSECUTIVE_DOTS=Bad OID, we have dots at the wrong place (line {0}, col {1})
+ERR_13786_BAD_OID_DOT_AT_THE_END=Bad OID, we can''t have a dot at the end of the OID (line {0}, col {1})
+ERR_13787_OID_EXPECTED=An oid is expected (line {0}, col {1})
+ERR_13788_LEAD_KEY_CHAR_EXPECTED=leadkeychar expected (line {0}, col {1})
+ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START=Simple quote expected for a descr (line {0}, col {1})
+ERR_13790_NOT_A_KEYSTRING=Not a keystring (line {0}, col {1})
+ERR_13791_KEYCHAR_EXPECTED=keychar expected, got {0} (line {1}, col {2})
+ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END=Simple quote expected at the end of a descr (line {0}, col {1})
+ERR_13793_NO_CLOSING_PAREN=No closing '')'' (line {0}, col {1})
+ERR_13794_MORE_OIDS_EXPECTED=more OIDs expected (line {0}, col {1})
+ERR_13795_OPENED_BRACKET_NOT_CLOSED=Opened ''{'' hasn't been closed (line {0}, col {1})
+ERR_13796_USAGE_EXPECTED=Expected an USAGE (line {0}, col {1})
+ERR_13797_USAGE_UNKNOWN=The USAGE value is unknown (line {0}, col {1})
+ERR_13798_AT_DESCRIPTION_INVALID=Error, AttributeType definition invalid (line {0}, col {1})
+ERR_13799_SYNTAX_OR_SUP_REQUIRED=One of SYNTAX or SUP is required (line {0}, col {1})
+ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION=COLLECTIVE requires USAGE userApplications (line {0}, col {1})
+ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL=NO-USER-MODIFICATION requires an operational USAGE (line {0}, col {1})
+ERR_13802_EXTENSION_SHOULD_START_WITH_X=Error, extension should start with ''X-'' (line {0}, col {1})
+ERR_13803_OC_DESCRIPTION_INVALID=Error, ObjectClass definition invalid (line {0}, col {1})
+ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID=The ObjectIdentifier does not have any OID (line {0}, col {1})
+ERR_13805_OBJECT_IDENTIFIER_INVALID_OID=The ObjectIdentifier has an invalid OID (line {0}, col {1})
+ERR_13806_UNEXPECTED_ELEMENT_READ=Unexpected element read: {0} (line {1}, col {2})
+
 # api-ldap-net-mina 14000-14999
 
 # api-ldap-schema-converter 15000-15999
diff --git a/ldap/model/src/checkstyle/suppressions.xml b/ldap/model/src/checkstyle/suppressions.xml
index e61d8b7..a638848 100644
--- a/ldap/model/src/checkstyle/suppressions.xml
+++ b/ldap/model/src/checkstyle/suppressions.xml
@@ -55,6 +55,7 @@
     <suppress files="org.apache.directory.api.ldap.model.entry.DefaultAttribute" checks="FileLength" />
     <suppress files="org.apache.directory.api.ldap.model.entry.DefaultEntry" checks="FileLength" />
     <suppress files="org.apache.directory.api.ldap.model.ldif.LdifReader" checks="FileLength" />
+    <suppress files="org.apache.directory.api.ldap.model.schema.parsers.FastOpenLdapSchemaParser" checks="FileLength" />
 
     <!-- Setter return super type, which is not recognized by Checkstyle -->
     <suppress files="org.apache.directory.api.ldap.model.message" checks="HiddenField" />
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java
new file mode 100644
index 0000000..12ae6cc
--- /dev/null
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java
@@ -0,0 +1,2266 @@
+/*
+ *  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.schema.parsers;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.directory.api.i18n.I18n;
+import org.apache.directory.api.ldap.model.exception.LdapSchemaException;
+import org.apache.directory.api.ldap.model.ldif.LdapLdifException;
+import org.apache.directory.api.ldap.model.schema.AttributeType;
+import org.apache.directory.api.ldap.model.schema.MutableAttributeType;
+import org.apache.directory.api.ldap.model.schema.MutableObjectClass;
+import org.apache.directory.api.ldap.model.schema.ObjectClass;
+import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
+import org.apache.directory.api.ldap.model.schema.SchemaObject;
+import org.apache.directory.api.ldap.model.schema.UsageEnum;
+import org.apache.directory.api.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
+import org.apache.directory.api.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A reusable wrapper for hand parser OpenLDAP schema.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class FastOpenLdapSchemaParser
+{
+    /** The LoggerFactory used by this class */
+    protected static final Logger LOG = LoggerFactory.getLogger( FastOpenLdapSchemaParser.class );
+
+    /** the monitor to use for this parser */
+    protected ParserMonitor monitor = new ParserMonitorAdapter();
+
+    /** A flag used to tell the parser if it should be strict or not */
+    private boolean isQuirksModeEnabled = false;
+
+    /** the number of the current line being parsed by the reader */
+    protected int lineNumber;
+
+    /** The list of parsed schema descriptions */
+    private List<Object> schemaDescriptions = new ArrayList<>();
+
+    /** The list of attribute type, initialized by splitParsedSchemaDescriptions() */
+    private List<MutableAttributeType> attributeTypes;
+
+    /** The list of object classes, initialized by splitParsedSchemaDescriptions()*/
+    private List<ObjectClass> objectClasses;
+
+    /** The map of object identifier macros, initialized by splitParsedSchemaDescriptions()*/
+    private Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros = new HashMap<>();
+
+    /** Flag whether object identifier macros should be resolved. */
+    private boolean isResolveObjectIdentifierMacros;
+    
+    private static final boolean QUOTED = true;
+    private static final boolean UN_QUOTED = false;
+    
+    
+    private class Extension
+    {
+        /** The extension key */
+        String key;
+        
+        /** The extension values */
+        List<String> values = new ArrayList<>();
+        
+        /**
+         * {@inheritDoc} 
+         */
+        @Override
+        public String toString()
+        {
+            StringBuilder sb = new StringBuilder();
+            
+            sb.append( key );
+            
+            if ( values.size() > 1 )
+            {
+                boolean isFirst = true;
+                sb.append( "( " );
+                
+                for ( String value : values )
+                {
+                    if ( isFirst )
+                    {
+                        isFirst = false;
+                    }
+                    else
+                    {
+                        sb.append( ' ' );
+                    }
+                    
+                    sb.append( '\'' ) .append( value ).append( '\'' );
+                }
+
+                sb.append( " )" );
+            }
+            else
+            {
+                sb.append( ' ' ).append( '\'' ) .append( values.get( 0 ) ).append( '\'' );
+            }
+            
+            return sb.toString();
+        }
+    }
+    
+    private class NoidLen
+    {
+        /** The syntax OID */
+        String noid;
+        
+        /** The syntax length */
+        long len = 0;
+        
+        /**
+         * {@inheritDoc} 
+         */
+        @Override
+        public String toString()
+        {
+            if ( len > 0 )
+            {
+                return noid + '{' + len + '}';
+            }
+            else
+            {
+                return noid;
+            }
+        }
+    }
+    
+    
+    private class PosSchema
+    {
+        /** The line number in the file */
+        int lineNumber;
+        
+        /** The position in the current line */
+        int start;
+        
+        /** The line being processed */
+        String line;
+        
+        /**
+         * {@inheritDoc} 
+         */
+        @Override
+        public String toString()
+        {
+            if ( line == null )
+            {
+                return "null";
+            }
+            else if ( line.length() < start )
+            {
+                return "EOL";
+            }
+            else
+            {
+                return line.substring( start ); 
+            }
+        }
+    }
+
+    
+    /**
+     * The list of AttributeTypeDescription elements that can be seen 
+     */
+    private enum AttributeTypeElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        SUP(8),
+        EQUALITY(16),
+        ORDERING(32),
+        SUBSTR(64),
+        SYNTAX(128),
+        SINGLE_VALUE(256),
+        COLLECTIVE(512),
+        NO_USER_MODIFICATION(1024),
+        USAGE(2048);
+        
+        private int value;
+        
+        AttributeTypeElements( int value )
+        {
+            this.value = value;
+        }
+    }
+
+    
+    /**
+     * The list of ObjectClassDescription elements that can be seen 
+     */
+    private enum ObjectClassElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        SUP(8),
+        MUST(16),
+        MAY(32),
+        ABSTRACT(64),
+        STRUCTURAL(64),
+        AUXILIARY(64);
+        
+        private int value;
+        
+        ObjectClassElements( int value )
+        {
+            this.value = value;
+        }
+    }
+
+    /**
+     * Creates a reusable instance of an OpenLdapSchemaParser.
+     *
+     * @throws IOException if the pipe cannot be formed
+     */
+    public FastOpenLdapSchemaParser() throws IOException
+    {
+        isResolveObjectIdentifierMacros = true;
+        isQuirksModeEnabled = true;
+    }
+
+
+    /**
+     * Reset the parser
+     */
+    public void clear()
+    {
+        if ( attributeTypes != null )
+        {
+            attributeTypes.clear();
+        }
+        
+        if ( objectClasses != null )
+        {
+            objectClasses.clear();
+        }
+        
+        if ( schemaDescriptions != null )
+        {
+            schemaDescriptions.clear();
+        }
+    
+        if ( objectIdentifierMacros != null )
+        {
+            objectIdentifierMacros.clear();
+        }
+    }
+
+
+    /**
+     * Gets the attribute types.
+     * 
+     * @return the attribute types
+     */
+    public List<MutableAttributeType> getAttributeTypes()
+    {
+        return attributeTypes;
+    }
+
+
+    /**
+     * Gets the object class types.
+     * 
+     * @return the object class types
+     */
+    public List<ObjectClass> getObjectClassTypes()
+    {
+        return objectClasses;
+    }
+
+
+    /**
+     * Gets the object identifier macros.
+     * 
+     * @return the object identifier macros
+     */
+    public Map<String, OpenLdapObjectIdentifierMacro> getObjectIdentifierMacros()
+    {
+        return objectIdentifierMacros;
+    }
+
+
+    /**
+     * Splits parsed schema descriptions and resolved
+     * object identifier macros.
+     * 
+     * @throws ParseException the parse exception
+     */
+    private void afterParse() throws ParseException
+    {
+        objectClasses = new ArrayList<>();
+        attributeTypes = new ArrayList<>();
+
+        // split parsed schema descriptions
+        for ( Object obj : schemaDescriptions )
+        {
+            if ( obj instanceof OpenLdapObjectIdentifierMacro )
+            {
+                OpenLdapObjectIdentifierMacro oid = ( OpenLdapObjectIdentifierMacro ) obj;
+                objectIdentifierMacros.put( oid.getName(), oid );
+            }
+            else if ( obj instanceof AttributeType )
+            {
+                MutableAttributeType attributeType = ( MutableAttributeType ) obj;
+
+                attributeTypes.add( attributeType );
+            }
+            else if ( obj instanceof ObjectClass )
+            {
+                ObjectClass objectClass = ( ObjectClass ) obj;
+
+                objectClasses.add( objectClass );
+            }
+        }
+
+        if ( isResolveObjectIdentifierMacros() )
+        {
+            // resolve object identifier macros
+            for ( OpenLdapObjectIdentifierMacro oid : objectIdentifierMacros.values() )
+            {
+                resolveObjectIdentifierMacro( oid );
+            }
+
+            // apply object identifier macros to object classes
+            for ( ObjectClass objectClass : objectClasses )
+            {
+                objectClass.setOid( getResolveOid( objectClass.getOid() ) );
+            }
+
+            // apply object identifier macros to attribute types
+            for ( MutableAttributeType attributeType : attributeTypes )
+            {
+                attributeType.setOid( getResolveOid( attributeType.getOid() ) );
+                attributeType.setSyntaxOid( getResolveOid( attributeType.getSyntaxOid() ) );
+            }
+
+        }
+    }
+
+
+    private String getResolveOid( String oid )
+    {
+        if ( oid != null && oid.indexOf( ':' ) != -1 )
+        {
+            // resolve OID
+            String[] nameAndSuffix = oid.split( ":" );
+            
+            if ( objectIdentifierMacros.containsKey( nameAndSuffix[0] ) )
+            {
+                OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( nameAndSuffix[0] );
+                
+                return macro.getResolvedOid() + "." + nameAndSuffix[1];
+            }
+        }
+        
+        return oid;
+    }
+
+
+    private void resolveObjectIdentifierMacro( OpenLdapObjectIdentifierMacro macro ) throws ParseException
+    {
+        String rawOidOrNameSuffix = macro.getRawOidOrNameSuffix();
+
+        if ( macro.isResolved() )
+        {
+            // finished
+            return;
+        }
+        else if ( rawOidOrNameSuffix.indexOf( ':' ) != -1 )
+        {
+            // resolve OID
+            String[] nameAndSuffix = rawOidOrNameSuffix.split( ":" );
+            
+            if ( objectIdentifierMacros.containsKey( nameAndSuffix[0] ) )
+            {
+                OpenLdapObjectIdentifierMacro parentMacro = objectIdentifierMacros.get( nameAndSuffix[0] );
+                resolveObjectIdentifierMacro( parentMacro );
+                macro.setResolvedOid( parentMacro.getResolvedOid() + "." + nameAndSuffix[1] );
+            }
+            else
+            {
+                throw new ParseException( I18n.err( I18n.ERR_13726_NO_OBJECT_IDENTIFIER_MACRO, nameAndSuffix[0] ), 0 );
+            }
+
+        }
+        else
+        {
+            // no :suffix,
+            if ( objectIdentifierMacros.containsKey( rawOidOrNameSuffix ) )
+            {
+                OpenLdapObjectIdentifierMacro parentMacro = objectIdentifierMacros.get( rawOidOrNameSuffix );
+                resolveObjectIdentifierMacro( parentMacro );
+                macro.setResolvedOid( parentMacro.getResolvedOid() );
+            }
+            else
+            {
+                macro.setResolvedOid( rawOidOrNameSuffix );
+            }
+        }
+    }
+
+
+    /**
+     * Parses an OpenLDAP schemaObject element/object.
+     *
+     * @param schemaObject the String image of a complete schema object
+     * @return the schema object
+     * @throws ParseException If the schemaObject can't be parsed
+     */
+    public SchemaObject parse( String schemaObject ) throws ParseException
+    {
+        if ( ( schemaObject == null ) || Strings.isEmpty( schemaObject.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( schemaObject ) ) )
+        {
+            parse( reader );
+            afterParse();
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+
+        if ( !schemaDescriptions.isEmpty() )
+        {
+            for ( Object obj : schemaDescriptions )
+            {
+                if ( obj instanceof SchemaObject )
+                {
+                    return ( SchemaObject ) obj;
+                }
+            }
+        }
+        
+        return null;
+    }
+
+
+    /**
+     * Parses a stream of OpenLDAP schemaObject elements/objects. Default charset is used.
+     *
+     * @param schemaIn a stream of schema objects
+     * @throws Exception 
+     */
+    public void parse( InputStream schemaIn ) throws Exception
+    {
+        try ( InputStreamReader in = new InputStreamReader( schemaIn, Charset.defaultCharset() ) )
+        {
+            try ( Reader reader = new BufferedReader( in ) )
+            {
+                parse( reader );
+                afterParse();
+            }
+        }
+    }
+    
+    
+    private void skipWhites( Reader reader, PosSchema pos, boolean mandatory ) throws IOException, LdapSchemaException
+    {
+        boolean hasSpace = false;
+        
+        while ( true )
+        {
+            if ( isEmpty( pos ) )
+            {
+                getLine( reader, pos );
+                
+                if ( pos.line == null )
+                {
+                    return;
+                }
+                
+                hasSpace = true;
+                continue;
+            }
+            
+            if ( pos.line == null )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13782_END_OF_FILE, pos.lineNumber, pos.start ) );
+            }
+            
+            while ( Character.isWhitespace( pos.line.charAt( pos.start ) ) )
+            {
+                hasSpace = true;
+                pos.start++;
+                
+                if ( isEmpty( pos ) )
+                {
+                    getLine( reader, pos );
+
+                    if ( pos.line == null )
+                    {
+                        return;
+                    }
+                    
+                    continue;
+                }
+            }
+            
+            if ( pos.line.charAt( pos.start ) == '#' )
+            {
+                getLine( reader, pos );
+
+                if ( pos.line == null )
+                {
+                    return;
+                }
+                
+                hasSpace = true;
+                continue;
+            }
+            else
+            {
+                if ( mandatory && !hasSpace )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13783_SPACE_EXPECTED, pos.lineNumber, pos.start ) );
+                }
+                else
+                {
+                    return;
+                }
+            }
+        }
+    }
+    
+    
+    private boolean isComment( PosSchema pos )
+    {
+        if ( isEmpty( pos ) )
+        {
+            return true;
+        }
+        
+        return pos.line.charAt( pos.start ) == '#';
+    }
+    
+    
+    private boolean isEmpty( PosSchema pos )
+    {
+        return ( pos.line == null ) || ( pos.start >= pos.line.length() );
+    }
+    
+    
+    private boolean startsWith( PosSchema pos, String text )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < text.length() ) )
+        {
+            return false;
+        }
+        
+        return text.equalsIgnoreCase( pos.line.substring( pos.start, pos.start + text.length() ) );
+    }
+    
+    
+    private boolean startsWith( Reader reader, PosSchema pos, char c ) throws IOException, LdapSchemaException
+    {
+        return startsWith( reader, pos, c, UN_QUOTED );
+    }
+    
+    
+    private boolean startsWith( Reader reader, PosSchema pos, char c, boolean quoted ) throws IOException, LdapSchemaException
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return false;
+        }
+        
+        if ( quoted )
+        {
+            // Don't read a new line when we are within quotes
+            return pos.line.charAt( pos.start ) == c;
+        }
+
+        while ( isEmpty( pos ) || ( isComment( pos ) ) )
+        {
+            getLine( reader, pos );
+            
+            if ( pos.line == null )
+            {
+                return false;
+            }
+            
+            skipWhites( reader, pos, false );
+            
+            if ( isComment( pos ) )
+            {
+                continue;
+            }
+        }
+        
+        return pos.line.charAt( pos.start ) == c;
+    }
+    
+    
+    private boolean isAlpha( PosSchema pos )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return false;
+        }
+        
+        return Character.isAlphabetic( pos.line.charAt( pos.start ) );
+    }
+    
+    
+    private boolean isDigit( PosSchema pos )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return false;
+        }
+        
+        return Character.isDigit( pos.line.charAt( pos.start ) );
+    }
+
+    
+    private void getLine( Reader reader, PosSchema pos ) throws IOException
+    {
+        pos.line = ( ( BufferedReader ) reader ).readLine();
+        pos.start = 0;
+        
+        if ( pos.line != null )
+        {
+            pos.lineNumber++;
+        }
+    }
+    
+    
+    /**
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     */
+    private String getNumericOid( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        boolean isDot = true;
+        int start = pos.start;
+        int numberStart = start;
+        boolean firstIsZero = false;
+        boolean isFirstDigit = true;
+        
+        while ( true )
+        {
+            if ( isDigit( pos ) )
+            {
+                if ( firstIsZero )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13784_BAD_OID_TWO_ZEROES, pos.lineNumber, pos.start ) );
+                }
+                    
+                if ( ( pos.line.charAt( pos.start ) == '0' ) && isFirstDigit )
+                {
+                    firstIsZero = true;
+                }
+                
+                isDot = false;
+                pos.start++;
+                isFirstDigit = false;
+            }
+            else if ( startsWith( reader, pos, '.' ) )
+            {
+                if ( isDot )
+                {
+                    // We can't have two consecutive dots or a dot at the beginning
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13785_BAD_OID_CONSECUTIVE_DOTS, pos.lineNumber, pos.start ) );
+                }
+                
+                firstIsZero = false;
+                isFirstDigit = true;
+                pos.start++;
+                isDot = true;
+            }
+            else
+            {
+                break;
+            }
+        }
+        
+        if ( isDot )
+        {
+            // We can't have two consecutive dots or a dot at the beginning
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13786_BAD_OID_DOT_AT_THE_END, pos.lineNumber, pos.start ) );
+        }
+        
+        return pos.line.substring( start, pos.start );
+    }
+
+    
+    /**
+     * In normal mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= keystring
+     * keystring    ::= leadkeychar keychar*
+     * leadkeychar  ::= ALPHA
+     * keychar      ::= ALPHA | DIGIT | HYPHEN
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * </pre>
+     * 
+     * In quirks mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= descrQ (COLON numericoid)
+     * descrQ       ::= keystringQ
+     * keystringQ   ::= LkeycharQ keycharQ*
+     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre>
+     */
+    private String getOidAndMacro( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        if ( isAlpha( pos ) )
+        {
+            // A descr (likely)
+            if ( isQuirksModeEnabled )
+            {
+                // This is a OID name
+                int start = pos.start;
+                char c = pos.line.charAt( pos.start );
+                
+                while ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
+                    || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) )
+                {
+                    pos.start++;
+                    
+                    if ( isEmpty( pos ) )
+                    {
+                        break;
+                    }
+                }
+                
+                String oidName = pos.line.substring( start, pos.start  );
+                
+                // We may have a ':' followed by an OID
+                if ( startsWith( reader, pos, ':' ) )
+                {
+                    pos.start++;
+                    
+                    String oid = getNumericOid( reader, pos );
+                    
+                    return objectIdentifierMacros.get( oidName ).getRawOidOrNameSuffix() + '.' + oid;
+                }
+                else
+                {
+                    // Ok, we may just have an oidName
+                    OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( oidName );
+                    
+                    if ( macro == null )
+                    {
+                        return oidName;
+                    }
+                    else
+                    {
+                        return macro.getRawOidOrNameSuffix();
+                    }
+                }
+            }
+            else
+            {
+                // A simple descr
+                return getDescr( reader, pos );
+            }
+        }
+        else if ( isDigit( pos ) )
+        {
+            // This is a numeric oid
+            return getNumericOid( reader, pos );
+        }
+        else
+        {
+            // This is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+    }
+
+    
+    /**
+     * In normal mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= keystring
+     * keystring    ::= leadkeychar keychar*
+     * leadkeychar  ::= ALPHA
+     * keychar      ::= ALPHA | DIGIT | HYPHEN
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * </pre>
+     * 
+     * In quirks mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= descrQ (COLON numericoid)
+     * descrQ       ::= keystringQ
+     * keystringQ   ::= LkeycharQ keycharQ*
+     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre>
+     */
+    private String getOid( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        if ( isAlpha( pos ) )
+        {
+            // A descr (likely)
+            if ( isQuirksModeEnabled )
+            {
+                // This is a OID name
+                int start = pos.start;
+                char c = pos.line.charAt( pos.start );
+                
+                while ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' )
+                    || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
+                {
+                    pos.start++;
+                    
+                    if ( isEmpty( pos ) )
+                    {
+                        break;
+                    }
+                    
+                    c = pos.line.charAt( pos.start );
+                }
+                
+                return pos.line.substring( start, pos.start  );
+            }
+            else
+            {
+                // A simple descr
+                return getDescr( reader, pos );
+            }
+        }
+        else if ( isDigit( pos ) )
+        {
+            // This is a numeric oid
+            return getNumericOid( reader, pos );
+        }
+        else
+        {
+            // This is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * In normal mode :
+     * 
+     * <pre>
+     * descr        ::= keystring
+     * keystring    ::= leadkeychar keychar*
+     * leadkeychar  ::= ALPHA
+     * keychar      ::= ALPHA | DIGIT | HYPHEN
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * </pre>
+     * 
+     * In quirksMode :
+     * 
+     * <pre>
+     * descr        ::= descrQ (COLON numericoid)
+     * descrQ       ::= keystringQ
+     * keystringQ   ::= LkeycharQ keycharQ*
+     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre
+     * @throws IOException 
+     */
+    private String getDescr( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        if ( isQuirksModeEnabled )
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
+                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) ) 
+                    {
+                        // leadkeycharQ
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' )
+                        || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) ) 
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+            
+            return pos.line.substring( start, pos.start );
+        }
+        else
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    if ( isAlpha( pos ) ) 
+                    {
+                        // leadkeychar
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+
+            return pos.line.substring( start, pos.start );
+        }
+    }
+    
+    
+    private String getMacro( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        if ( isQuirksModeEnabled )
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' ) 
+                        || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) ) 
+                    {
+                        // leadkeycharQ
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) 
+                        || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) ) 
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+            
+            return pos.line.substring( start, pos.start );
+        }
+        else
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    if ( isAlpha( pos ) ) 
+                    {
+                        // leadkeychar
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+
+            return pos.line.substring( start, pos.start );
+        }
+    }
+
+    
+    
+    /**
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE
+     * descr ::= keystring
+     * keystring ::= leadkeychar *keychar
+     * leadkeychar ::= ALPHA
+     * keychar ::= ALPHA | DIGIT | HYPHEN
+     * </pre>
+     * 
+     * In quirksMode :
+     * 
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE | descr | SQUOTE numericoid SQUOTE
+     * descr ::= keystring
+     * keystring ::= keychar+
+     * keychar ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * </pre>
+     * @throws IOException 
+     */
+    private String getQDescr( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        if ( isQuirksModeEnabled )
+        {
+            if ( startsWith( reader, pos, '\'' ) )
+            {
+                pos.start++;
+                int start = pos.start;
+                
+                while ( !startsWith( reader, pos, '\'' ) )
+                {
+                    if ( isEmpty( pos ) )
+                    {
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                    
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
+                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
+                    {
+                        pos.start++;
+                    }
+                    else if ( c != '\'' )
+                    {
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13790_NOT_A_KEYSTRING, pos.lineNumber, pos.start ) );
+                    }
+                }
+                
+                pos.start++;
+                
+                return pos.line.substring( start, pos.start - 1 );
+            }
+            else
+            {
+                int start = pos.start;
+                while ( !isEmpty( pos ) )
+                {
+                    char c = pos.line.charAt( pos.start );
+
+                    if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
+                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+
+                return pos.line.substring( start, pos.start );
+            }
+        }
+        else
+        {
+            // The first quote
+            if ( !startsWith( reader, pos, '\'' ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !startsWith( reader, pos, '\'' ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    if ( isAlpha( pos ) ) 
+                    {
+                        // leadkeychar
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // This is an error
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13791_KEYCHAR_EXPECTED, c, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+            }
+            
+            if ( startsWith( reader, pos, '\'' ) )
+            {
+                // We are done, move one char forward to eliminate the simple quote
+                pos.start++;
+                
+                return pos.line.substring( start, pos.start - 1 );
+            }
+            else
+            {
+                // No closing simple quote, this is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+    }
+    
+    
+    /**
+     * <pre>
+     * qdstring ::== SQUOTE dstring SQUOTE
+     * dstring  ::= ( QS | QQ | QUTF8 )+            ; escaped UTF-8 string
+     * QS       ::= ESC %x35 ( %x43 | %x63 )        ; "\5C" | "\5c", escape char
+     * QQ       ::= ESC %x32 %x37                   ; "\27", simple quote char
+     * QUTF8    ::= QUTF1 | UTFMB
+     * QUTF1    ::= %x00-26 | %x28-5B | %x5D-7F     ; All ascii but ' and \
+     * UTFMB    ::= UTF2 | UTF3 | UTF4
+     * UTF0     ::= %x80-BF
+     * UTF2     ::= %xC2-DF UTF0
+     * UTF3     ::= %xE0 %xA0-BF UTF0 | %xE1-EC UTF0 UTF0 | %xED %x80-9F UTF0 | %xEE-EF UTF0 UTF0
+     * UTF4     ::= %xF0 %x90-BF UTF0 UTF0 | %xF1-F3 UTF0 UTF0 UTF0 | %xF4 %x80-8F UTF0 UTF0
+     * ESC      ::= %x5C                            ; backslash ("\")
+     * </pre>
+     */
+    private String getQDString( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        // The first quote
+        if ( !startsWith( reader, pos, '\'' ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        pos.start++;
+        int start = pos.start;
+        
+        while ( !startsWith( reader, pos, '\'', QUOTED ) )
+        {
+            // At the moment, just swallow anything
+            pos.start++;
+        }
+        
+        if ( startsWith( reader, pos, '\'' ) )
+        {
+            // We are done, move one char forward to eliminate the simple quote
+            pos.start++;
+            
+            return pos.line.substring( start, pos.start - 1 );
+        }
+        else
+        {
+            // No closing simple quote, this is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+
+
+    /**
+     * qdescrs ::= qdescr | LPAREN WSP qdescrlist WSP RPAREN
+     * qdescrlist ::= [ qdescr *( SP qdescr ) ]
+     * qdescr ::== SQUOTE descr SQUOTE
+     * descr ::= keystring
+     * keystring ::= leadkeychar *keychar
+     * leadkeychar ::= ALPHA
+     * keychar ::= ALPHA / DIGIT / HYPHEN
+     * @throws LdapSchemaException 
+     * @throws IOException 
+     */
+    private List<String> getQDescrs( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<String> qdescrs = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, '(' ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            
+            while ( !startsWith( reader, pos, ')' ) )
+            {
+                qdescrs.add( getQDescr( reader, pos ) );
+                
+                if ( startsWith( reader, pos, ')' ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, true );
+            }
+            
+            if ( !startsWith( reader, pos, ')' ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            qdescrs.add( getQDescr( reader, pos ) );
+        }
+        
+        return qdescrs;
+    }
+
+
+    /**
+     * <pre>
+     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
+     * qdstringlist ::= qdstring *( SP qdstring )*
+     * qdstring     ::= SQUOTE dstring SQUOTE
+     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
+     * </pre>
+     * @throws LdapSchemaException 
+     * @throws IOException 
+     */
+    private List<String> getQDStrings( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<String> qdStrings = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, '(' ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            
+            while ( !startsWith( reader, pos, ')' ) )
+            {
+                qdStrings.add( getQDString( reader, pos ) );
+                
+                if ( startsWith( reader, pos, ')' ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, true );
+            }
+            
+            if ( !startsWith( reader, pos, ')' ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            qdStrings.add( getQDString( reader, pos ) );
+        }
+        
+        return qdStrings;
+    }
+
+    
+
+    
+    /**
+     * <pre>
+     * oids     ::= oid | ( LPAREN WSP oidlist WSP RPAREN )
+     * oidlist  ::= oid *( WSP DOLLAR WSP oid )
+     * </pre>
+     */
+    private List<String> getOids( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<String> oids = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, '(' ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            boolean moreExpected = false;
+            
+            while ( !startsWith( reader, pos, ')' ) )
+            {
+                moreExpected = false;
+                
+                oids.add( getOid( reader, pos ) );
+                
+                if ( startsWith( reader, pos, ')' ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, false );
+                
+                if ( startsWith( reader, pos, '$' ) )
+                {
+                    pos.start++;
+                    moreExpected = true;
+                }
+
+                skipWhites( reader, pos, false );
+            }
+            
+            if ( !startsWith( reader, pos, ')' ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( moreExpected )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13794_MORE_OIDS_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            oids.add( getOid( reader, pos ) );
+        }
+        
+        return oids;
+    }
+
+    
+    /**
+     * noidlen = numericoid [ LCURLY len RCURLY ]
+     */
+    private NoidLen getNoidLen( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        // Get the numericOid
+        String numericOid = getNumericOid( reader, pos );
+        NoidLen noidLen = new NoidLen();
+        noidLen.noid = numericOid;
+
+        // Then the len, if any
+        if ( startsWith( reader, pos, '{' ) )
+        {
+            pos.start++;
+            int start = pos.start;
+            
+            while ( isDigit( pos ) )
+            {
+                pos.start++;
+            }
+            
+            if ( startsWith( reader, pos, '}' ) )
+            {
+                String lenStr = pos.line.substring( start, pos.start );
+                
+                pos.start++;
+                
+                if ( Strings.isEmpty( lenStr ) )
+                {
+                    noidLen.len = -1;
+                }
+                else
+                {
+                    noidLen.len = Integer.parseInt( lenStr );
+                }
+            }
+            else
+            {
+                // The opening curly hasn't been closed
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13795_OPENED_BRACKET_NOT_CLOSED, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+
+        return noidLen;
+    }
+    
+    
+    private UsageEnum getUsage( Reader reader, PosSchema pos ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        if ( startsWith( pos, "userApplications" ) )
+        { 
+            return UsageEnum.USER_APPLICATIONS;
+        }
+        else if ( startsWith( pos, "directoryOperation" ) )
+        { 
+            return UsageEnum.DIRECTORY_OPERATION;
+        } 
+        else if ( startsWith( pos, "distributedOperation" ) )
+        { 
+            return UsageEnum.DISTRIBUTED_OPERATION;
+        } 
+        else if ( startsWith( pos, "dSAOperation" ) )
+        { 
+            return UsageEnum.DSA_OPERATION;
+        } 
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13797_USAGE_UNKNOWN, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+
+    
+    /**
+     * Production for matching attribute type descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * AttributeTypeDescription = LPAREN WSP
+     *     numericoid                    ; object identifier
+     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
+     *     [ SP "DESC" SP qdstring ]     ; description
+     *     [ SP "OBSOLETE" ]             ; not active
+     *     [ SP "SUP" SP oid ]           ; supertype
+     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
+     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
+     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
+     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
+     *     [ SP "SINGLE-VALUE" ]         ; single-value
+     *     [ SP "COLLECTIVE" ]           ; collective
+     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
+     *     [ SP "USAGE" SP usage ]       ; usage
+     *     extensions WSP RPAREN         ; extensions
+     * 
+     * usage = "userApplications"     /  ; user
+     *         "directoryOperation"   /  ; directory operational
+     *         "distributedOperation" /  ; DSA-shared operational
+     *         "dSAOperation"            ; DSA-specific operational     
+     * 
+     * extensions = *( SP xstring SP qdstrings )
+     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
+     * </pre>
+     * @throws IOException 
+     * @throws LdapSchemaException 
+     */
+    private MutableAttributeType parseAttributeType( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != '(' )
+        {
+            return null;
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacro( reader, pos );
+        
+        MutableAttributeType attributeType = new MutableAttributeType( oid );
+        boolean hasSup = false;
+        boolean hasSyntax = false;
+        int elementsSeen = 0;
+        
+        while ( !startsWith( reader, pos, ')' ) )
+        {
+            skipWhites( reader, pos, true );
+
+            if ( startsWith( pos, "NAME" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.NAME, pos );
+                
+                pos.start += "NAME".length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setNames( getQDescrs( reader, pos ) );
+            }
+            else if ( startsWith( pos, "DESC" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.DESC, pos );
+
+                pos.start += "DESC".length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, "OBSOLETE" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.OBSOLETE, pos );
+                
+                pos.start += "OBSOLETE".length();
+                
+                attributeType.setObsolete( true );
+            }
+            else if ( startsWith( pos, "SUP" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.SUP, pos );
+                
+                pos.start += "SUP".length();
+                
+                skipWhites( reader, pos, true );
+                
+                String superiorOid = getOid( reader, pos );
+
+                attributeType.setSuperiorOid( superiorOid );
+                hasSup = true;
+            }
+            else if ( startsWith( pos, "EQUALITY" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.EQUALITY, pos );
+                
+                pos.start += "EQUALITY".length();
+                
+                skipWhites( reader, pos, true );
+                
+                String equalityOid = getOid( reader, pos );
+
+                attributeType.setEqualityOid( equalityOid );
+            }
+            else if ( startsWith( pos, "ORDERING" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.ORDERING, pos );
+                
+                pos.start += "ORDERING".length();
+                
+                skipWhites( reader, pos, true );
+                
+                String orderingOid = getOid( reader, pos );
+
+                attributeType.setOrderingOid( orderingOid );
+            }
+            else if ( startsWith( pos, "SUBSTR" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.SUBSTR, pos );
+
+                pos.start += "SUBSTR".length();
+                
+                skipWhites( reader, pos, true );
+                
+                String substrOid = getOid( reader, pos );
+
+                attributeType.setSubstringOid( substrOid );
+            }
+            else if ( startsWith( pos, "SYNTAX" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.SYNTAX, pos );
+                
+                pos.start += "SYNTAX".length();
+                
+                skipWhites( reader, pos, true );
+                
+                NoidLen noidLen = getNoidLen( reader, pos );
+
+                attributeType.setSyntaxOid( noidLen.noid );
+                attributeType.setSyntaxLength( noidLen.len );
+                hasSyntax = true;
+            }
+            else if ( startsWith( pos, "SINGLE-VALUE" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.SINGLE_VALUE, pos );
+                
+                pos.start += "SINGLE-VALUE".length();
+                
+                attributeType.setSingleValued( true );
+            }
+            else if ( startsWith( pos, "COLLECTIVE" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.COLLECTIVE, pos );
+                
+                pos.start += "COLLECTIVE".length();
+                
+                attributeType.setCollective( true );
+            }
+            else if ( startsWith( pos, "NO-USER-MODIFICATION\"" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.NO_USER_MODIFICATION, pos );
+                
+                pos.start += "NO-USER-MODIFICATION\"".length();
+                
+                attributeType.setUserModifiable( false );
+            }
+            else if ( startsWith( pos, "USAGE" ) )
+            {
+                elementsSeen = check( elementsSeen, AttributeTypeElements.USAGE, pos );
+                
+                pos.start += "USAGE".length();
+                
+                skipWhites( reader, pos, true );
+                
+                UsageEnum usage = getUsage( reader, pos );
+
+                attributeType.setUsage( usage );
+            }
+            else if ( startsWith( pos, "X-" ) )
+            {
+                Extension extension = getExtension( reader, pos );
+                attributeType.addExtension( extension.key, extension.values );
+            }
+            else if ( startsWith( reader, pos, ')' ) )
+            {
+                pos.start++;
+                
+                return attributeType;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        if ( startsWith( reader, pos, ')' ) )
+        {
+            pos.start++;
+            
+            // Semantic checks
+            if ( !isQuirksModeEnabled )
+            {
+                if ( !hasSup && !hasSyntax )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13799_SYNTAX_OR_SUP_REQUIRED, 
+                        pos.lineNumber, pos.start ) );
+                }
+
+                if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION, 
+                        pos.lineNumber, pos.start ) );
+                }
+            
+                // NO-USER-MODIFICATION requires an operational USAGE.
+                if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL, 
+                        pos.lineNumber, pos.start ) );
+                }
+            }
+            
+            return attributeType;
+        }
+        
+        throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
+            pos.lineNumber, pos.start ) );
+    }
+    
+    
+    private int check( int elementsSeen, AttributeTypeElements element, PosSchema pos ) throws LdapSchemaException
+    {
+        if ( ( elementsSeen & element.value ) != 0 )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE, element, pos.lineNumber, pos.start ) );
+        }
+        
+        elementsSeen |= element.value;
+        
+        return elementsSeen;
+    }
+    
+    
+    /**
+     * <pre>
+     * extension    ::= xstring SP qdstrings
+     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
+     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
+     * qdstringlist ::= qdstring *( SP qdstring )*
+     * qdstring     ::= SQUOTE dstring SQUOTE
+     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
+     * </pre>
+     * @throws IOException 
+     * @throws LdapSchemaException 
+     */
+    private Extension getExtension( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        Extension extension = new Extension();
+        
+        // The xstring first
+        extension.key = getXString( reader, pos );
+        
+        skipWhites( reader, pos, true );
+        
+        extension.values = getQDStrings( reader, pos );
+        
+        return extension;
+    }
+    
+    
+    /**
+     * <pre>
+     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
+     * </pre>
+     */
+    private String getXString( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        int start = pos.start;
+        
+        if ( startsWith( pos, "X-" ) )
+        {
+            pos.start += 2;
+            
+            // Now parse the remaining string
+            while ( isAlpha( pos ) || startsWith( reader, pos, '-' ) || startsWith( reader, pos, '_' ) )
+            {
+                pos.start++;
+            }
+            
+            return pos.line.substring( start, pos.start );
+        }
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13802_EXTENSION_SHOULD_START_WITH_X, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * Production for matching ObjectClass descriptions. It is fault-tolerant
+     * against element ordering.
+     * <pre>
+     * ObjectClassDescription = LPAREN WSP
+     *   numericoid                 ; object identifier
+     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *   [ SP "DESC" SP qdstring ]  ; description
+     *   [ SP "OBSOLETE" ]          ; not active
+     *   [ SP "SUP" SP oids ]       ; superior object classes
+     *   [ SP kind ]                ; kind of class
+     *   [ SP "MUST" SP oids ]      ; attribute types
+     *   [ SP "MAY" SP oids ]       ; attribute types
+     *   extensions WSP RPAREN
+     *
+     *   kind = "ABSTRACT" / "STRUCTURAL" / "AUXILIARY"
+     * </pre>
+     */
+    private MutableObjectClass parseObjectClass( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != '(' )
+        {
+            return null;
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the numeric OID
+        String oid = getOid( reader, pos );
+        
+        MutableObjectClass objectClass = new MutableObjectClass( oid );
+        int elementsSeen = 0;
+        
+        while ( !startsWith( reader, pos, ')' ) )
+        {
+            skipWhites( reader, pos, true );
+
+            if ( startsWith( pos, "NAME" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.NAME, pos );
+
+                pos.start += "NAME".length();
+                
+                skipWhites( reader, pos, true );
+
+                List<String> names = getQDescrs( reader, pos );
+                objectClass.setNames( names );
+            }
+            else if ( startsWith( pos, "DESC" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.DESC, pos );
+                
+                pos.start += "DESC".length();
+                
+                skipWhites( reader, pos, true );
+
+                objectClass.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, "OBSOLETE" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.OBSOLETE, pos );
+                
+                pos.start += "OBSOLETE".length();
+                
+                objectClass.setObsolete( true );
+            }
+            else if ( startsWith( pos, "SUP" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.SUP, pos );
+                
+                pos.start += "SUP".length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> superiorOids = getOids( reader, pos );
+
+                objectClass.setSuperiorOids( superiorOids );
+            }
+            else if ( startsWith( pos, "ABSTRACT" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.ABSTRACT, pos );
+                
+                pos.start += "ABSTRACT".length();
+                
+                objectClass.setType( ObjectClassTypeEnum.ABSTRACT );
+            }
+            else if ( startsWith( pos, "STRUCTURAL" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.STRUCTURAL, pos );
+                
+                pos.start += "STRUCTURAL".length();
+                
+                objectClass.setType( ObjectClassTypeEnum.STRUCTURAL );
+            }
+            else if ( startsWith( pos, "AUXILIARY" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.AUXILIARY, pos );
+                
+                pos.start += "AUXILIARY".length();
+                
+                objectClass.setType( ObjectClassTypeEnum.AUXILIARY );
+            }
+            else if ( startsWith( pos, "MUST" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.MUST, pos );
+                
+                pos.start += "MUST".length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> mustAttributeTypes = getOids( reader, pos );
+                objectClass.setMustAttributeTypeOids( mustAttributeTypes );
+            }
+            else if ( startsWith( pos, "MAY" ) )
+            {
+                elementsSeen = check( elementsSeen, ObjectClassElements.MAY, pos );
+                
+                pos.start += "MAY".length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> mayAttributeTypes = getOids( reader, pos );
+                objectClass.setMayAttributeTypeOids( mayAttributeTypes );
+            }
+            else if ( startsWith( pos, "X-" ) )
+            {
+                Extension extension = getExtension( reader, pos );
+                objectClass.addExtension( extension.key, extension.values );
+            }
+            else if ( startsWith( reader, pos, ')' ) )
+            {
+                pos.start++;
+                
+                return objectClass;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13803_OC_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return objectClass;
+    }
+    
+    
+    private int check( int elementsSeen, ObjectClassElements element, PosSchema pos ) throws LdapSchemaException
+    {
+        if ( ( elementsSeen & element.value ) != 0 )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE, element, pos.lineNumber, pos.start ) );
+        }
+        
+        elementsSeen |= element.value;
+        
+        return elementsSeen;
+    }
+
+    
+    /**
+     * Process OpenLDAP macros, like : objectidentifier DUAConfSchemaOID 1.3.6.1.4.1.11.1.3.1.
+     * 
+     * <pre>
+     * objectidentifier ::= 'objectidentifier' descr SP+ macroOid
+     * descr             ::= ALPHA ( ALPHA | DIGIT | HYPHEN )*
+     * macroOid         ::= (descr ':')? oid
+     * </pre>
+     */
+    private void processObjectIdentifier( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the name
+        String name = getDescr( reader, pos );
+        
+        OpenLdapObjectIdentifierMacro macro = new OpenLdapObjectIdentifierMacro();
+        
+        skipWhites( reader, pos, true );
+
+        if ( isEmpty( pos ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        // Get the descr, if any
+        if ( isAlpha( pos ) )
+        {
+            // A macro
+            String descr = getMacro( reader, pos );
+            
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( startsWith( reader, pos, ':' ) )
+            {
+                pos.start++;
+                
+                // Now, the OID
+                String numericOid = getNumericOid( reader, pos );
+                String realOid = objectIdentifierMacros.get( descr ).getRawOidOrNameSuffix() + '.' + numericOid;
+                macro.setName( name );
+                macro.setRawOidOrNameSuffix( realOid );
+                
+                objectIdentifierMacros.put( name, macro );
+                
+                return;
+            }
+        }
+        else if ( isDigit( pos ) )
+        {
+            // An oid
+            String numericOid = getNumericOid( reader, pos );
+            macro.setRawOidOrNameSuffix( numericOid );
+            macro.setName( name );
+            
+            objectIdentifierMacros.put( name, macro );
+            
+            return;
+        }
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13805_OBJECT_IDENTIFIER_INVALID_OID, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * Reads an entry in a ldif buffer, and returns the resulting lines, without
+     * comments, and unfolded.
+     *
+     * The lines represent *one* entry.
+     *
+     * @throws LdapLdifException If something went wrong
+     */
+    private void parse( Reader reader ) throws LdapSchemaException, IOException
+    {
+        PosSchema pos = new PosSchema();
+
+        while ( true )
+        {
+            // Always move forward to the next element, skipping whites, NL and comments
+            skipWhites( reader, pos, false );
+            
+            if ( pos.line == null )
+            {
+                // The end, get out
+                break;
+            }
+            
+            // Ok, we have something which must be one of openLdapObjectIdentifier( "objectidentifier" ), 
+            // openLdapAttributeType ( "attributetype" )  or openLdapObjectClass ( "objectclass" )
+            if ( startsWith( pos, "objectidentifier" ) )
+            {
+                pos.start += "objectidentifier".length();
+                
+                processObjectIdentifier( reader, pos );
+            }
+            else if ( startsWith( pos, "attributetype" ) )
+            {
+                pos.start += "attributetype".length();
+                
+                MutableAttributeType attributeType = parseAttributeType( reader, pos );
+                schemaDescriptions.add( attributeType );
+            }
+            else if ( startsWith( pos, "objectclass" ) )
+            {
+                pos.start += "objectclass".length();
+                
+                MutableObjectClass objectClass = parseObjectClass( reader, pos );
+                schemaDescriptions.add( objectClass );
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13806_UNEXPECTED_ELEMENT_READ, 
+                    pos.line.substring( pos.start ), pos.lineNumber, pos.start ) );
+            }
+        }
+    }
+
+
+    /**
+     * Parses a file of OpenLDAP schemaObject elements/objects. Default charset is used.
+     *
+     * @param schemaFile a file of schema objects
+     * @throws IOException If the schemaObject can't be transformed to a byteArrayInputStream
+     * @throws ParseException If the schemaObject can't be parsed
+     */
+    public void parse( File schemaFile ) throws ParseException
+    {
+        try ( InputStream is = Files.newInputStream( Paths.get( schemaFile.getPath() ) ) )
+        {
+            try ( Reader reader = new BufferedReader( new InputStreamReader( is, Charset.defaultCharset() ) ) )
+            {
+                parse( reader );
+                afterParse();
+            }
+            catch ( LdapSchemaException | IOException e )
+            {
+                throw new ParseException( e.getMessage(), 0 );
+            }
+        }
+        catch ( IOException e )
+        {
+            String msg = I18n.err( I18n.ERR_13443_CANNOT_FIND_FILE, schemaFile.getAbsoluteFile() );
+            LOG.error( msg );
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+
+    /**
+     * Checks if object identifier macros should be resolved.
+     * 
+     * @return true, object identifier macros should be resolved.
+     */
+    public boolean isResolveObjectIdentifierMacros()
+    {
+        return isResolveObjectIdentifierMacros;
+    }
+
+
+    /**
+     * Sets if object identifier macros should be resolved.
+     * 
+     * @param resolveObjectIdentifierMacros true if object identifier macros should be resolved
+     */
+    public void setResolveObjectIdentifierMacros( boolean resolveObjectIdentifierMacros )
+    {
+        this.isResolveObjectIdentifierMacros = resolveObjectIdentifierMacros;
+    }
+
+    /**
+     * Checks if quirks mode is enabled.
+     * 
+     * @return true, if is quirks mode is enabled
+     */
+    public boolean isQuirksMode()
+    {
+        return isQuirksModeEnabled;
+    }
+
+
+    /**
+     * Sets the quirks mode. 
+     * 
+     * If enabled the parser accepts non-numeric OIDs and some 
+     * special characters in descriptions.
+     * 
+     * @param enabled the new quirks mode
+     */
+    public void setQuirksMode( boolean enabled )
+    {
+        isQuirksModeEnabled = enabled;
+    }
+}
\ No newline at end of file
diff --git a/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParserTest.java
similarity index 95%
copy from ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java
copy to ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParserTest.java
index 0dcfbfb..303b9b1 100644
--- a/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java
+++ b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParserTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.List;
@@ -51,16 +52,16 @@ import com.mycila.junit.concurrent.ConcurrentJunitRunner;
  */
 @RunWith(ConcurrentJunitRunner.class)
 @Concurrency()
-public class OpenLdapSchemaParserTest
+public class FastOpenLdapSchemaParserTest
 {
-    private OpenLdapSchemaParser parser;
+    private FastOpenLdapSchemaParser parser;
 
 
     @Before
     public void setUp() throws Exception
     {
-        parser = new OpenLdapSchemaParser();
-        parser.setParserMonitor( new ConsoleParserMonitor() );
+        parser = new FastOpenLdapSchemaParser();
+        // parser.setParserMonitor( new ConsoleParserMonitor() );
     }
 
 
@@ -329,6 +330,7 @@ public class OpenLdapSchemaParserTest
     public void testParseOpenLdapCoreSchema() throws Exception
     {
         InputStream input = getClass().getResourceAsStream( "core.schema" );
+        parser.setQuirksMode( true );
         parser.parse( input );
 
         List<MutableAttributeType> attributeTypes = parser.getAttributeTypes();
@@ -456,4 +458,25 @@ public class OpenLdapSchemaParserTest
         assertEquals( "1.3.6.1.4.1.1466.115.121.1.15", attributeType.getSyntaxOid() );
         assertTrue( attributeType.isSingleValued() );
     }
+
+
+    @Test
+    public void testFastLdifParsePerf() throws Exception
+    {
+        FastOpenLdapSchemaParser parser = new FastOpenLdapSchemaParser();
+        parser.setQuirksMode( true );
+        long t0 = System.currentTimeMillis();
+
+        for ( int i = 0; i < 1_000; i++ )
+        {
+            try ( InputStream input = getClass().getResourceAsStream( "core.schema" ) )
+            {
+                parser.parse( input );
+                parser.clear();
+            }
+        }
+        long t1 = System.currentTimeMillis();
+        
+        System.out.println( t1 - t0 );
+    }
 }
diff --git a/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java
index 0dcfbfb..91eff91 100644
--- a/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java
+++ b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParserTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.List;
@@ -456,4 +457,25 @@ public class OpenLdapSchemaParserTest
         assertEquals( "1.3.6.1.4.1.1466.115.121.1.15", attributeType.getSyntaxOid() );
         assertTrue( attributeType.isSingleValued() );
     }
+
+
+    @Test
+    public void testLdifParsePerf() throws Exception
+    {
+        OpenLdapSchemaParser parser = new OpenLdapSchemaParser();
+        parser.setQuirksMode( true );
+        long t0 = System.currentTimeMillis();
+
+        for ( int i = 0; i < 1_000; i++ )
+        {
+            try ( InputStream input = getClass().getResourceAsStream( "core.schema" ) )
+            {
+                parser.parse( input );
+                parser.clear();
+            }
+        }
+        long t1 = System.currentTimeMillis();
+        
+        System.out.println( t1 - t0 );
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.

[directory-ldap-api] 05/06: The Fast OpenLdapSchemaParser and all the associate changes.

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git

commit 3bdb996da6cbfb8d02ce2f743ba98c6e454f6a9b
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Wed May 16 00:27:24 2018 +0200

    The Fast OpenLdapSchemaParser and all the associate changes.
---
 .../java/org/apache/directory/api/i18n/I18n.java   |   28 +-
 .../apache/directory/api/i18n/errors.properties    |   28 +-
 .../ldap/client/api/DefaultSchemaLoader.java       |   22 +-
 .../ldap/client/api/LdapNetworkConnection.java     |    2 +-
 ldap/codec/core/res.txt                            |  530 ++
 ldap/model/src/checkstyle/suppressions.xml         |    2 +-
 ldap/model/src/main/antlr/distinguishedName.g      |   12 -
 ldap/model/src/main/antlr/schema-extension.g       |  119 -
 ldap/model/src/main/antlr/schema-qdstring.g        |  162 -
 ldap/model/src/main/antlr/schema-value.g           |  442 --
 ldap/model/src/main/antlr/schema.g                 | 1085 ----
 .../model/schema/parsers/AbstractSchemaParser.java |  153 +-
 .../AttributeTypeDescriptionSchemaParser.java      |   21 +-
 .../model/schema/parsers/ConsoleParserMonitor.java |   72 -
 .../DitContentRuleDescriptionSchemaParser.java     |   21 +-
 .../DitStructureRuleDescriptionSchemaParser.java   |   21 +-
 .../schema/parsers/FastOpenLdapSchemaParser.java   | 2266 --------
 .../LdapComparatorDescriptionSchemaParser.java     |   21 +-
 .../parsers/LdapSyntaxDescriptionSchemaParser.java |   19 +-
 .../MatchingRuleDescriptionSchemaParser.java       |   20 +-
 .../MatchingRuleUseDescriptionSchemaParser.java    |   20 +-
 .../parsers/NameFormDescriptionSchemaParser.java   |   20 +-
 .../parsers/NormalizerDescriptionSchemaParser.java |   20 +-
 .../ObjectClassDescriptionSchemaParser.java        |   20 +-
 .../model/schema/parsers/OpenLdapSchemaParser.java | 6117 +++++++++++++++++++-
 .../ldap/model/schema/parsers/ParserMonitor.java   |   53 -
 .../model/schema/parsers/ParserMonitorAdapter.java |   55 -
 .../schema/parsers/ReusableAntlrSchemaLexer.java   |   79 -
 .../schema/parsers/ReusableAntlrSchemaParser.java  |   62 -
 .../SyntaxCheckerDescriptionSchemaParser.java      |   21 +-
 .../AttributeTypeDescriptionSyntaxChecker.java     |    2 +-
 .../DitContentRuleDescriptionSyntaxChecker.java    |    2 +-
 .../DitStructureRuleDescriptionSyntaxChecker.java  |    2 +-
 .../LdapSyntaxDescriptionSyntaxChecker.java        |    2 +-
 .../MatchingRuleDescriptionSyntaxChecker.java      |    2 +-
 .../MatchingRuleUseDescriptionSyntaxChecker.java   |    2 +-
 .../NameFormDescriptionSyntaxChecker.java          |    2 +-
 .../ObjectClassDescriptionSyntaxChecker.java       |    2 +-
 .../model/schema/SchemaObjectRendererTest.java     |    8 +-
 .../parsers/FastOpenLdapSchemaParserTest.java      |   22 +-
 .../schema/parsers/OpenLdapSchemaParserTest.java   |   18 +-
 .../AttributeTypeDescriptionSyntaxCheckerTest.java |    2 +-
 ...DitContentRuleDescriptionSyntaxCheckerTest.java |    2 +-
 ...tStructureRuleDescriptionSyntaxCheckerTest.java |    2 +-
 .../ObjectClassDescriptionSyntaxCheckerTest.java   |    2 +-
 ...uteTypeDescriptionSchemaParserRelaxedTest.java} |  466 +-
 ...buteTypeDescriptionSchemaParserStrictTest.java} |  636 +-
 .../ComparatorDescriptionSchemaParserTest.java     |   21 +-
 ...entRuleDescriptionSchemaParserRelaxedTest.java} |  156 +-
 .../DitContentRuleDescriptionSchemaParserTest.java |  228 +-
 ...ureRuleDescriptionSchemaParserRelaxedTest.java} |   97 +-
 ...tureRuleDescriptionSchemaParserStrictTest.java} |  139 +-
 .../LdapSyntaxDescriptionSchemaParserTest.java     |   19 +-
 .../MatchingRuleDescriptionSchemaParserTest.java   |  146 +-
 ...MatchingRuleUseDescriptionSchemaParserTest.java |  126 +-
 .../NameFormDescriptionSchemaParserTest.java       |  141 +-
 .../NormalizerDescriptionSchemaParserTest.java     |    4 +-
 ...ctClassDescriptionSchemaParserRelaxedTest.java} |  189 +-
 ...ectClassDescriptionSchemaParserStrictTest.java} |  295 +-
 .../syntaxes/parser/SchemaParserTestUtils.java     |  510 +-
 .../SyntaxCheckerDescriptionSchemaParserTest.java  |   14 +-
 61 files changed, 8577 insertions(+), 6195 deletions(-)

diff --git a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
index 4c541f3..bffc107 100644
--- a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
+++ b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
@@ -806,9 +806,8 @@ public enum I18n
     ERR_13777_COLLECTIVE_NOT_MULTI_VALUED( "ERR_13777_COLLECTIVE_NOT_MULTI_VALUED" ),
     ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST( "ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST" ),
     ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY( "ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY" ),
-
-    ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE( "ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE" ),
-    ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE( "ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE" ),
+    ERR_13780_SCHEMA_OBJECT_DESCRIPTION_HAS_ELEMENT_TWICE( "ERR_13780_SCHEMA_OBJECT_DESCRIPTION_HAS_ELEMENT_TWICE" ),
+    ERR_13781_MR_DESCRIPTION_INVALID( "ERR_13781_MR_DESCRIPTION_INVALID" ),
     ERR_13782_END_OF_FILE( "ERR_13782_END_OF_FILE" ),
     ERR_13783_SPACE_EXPECTED( "ERR_13783_SPACE_EXPECTED" ),
     ERR_13784_BAD_OID_TWO_ZEROES( "ERR_13785_BAD_OID_CONSECUTIVE_DOTS" ),
@@ -834,6 +833,29 @@ public enum I18n
     ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID( "ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID" ),
     ERR_13805_OBJECT_IDENTIFIER_INVALID_OID( "ERR_13805_OBJECT_IDENTIFIER_INVALID_OID" ),
     ERR_13806_UNEXPECTED_ELEMENT_READ( "ERR_13806_UNEXPECTED_ELEMENT_READ" ),
+    ERR_13807_SYN_DESCRIPTION_INVALID( "ERR_13807_SYN_DESCRIPTION_INVALID" ),
+    ERR_13808_SYNTAX_REQUIRED( "ERR_13808_SYNTAX_REQUIRED" ),
+    ERR_13809_DCR_DESCRIPTION_INVALID( "ERR_13809_DCR_DESCRIPTION_INVALID" ),
+    ERR_13810_DSR_DESCRIPTION_INVALID( "ERR_13810_DSR_DESCRIPTION_INVALID" ),
+    ERR_13811_INVALID_RULE_ID( "ERR_13811_INVALID_RULE_ID" ),
+    ERR_13812_FORM_REQUIRED( "ERR_13812_FORM_REQUIRED" ),
+    ERR_13813_MORE_RULE_IDS_EXPECTED( "ERR_13813_MORE_RULE_IDS_EXPECTED" ),
+    ERR_13814_APPLIES_REQUIRED( "ERR_13814_APPLIES_REQUIRED" ),
+    ERR_13815_MRU_DESCRIPTION_INVALID( "ERR_13815_MRU_DESCRIPTION_INVALID" ),
+    ERR_13816_NF_DESCRIPTION_INVALID( "ERR_13816_NF_DESCRIPTION_INVALID" ),
+    ERR_13817_STRUCTURAL_OBJECT_CLASS_REQUIRED( "ERR_13817_STRUCTURAL_OBJECT_CLASS_REQUIRED" ),
+    ERR_13818_MUST_REQUIRED( "ERR_13818_MUST_REQUIRED" ),
+    ERR_13819_FQCN_REQUIRED( "ERR_13819_FQCN_REQUIRED" ),
+    ERR_13820_BYTE_CODE_REQUIRED( "ERR_13820_BYTE_CODE_REQUIRED" ),
+    ERR_13821_NORM_DESCRIPTION_INVALID( "ERR_13821_NORM_DESCRIPTION_INVALID" ),
+    ERR_13822_INVALID_FQCN_BAD_IDENTIFIER_START( "ERR_13822_INVALID_FQCN_BAD_IDENTIFIER_START" ),
+    ERR_13823_INVALID_FQCN_DOUBLE_DOT( "ERR_13823_INVALID_FQCN_DOUBLE_DOT" ),
+    ERR_13824_INVALID_FQCN_BAD_IDENTIFIER( "ERR_13824_INVALID_FQCN_BAD_IDENTIFIER" ),
+    ERR_13825_COMP_DESCRIPTION_INVALID( "ERR_13825_COMP_DESCRIPTION_INVALID" ),
+    ERR_13826_SC_DESCRIPTION_INVALID( "ERR_13826_SC_DESCRIPTION_INVALID" ),
+    ERR_13827_EMPTY_SYNTAX_LEN( "ERR_13827_EMPTY_SYNTAX_LEN" ),
+    ERR_13828_MISSING_SYNTAX_OID( "ERR_13828_MISSING_SYNTAX_OID" ),
+    ERR_13829_NO_OPENING_PAREN( "ERR_13829_NO_OPENING_PAREN" ),
 
     
     // api-ldap-net-mina 14000 - 14999
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index 333f43f..f9b9001 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -769,9 +769,8 @@ ERR_13776_CANNOT_SUBTYPE_COLLECTIVE=The Collective Attribute ({0}) cannot be sub
 ERR_13777_COLLECTIVE_NOT_MULTI_VALUED=The Collective Attribute ({0}) cannot be single valued
 ERR_13778_COLLECTIVE_NOT_ALLOWED_IN_MUST=The Collective Attribute ({0}) cannot be added in the MUST list of the {1} ObjectClass
 ERR_13779_COLLECTIVE_NOT_ALLOWED_IN_MAY=The Collective Attribute ({0}) cannot be added in the MAY list of the {1} ObjectClass
-
-ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE=Can''t have a {0} twice in an AttributeTypeDescription (line {1}, col {2})
-ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE=Can''t have a {0} twice in an ObjectClassDescription (line {1}, col {2})
+ERR_13780_SCHEMA_OBJECT_DESCRIPTION_HAS_ELEMENT_TWICE=Can''t have a {0} twice in an Schema Object Description (line {1}, col {2})
+ERR_13781_MR_DESCRIPTION_INVALID=Error, MatchingRule definition invalid (line {0}, col {1})
 ERR_13782_END_OF_FILE=End of file met (line {0}, col {1})
 ERR_13783_SPACE_EXPECTED=Space expected (line {0}, col {1})
 ERR_13784_BAD_OID_TWO_ZEROES=Bad OID, we have a number that starts with ''0'' (line {0}, col {1})
@@ -797,6 +796,29 @@ ERR_13803_OC_DESCRIPTION_INVALID=Error, ObjectClass definition invalid (line {0}
 ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID=The ObjectIdentifier does not have any OID (line {0}, col {1})
 ERR_13805_OBJECT_IDENTIFIER_INVALID_OID=The ObjectIdentifier has an invalid OID (line {0}, col {1})
 ERR_13806_UNEXPECTED_ELEMENT_READ=Unexpected element read: {0} (line {1}, col {2})
+ERR_13807_SYN_DESCRIPTION_INVALID=Error, LdapSyntax definition invalid (line {0}, col {1})
+ERR_13808_SYNTAX_REQUIRED=SYNTAX is required (line {0}, col {1})
+ERR_13809_DCR_DESCRIPTION_INVALID=Error, DitContentRule definition invalid (line {0}, col {1})
+ERR_13810_DSR_DESCRIPTION_INVALID=Error, DitStructureRule definition invalid (line {0}, col {1})
+ERR_13811_INVALID_RULE_ID=Invalid or missing ruleid (line {0}, col {1})
+ERR_13812_FORM_REQUIRED=FORM required (line {0}, col {1})
+ERR_13813_MORE_RULE_IDS_EXPECTED=more RULEID expected (line {0}, col {1})
+ERR_13814_APPLIES_REQUIRED=APPLIES required (line {0}, col {1})
+ERR_13815_MRU_DESCRIPTION_INVALID=Error, MatchingRuleUse definition invalid (line {0}, col {1})
+ERR_13816_NF_DESCRIPTION_INVALID=Error, NameForm definition invalid (line {0}, col {1})
+ERR_13817_STRUCTURAL_OBJECT_CLASS_REQUIRED=OC required (line {0}, col {1})
+ERR_13818_MUST_REQUIRED=MUST required (line {0}, col {1})
+ERR_13819_FQCN_REQUIRED=FQCN required (line {0}, col {1})
+ERR_13820_BYTE_CODE_REQUIRED=BYTECODE required (line {0}, col {1})
+ERR_13821_NORM_DESCRIPTION_INVALID=Error, Normalizer definition invalid (line {0}, col {1})
+ERR_13822_INVALID_FQCN_BAD_IDENTIFIER_START=The FQCN is invalid, an identifier starts with an invalid java letter (line {0}, col {1})
+ERR_13823_INVALID_FQCN_DOUBLE_DOT=The FQCN is invalid, there are two consecutive dots (line {0}, col {1})
+ERR_13824_INVALID_FQCN_BAD_IDENTIFIER=The FQCN is invalid, an identifier has a wrong java letter (line {0}, col {1})
+ERR_13825_COMP_DESCRIPTION_INVALID=Error, LdapComparator definition invalid (line {0}, col {1})
+ERR_13826_SC_DESCRIPTION_INVALID=Error, SyntaxChecker definition invalid (line {0}, col {1})
+ERR_13827_EMPTY_SYNTAX_LEN=The SYNTAX length is empty (line {0}, col {1})
+ERR_13828_MISSING_SYNTAX_OID=The SYNTAX has no OID (line {0}, col {1})
+ERR_13829_NO_OPENING_PAREN=There is a missing opening ''('' (line {0}, col {1})
 
 # api-ldap-net-mina 14000-14999
 
diff --git a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/DefaultSchemaLoader.java b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/DefaultSchemaLoader.java
index 97c6a11..07b1030 100644
--- a/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/DefaultSchemaLoader.java
+++ b/ldap/client/api/src/main/java/org/apache/directory/ldap/client/api/DefaultSchemaLoader.java
@@ -343,7 +343,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                AttributeType attributeType = AT_DESCR_SCHEMA_PARSER.parseAttributeTypeDescription( desc );
+                AttributeType attributeType = AT_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( attributeType );
             }
@@ -368,7 +368,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                LdapComparatorDescription comparator = C_DESCR_SCHEMA_PARSER.parseComparatorDescription( desc );
+                LdapComparatorDescription comparator = C_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( comparator );
             }
@@ -393,7 +393,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                DitContentRule ditContentRule = DCR_DESCR_SCHEMA_PARSER.parseDITContentRuleDescription( desc );
+                DitContentRule ditContentRule = DCR_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( ditContentRule );
             }
@@ -418,7 +418,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                DitStructureRule ditStructureRule = DSR_DESCR_SCHEMA_PARSER.parseDITStructureRuleDescription( desc );
+                DitStructureRule ditStructureRule = DSR_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( ditStructureRule );
             }
@@ -443,7 +443,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                LdapSyntax ldapSyntax = LS_DESCR_SCHEMA_PARSER.parseLdapSyntaxDescription( desc );
+                LdapSyntax ldapSyntax = LS_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( ldapSyntax );
             }
@@ -468,7 +468,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                MatchingRule matchingRule = MR_DESCR_SCHEMA_PARSER.parseMatchingRuleDescription( desc );
+                MatchingRule matchingRule = MR_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( matchingRule );
             }
@@ -493,7 +493,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                MatchingRuleUse matchingRuleUse = MRU_DESCR_SCHEMA_PARSER.parseMatchingRuleUseDescription( desc );
+                MatchingRuleUse matchingRuleUse = MRU_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( matchingRuleUse );
             }
@@ -518,7 +518,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                NameForm nameForm = NF_DESCR_SCHEMA_PARSER.parseNameFormDescription( desc );
+                NameForm nameForm = NF_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( nameForm );
             }
@@ -543,7 +543,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                NormalizerDescription normalizer = N_DESCR_SCHEMA_PARSER.parseNormalizerDescription( desc );
+                NormalizerDescription normalizer = N_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( normalizer );
             }
@@ -568,7 +568,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                ObjectClass objectClass = OC_DESCR_SCHEMA_PARSER.parseObjectClassDescription( desc );
+                ObjectClass objectClass = OC_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( objectClass );
             }
@@ -593,7 +593,7 @@ public class DefaultSchemaLoader extends AbstractSchemaLoader
 
             try
             {
-                SyntaxCheckerDescription syntaxChecker = SC_DESCR_SCHEMA_PARSER.parseSyntaxCheckerDescription( desc );
+                SyntaxCheckerDescription syntaxChecker = SC_DESCR_SCHEMA_PARSER.parse( desc );
 
                 updateSchemas( syntaxChecker );
             }
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 f9c155f..b6ca7e0 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
@@ -4313,7 +4313,7 @@ public class LdapNetworkConnection extends AbstractLdapConnection implements Lda
                 registries.getAttributeTypeRegistry().register( atType );
             }
 
-            for ( ObjectClass oc : olsp.getObjectClassTypes() )
+            for ( ObjectClass oc : olsp.getObjectClasses() )
             {
                 registries.buildReference( errors, oc );
                 registries.getObjectClassRegistry().register( oc );
diff --git a/ldap/codec/core/res.txt b/ldap/codec/core/res.txt
new file mode 100644
index 0000000..cb7bec5
--- /dev/null
+++ b/ldap/codec/core/res.txt
@@ -0,0 +1,530 @@
+Strings : 
+
+---------------------------------------------------
+
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/InitControls.java:                LOG.debug( "A new list of controls has been initialized" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/InitControls.java:                LOG.debug( "An empty list of controls has been initialized" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:                LOG.debug( "Ldap Message Id has been decoded : " + messageId );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    LOG.warn( "The Referral error message is not allowed when havind an error code no equals to REFERRAL" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                LOG.debug( "The referral error message is set to " + sb.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/InitReferrals.java:            LOG.debug( "Initialising a referrals list" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreErrorMessage.java:            LOG.debug( "The error message is : " + errorMessage );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        LOG.warn( "The matched Dn should not be set when the result code is not one of NoSuchObject,"
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                            + " AliasProblem, InvalidDNSyntax or AliasDreferencingProblem" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:            LOG.debug( "The matchedDn is " + matchedDn );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreResultCode.java:            LOG.debug( "The result code is set to " + resultCode );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:                LOG.debug( "AbandonMessage Id has been decoded : {}", Integer.valueOf( abandonnedMessageId ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            LOG.debug( "Adding type {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAttributeValue.java:                        LOG.debug( "Adding value {}", Strings.dumpBytes( ( byte[] ) value ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAttributeValue.java:                        LOG.debug( "Adding value {}" + value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:                String msg = "Invalid Dn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:            LOG.debug( "Adding an entry with Dn : {}", addRequest.getEntry() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitSaslBind.java:            LOG.debug( "The SaslCredential has been created" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreName.java:            LOG.debug( " The Bind name is {}", bindRequestMessage.getName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSaslCredentials.java:            LOG.debug( "The credentials are : {}", Strings.dumpBytes( bindRequestMessage
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSaslMechanism.java:            LOG.debug( "The mechanism is : {}", bindRequestMessage.getSaslMechanism() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSimpleAuth.java:            LOG.debug( "The simple authentication is : {}", Strings.dumpBytes( bindRequestMessage
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreVersion.java:                LOG.debug( "Ldap version ", Integer.valueOf( version ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/InitCompareRequest.java:            LOG.debug( "Compare Request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAssertionValue.java:                    LOG.debug( "Comparing attribute value {}", Strings.dumpBytes( compareRequest
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAssertionValue.java:                    LOG.debug( "Comparing attribute value {}", compareRequest.getAssertionValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAttributeDesc.java:            LOG.debug( "Comparing attribute description {}", compareRequest.getAttributeId() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:                String msg = "Invalid Dn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:            LOG.debug( "Comparing Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:            LOG.debug( "Deleting Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/InitExtendedRequest.java:            LOG.debug( "Extended request being processed ..." );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                    String msg = "The Request name is not a valid OID : "
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                        + Strings.utf8ToString( requestNameBytes ) + " ("
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                        + Strings.dumpBytes( requestNameBytes ) + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                String msg = "The Request name is not a valid OID : "
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                    + Strings.utf8ToString( requestNameBytes ) + " ("
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                    + Strings.dumpBytes( requestNameBytes ) + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                LOG.error( "{} : {}", msg, de.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:            LOG.debug( "OID read : {}", req.getRequestName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestValue.java:            LOG.debug( "Extended value : {}", extendedRequest.getRequestValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/AddModifyRequestAttribute.java:            LOG.debug( "Modifying type : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/InitAttributeVals.java:            LOG.debug( "No vals for this attribute" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/InitAttributeVals.java:            LOG.debug( "Some vals are to be decoded" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestAttributeValue.java:            LOG.debug( "Value modified : {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:                String msg = "Invalid Dn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:                    + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:            LOG.debug( "Modification of Dn {}", modifyRequest.getName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : ADD" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : DELETE" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : REPLACE" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : UNKNOWN" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/InitModifyDnRequest.java:            LOG.debug( "ModifyDn request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:                LOG.debug( " Old Rdn attributes will be deleted" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:                LOG.debug( " Old Rdn attributes will be retained" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:                String msg = "Invalid Dn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:                    + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:            LOG.debug( "Modifying Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:                String msg = "Invalid new Rdn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:                    + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:            LOG.debug( "Modifying with new Rdn {}", newRdn );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                    LOG.warn( "The new superior is null, so we will change the entry" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                String msg = "Invalid new superior Dn given : " + dnStr + " ("
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                    + Strings.dumpBytes( dnBytes ) + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:            LOG.debug( "New superior Dn {}", newSuperior );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAndFilter.java:            LOG.debug( "Initialize AND filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitApproxMatchFilter.java:            LOG.debug( "Initialize Approx Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAssertionValueFilter.java:            LOG.debug( "Initialize Assertion Value filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAttributeDescFilter.java:            LOG.debug( "Initialize AttributeDesc filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitEqualityMatchFilter.java:            LOG.debug( "Initialize Equality Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitExtensibleMatchFilter.java:            LOG.debug( "Initialize Extensible Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitGreaterOrEqualFilter.java:            LOG.debug( "Initialize Greater Or Equal filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitLessOrEqualFilter.java:            LOG.debug( "Initialize Less Or Equal filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitNotFilter.java:            LOG.debug( "Initialize NOT filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitOrFilter.java:            LOG.debug( "Initialize OR filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitPresentFilter.java:            presentFilter.setAttributeDescription( "" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitPresentFilter.java:            LOG.debug( "Initialize Present filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitSubstringsFilter.java:            LOG.debug( "Initialize Substrings filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreAny.java:            LOG.debug( "Stored a any substring : {}", any );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreFinal.java:            LOG.debug( "Stored a any substring : {}", finalValue );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchingRuleDnAttributes.java:            LOG.debug( "Dn Attributes : {}", Boolean.valueOf( extensibleMatchFilter.isDnAttributes() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchValue.java:            LOG.debug( "Stored a match value : {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/InitSearchRequest.java:            LOG.debug( "Search Request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/InitSearchRequestAttributeDescList.java:            LOG.debug( "Initialize AttributeDesc list" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestAttributeDesc.java:            LOG.debug( "Decoded Attribute Description : {}", attributeDescription );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:                String msg = "Invalid root Dn given : " + dnStr + " (" + Strings.dumpBytes( dnBytes )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:                    + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:            LOG.debug( "Searching with root Dn : {}", baseObject );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : NEVER_DEREF_ALIASES" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_IN_SEARCHING" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_FINDING_BASE_OBJ" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_ALWAYS" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : UNKNOWN" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within BASE_OBJECT scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within SINGLE_LEVEL scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within WHOLE_SUBTREE scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within UNKNOWN scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestSizeLimit.java:            LOG.debug( "The sizeLimit value is set to {} objects", Long.valueOf( sizeLimit ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTimeLimit.java:            LOG.debug( "The timeLimit value is set to {} seconds", Integer.valueOf( timeLimit ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTypesOnly.java:            LOG.debug( "The search will return {}", searchRequest.getTypesOnly() ? "only attributs type"
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTypesOnly.java:                : "attributes types and values" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreTypeMatchingRule.java:                LOG.debug( "Stored a type matching rule : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/add/InitAddResponse.java:            LOG.debug( "Add Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/bind/StoreServerSASLCreds.java:            LOG.debug( "The SASL credentials value is : {}", Strings.dumpBytes( serverSaslCreds ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/compare/InitCompareResponse.java:            LOG.debug( "Compare response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/del/InitDelResponse.java:            LOG.debug( "Del response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/InitExtendedResponse.java:            LOG.debug( "Extended Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseName.java:            LOG.debug( "OID read : {}", extendedResponse.getResponseName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseValue.java:            LOG.debug( "Extended value : {}", extendedResponse.getResponseValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/InitIntermediateResponse.java:            LOG.debug( "Intermediate Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:                String msg = "The Intermediate Response name is not a valid OID : "
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:                    + Strings.utf8ToString( responseNameBytes ) + " ("
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:                    + Strings.dumpBytes( responseNameBytes ) + ") is invalid";
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:                LOG.error( "{} : {}", msg, oidStr );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:            LOG.debug( "OID read : {}", intermediateResponse.getResponseName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseValue.java:            LOG.debug( "Value read : {}", Strings.dumpBytes( intermediateResponse.getResponseValue() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/modify/InitModifyResponse.java:            LOG.debug( "Modify response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/modifydn/InitModifyDnResponse.java:            LOG.debug( "Modify Dn response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/done/InitSearchResultDone.java:            LOG.debug( "Search Result Done found" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:                String msg = "The Attribute type " + type + "is invalid : " + ine.getMessage();
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:            LOG.debug( "Attribute type : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                searchResultEntry.addAttributeValue( "" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                    LOG.debug( "The attribute value is null" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                        LOG.debug( "Attribute value {}", Strings.dumpBytes( ( byte[] ) value ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                        LOG.debug( "Attribute value {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultEntryObjectName.java:                String msg = "The Dn " + Strings.dumpBytes( dnBytes ) + "is invalid : "
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultEntryObjectName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultEntryObjectName.java:            LOG.debug( "Search Result Entry Dn found : {}", searchResultEntry.getObjectName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/InitSearchResultReference.java:            LOG.debug( "SearchResultReference response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:            LOG.debug( "Search reference URL found : {}", url );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapApiServiceFactory.java:            String msg = "Not initialized yet!";
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapApiServiceFactory.java:            StringBuilder sb = new StringBuilder( "The LdapCodecService is already set to an instance of " );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:                LOG.debug( "Decoded LdapMessage : " + container );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java:            throw new NullPointerException( "codec argument cannot be null" );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                        LOG.debug( "changeType = " + changeType );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                LOG.debug( "previousDN = " + previousDn );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                        LOG.debug( "changeNumber = " + changeNumber );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsGrammar.java:                                LOG.debug( "size = " + size );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "changeTypes = " + changeTypes );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "changesOnly = " + changesOnly );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "returnECs = " + returnECs );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                    LOG.debug( "AttributeTypeDesc = " + atDesc );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                        LOG.debug( "ReverseOrder = " + reverseOrder );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                            LOG.debug( "MatchingRuleOid = " + matchingRuleOid );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java:                            LOG.debug( "AttributeType = " + atType );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/AddRequestDecorator.java:            throw new EncoderException( "The PDU buffer size is too small !", boe );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/SearchRequestDecorator.java:                            throw new IllegalArgumentException( "Unexpected filter type: " + filterType );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            throw new NullPointerException( "Control argument was null." );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:        throw new NotImplementedException( "Figure out how to transform" );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:        throw new NotImplementedException( "Figure out how to transform" );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:                    NamingException ne = new NamingException( "Unable to decode encoded response value: "
+src/main/java/org/apache/directory/api/ldap/codec/search/AttributeValueAssertionFilter.java:                    throw new IllegalArgumentException( "Unexpected filter type: " + filterType );
+LOGS : 
+
+---------------------------------------------------
+
+src/main/java/org/apache/directory/api/ldap/codec/actions/CheckLengthNotNull.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/AddControl.java:            LOG.debug( I18n.msg( I18n.MSG_08201_CONTROL_OID, oidValue ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/InitControls.java:                LOG.debug( "A new list of controls has been initialized" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/InitControls.java:                LOG.debug( "An empty list of controls has been initialized" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlCriticality.java:            LOG.debug( I18n.msg( I18n.MSG_08202_CONTROL_CRITICALITY, control.isCritical() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/controls/StoreControlValue.java:            LOG.debug( I18n.msg( I18n.MSG_08203_CONTROL_VALUE, Strings.dumpBytes( control.getValue() ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/InitLdapMessage.java:            LOG.error( I18n.err( I18n.ERR_04066 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04068 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:                LOG.debug( "Ldap Message Id has been decoded : " + messageId );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04070, Strings.dumpBytes( value.getData() ), ide
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    LOG.error( I18n.err( I18n.ERR_04015, badUrl, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    LOG.warn( "The Referral error message is not allowed when havind an error code no equals to REFERRAL" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                LOG.debug( "The referral error message is set to " + sb.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/InitReferrals.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/InitReferrals.java:            LOG.debug( "Initialising a referrals list" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreErrorMessage.java:            LOG.debug( "The error message is : " + errorMessage );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                    if ( LOG.isWarnEnabled() )
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        LOG.warn( "The matched Dn should not be set when the result code is not one of NoSuchObject,"
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:            LOG.debug( "The matchedDn is " + matchedDn );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreResultCode.java:            LOG.error( I18n.err( I18n.ERR_04018, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreResultCode.java:            LOG.debug( "The result code is set to " + resultCode );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:                LOG.debug( "AbandonMessage Id has been decoded : {}", Integer.valueOf( abandonnedMessageId ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            LOG.debug( "Adding type {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAttributeValue.java:                        LOG.debug( "Adding value {}", Strings.dumpBytes( ( byte[] ) value ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAttributeValue.java:                        LOG.debug( "Adding value {}" + value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/InitAddRequest.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:            LOG.debug( "Adding an entry with Dn : {}", addRequest.getEntry() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitBindRequest.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitSaslBind.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitSaslBind.java:            LOG.debug( "The SaslCredential has been created" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreName.java:            LOG.debug( " The Bind name is {}", bindRequestMessage.getName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSaslCredentials.java:            LOG.debug( "The credentials are : {}", Strings.dumpBytes( bindRequestMessage
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSaslMechanism.java:            LOG.debug( "The mechanism is : {}", bindRequestMessage.getSaslMechanism() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreSimpleAuth.java:            LOG.debug( "The simple authentication is : {}", Strings.dumpBytes( bindRequestMessage
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreVersion.java:                LOG.debug( "Ldap version ", Integer.valueOf( version ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreVersion.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/InitCompareRequest.java:            LOG.debug( "Compare Request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAssertionValue.java:                    LOG.debug( "Comparing attribute value {}", Strings.dumpBytes( compareRequest
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAssertionValue.java:                    LOG.debug( "Comparing attribute value {}", compareRequest.getAssertionValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAttributeDesc.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAttributeDesc.java:            LOG.debug( "Comparing attribute description {}", compareRequest.getAttributeId() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:            LOG.debug( "Comparing Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:                LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:            LOG.debug( "Deleting Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/InitExtendedRequest.java:            LOG.debug( "Extended request being processed ..." );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                    LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:                LOG.error( "{} : {}", msg, de.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:            LOG.debug( "OID read : {}", req.getRequestName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestValue.java:            LOG.debug( "Extended value : {}", extendedRequest.getRequestValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/AddModifyRequestAttribute.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/AddModifyRequestAttribute.java:            LOG.debug( "Modifying type : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/InitAttributeVals.java:            LOG.debug( "No vals for this attribute" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/InitAttributeVals.java:            LOG.debug( "Some vals are to be decoded" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestAttributeValue.java:            LOG.debug( "Value modified : {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreModifyRequestObjectName.java:            LOG.debug( "Modification of Dn {}", modifyRequest.getName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : ADD" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : DELETE" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : REPLACE" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:                    LOG.debug( "Modification operation : UNKNOWN" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/InitModifyDnRequest.java:            LOG.debug( "ModifyDn request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:                LOG.debug( " Old Rdn attributes will be deleted" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:                LOG.debug( " Old Rdn attributes will be retained" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:            LOG.debug( "Modifying Dn {}", entry );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:            LOG.debug( "Modifying with new Rdn {}", newRdn );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                if ( LOG.isWarnEnabled() )
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                    LOG.warn( "The new superior is null, so we will change the entry" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:            LOG.debug( "New superior Dn {}", newSuperior );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAndFilter.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAndFilter.java:            LOG.debug( "Initialize AND filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitApproxMatchFilter.java:            LOG.debug( "Initialize Approx Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAssertionValueFilter.java:            LOG.debug( "Initialize Assertion Value filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAttributeDescFilter.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAttributeDescFilter.java:            LOG.debug( "Initialize AttributeDesc filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitEqualityMatchFilter.java:            LOG.debug( "Initialize Equality Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitExtensibleMatchFilter.java:            LOG.debug( "Initialize Extensible Match filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitGreaterOrEqualFilter.java:            LOG.debug( "Initialize Greater Or Equal filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitLessOrEqualFilter.java:            LOG.debug( "Initialize Less Or Equal filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitNotFilter.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitNotFilter.java:            LOG.debug( "Initialize NOT filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitOrFilter.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitOrFilter.java:            LOG.debug( "Initialize OR filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitPresentFilter.java:            LOG.debug( "Initialize Present filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitSubstringsFilter.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitSubstringsFilter.java:            LOG.debug( "Initialize Substrings filter" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreAny.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreAny.java:            LOG.debug( "Stored a any substring : {}", any );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreFinal.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreFinal.java:            LOG.debug( "Stored a any substring : {}", finalValue );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreInitial.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchingRuleDnAttributes.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchingRuleDnAttributes.java:            LOG.debug( "Dn Attributes : {}", Boolean.valueOf( extensibleMatchFilter.isDnAttributes() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchValue.java:            LOG.debug( "Stored a match value : {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreSubstringFilterType.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/InitSearchRequest.java:            LOG.debug( "Search Request" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/InitSearchRequestAttributeDescList.java:            LOG.debug( "Initialize AttributeDesc list" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestAttributeDesc.java:            LOG.debug( "Decoded Attribute Description : {}", attributeDescription );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestBaseObject.java:            LOG.debug( "Searching with root Dn : {}", baseObject );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : NEVER_DEREF_ALIASES" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_IN_SEARCHING" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_FINDING_BASE_OBJ" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : DEREF_ALWAYS" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:                    LOG.debug( "Handling object strategy : UNKNOWN" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within BASE_OBJECT scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within SINGLE_LEVEL scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within WHOLE_SUBTREE scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:                    LOG.debug( "Searching within UNKNOWN scope " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestSizeLimit.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestSizeLimit.java:            LOG.debug( "The sizeLimit value is set to {} objects", Long.valueOf( sizeLimit ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTimeLimit.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTimeLimit.java:            LOG.debug( "The timeLimit value is set to {} seconds", Integer.valueOf( timeLimit ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTypesOnly.java:            LOG.error( I18n
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTypesOnly.java:            LOG.debug( "The search will return {}", searchRequest.getTypesOnly() ? "only attributs type"
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreTypeMatchingRule.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreTypeMatchingRule.java:                LOG.debug( "Stored a type matching rule : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/unbind/InitUnbindRequest.java:            LOG.error( I18n.err( I18n.ERR_04071, Integer.valueOf( expectedLength ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/add/InitAddResponse.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/add/InitAddResponse.java:            LOG.debug( "Add Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/bind/StoreServerSASLCreds.java:            LOG.debug( "The SASL credentials value is : {}", Strings.dumpBytes( serverSaslCreds ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/compare/InitCompareResponse.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/compare/InitCompareResponse.java:            LOG.debug( "Compare response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/del/InitDelResponse.java:            LOG.debug( "Del response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/InitExtendedResponse.java:            LOG.debug( "Extended Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseName.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseName.java:            LOG.debug( "OID read : {}", extendedResponse.getResponseName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseValue.java:            LOG.debug( "Extended value : {}", extendedResponse.getResponseValue() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/InitIntermediateResponse.java:            LOG.debug( "Intermediate Response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:                LOG.error( "{} : {}", msg, oidStr );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:            LOG.debug( "OID read : {}", intermediateResponse.getResponseName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseValue.java:            LOG.debug( "Value read : {}", Strings.dumpBytes( intermediateResponse.getResponseValue() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/modify/InitModifyResponse.java:            LOG.debug( "Modify response" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/modifydn/InitModifyDnResponse.java:            LOG.debug( "Modify Dn response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/done/InitSearchResultDone.java:            LOG.debug( "Search Result Done found" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:            LOG.debug( "Attribute type : {}", type );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                    LOG.debug( "The attribute value is null" );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                        LOG.debug( "Attribute value {}", Strings.dumpBytes( ( byte[] ) value ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultAttributeValue.java:                        LOG.debug( "Attribute value {}", value );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultEntryObjectName.java:                LOG.error( "{} : {}", msg, ine.getMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/StoreSearchResultEntryObjectName.java:            LOG.debug( "Search Result Entry Dn found : {}", searchResultEntry.getObjectName() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/InitSearchResultReference.java:            LOG.debug( "SearchResultReference response " );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:                LOG.error( I18n.err( I18n.ERR_04021, urlStr, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:            LOG.debug( "Search reference URL found : {}", url );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapApiServiceFactory.java:            LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapApiServiceFactory.java:            LOG.error( sb.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapApiServiceFactory.java:                LOG.error( "Failed to instantiate a viable instance, instantiating new instance of ", e );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            LOG.error( message );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:                LOG.debug( "Decoded LdapMessage : " + container );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            LOG.error( I18n.err( I18n.ERR_04062 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                        LOG.debug( "changeType = " + changeType );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                    LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            LOG.error( msg, ide );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04045 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                LOG.error( I18n.err( I18n.ERR_04047, Strings.dumpBytes( value.getData() ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                LOG.debug( "previousDN = " + previousDn );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                        LOG.debug( "changeNumber = " + changeNumber );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                    LOG.error( msg, lde );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsGrammar.java:                                LOG.debug( "size = " + size );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsGrammar.java:                            LOG.error( msg, ide );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "changeTypes = " + changeTypes );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            LOG.error( msg, ide );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "changesOnly = " + changesOnly );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            LOG.error( msg, bde );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                                LOG.debug( "returnECs = " + returnECs );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            LOG.error( msg, bde );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04054, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                    LOG.debug( "AttributeTypeDesc = " + atDesc );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                        LOG.debug( "ReverseOrder = " + reverseOrder );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                    //LOG.error( msg, e );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                            LOG.debug( "MatchingRuleOid = " + matchingRuleOid );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortResponseGrammar.java:                            LOG.debug( "AttributeType = " + atType );
+src/main/java/org/apache/directory/api/ldap/codec/LdapMessageGrammar.java:                        LOG.error( msg );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, cascadeFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, entryChangeFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, manageDsaItFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, proxiedAuthzFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, pageResultsFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, persistentSearchFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, subentriesFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortRequestFactory.getOid() ) );
+src/main/java/org/apache/directory/api/ldap/codec/osgi/DefaultLdapCodecService.java:            LOG.info( I18n.msg( I18n.MSG_06000_REGISTERED_CONTROL_FACTORY, sortResponseFactory.getOid() ) );
+I18n.err : 
+
+---------------------------------------------------
+
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/InitLdapMessage.java:            LOG.error( I18n.err( I18n.ERR_04066 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/InitLdapMessage.java:            throw new DecoderException( I18n.err( I18n.ERR_04067 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04068 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            throw new DecoderException( I18n.err( I18n.ERR_04069 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04070, Strings.dumpBytes( value.getData() ), ide
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    LOG.error( I18n.err( I18n.ERR_04015, badUrl, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    throw new DecoderException( I18n.err( I18n.ERR_04016, luee.getMessage() ), luee );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/InitReferrals.java:            String msg = I18n.err( I18n.ERR_04011 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        String msg = I18n.err( I18n.ERR_04013, dnStr, Strings.dumpBytes( dnBytes ), ine
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        throw new DecoderException( I18n.err( I18n.ERR_04014, ine.getLocalizedMessage() ), ine );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreResultCode.java:            LOG.error( I18n.err( I18n.ERR_04018, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:            String msg = I18n.err( I18n.ERR_04075 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            String msg = I18n.err( I18n.ERR_04086 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            String msg = I18n.err( I18n.ERR_04087 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/InitAddRequest.java:            String msg = I18n.err( I18n.ERR_04084 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:            String msg = I18n.err( I18n.ERR_04085 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitBindRequest.java:            String msg = I18n.err( I18n.ERR_04077 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitSaslBind.java:            String msg = I18n.err( I18n.ERR_04079 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAttributeDesc.java:            String msg = I18n.err( I18n.ERR_04093 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:            throw new DecoderException( I18n.err( I18n.ERR_04089 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:            throw new DecoderException( I18n.err( I18n.ERR_04073 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:                String msg = I18n.err( I18n.ERR_04074, dnStr, Strings.dumpBytes( dnBytes ), ine
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:            String msg = I18n.err( I18n.ERR_04095 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/AddModifyRequestAttribute.java:            String msg = I18n.err( I18n.ERR_04083 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:            String msg = I18n.err( I18n.ERR_04082, Strings.dumpBytes( tlv.getValue().getData() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:            throw new DecoderException( I18n.err( I18n.ERR_04089 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:            String msg = I18n.err( I18n.ERR_04090 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                throw new DecoderException( I18n.err( I18n.ERR_04092 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAndFilter.java:            String msg = I18n.err( I18n.ERR_04006 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAttributeDescFilter.java:            String msg = I18n.err( I18n.ERR_04007 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitNotFilter.java:            String msg = I18n.err( I18n.ERR_04009 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitOrFilter.java:            String msg = I18n.err( I18n.ERR_04010 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitSubstringsFilter.java:            String msg = I18n.err( I18n.ERR_04012 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreAny.java:            String msg = I18n.err( I18n.ERR_04019 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreFinal.java:            String msg = I18n.err( I18n.ERR_04020 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreInitial.java:            String msg = I18n.err( I18n.ERR_04108 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreSubstringFilterType.java:            String msg = I18n.err( I18n.ERR_04106 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:            String msg = I18n.err( I18n.ERR_04102, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:            String msg = I18n.err( I18n.ERR_04101, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestSizeLimit.java:            String msg = I18n.err( I18n.ERR_04103, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTimeLimit.java:            String msg = I18n.err( I18n.ERR_04104, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreTypeMatchingRule.java:            String msg = I18n.err( I18n.ERR_04022 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/unbind/InitUnbindRequest.java:            LOG.error( I18n.err( I18n.ERR_04071, Integer.valueOf( expectedLength ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/unbind/InitUnbindRequest.java:            throw new DecoderException( I18n.err( I18n.ERR_04072 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/add/InitAddResponse.java:            String msg = I18n.err( I18n.ERR_04088 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/compare/InitCompareResponse.java:            String msg = I18n.err( I18n.ERR_04094 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseName.java:            String msg = I18n.err( I18n.ERR_04017 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:            String msg = I18n.err( I18n.ERR_04095 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:            String msg = I18n.err( I18n.ERR_04081 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:                LOG.error( I18n.err( I18n.ERR_04021, urlStr, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:                throw new DecoderException( I18n.err( I18n.ERR_04016, luee.getMessage() ), luee );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            String message = I18n.err( I18n.ERR_04060, e.getLocalizedMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            LOG.error( I18n.err( I18n.ERR_04062 ) );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            throw new DecoderException( I18n.err( I18n.ERR_04063 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                    String msg = I18n.err( I18n.ERR_04044 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            String msg = I18n.err( I18n.ERR_04044 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04045 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            throw new DecoderException( I18n.err( I18n.ERR_04046 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                LOG.error( I18n.err( I18n.ERR_04047, Strings.dumpBytes( value.getData() ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                throw new DecoderException( I18n.err( I18n.ERR_04048 ), ine );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                    String msg = I18n.err( I18n.ERR_04049 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsGrammar.java:                            String msg = I18n.err( I18n.ERR_04050 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04051 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04052 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04053 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04054, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                    //String msg = I18n.err( I18n.ERR_04050 );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/AddRequestDecorator.java:            throw new IllegalArgumentException( I18n.err( I18n.ERR_04481_ENTRY_NULL_VALUE ) );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java:                throw new EncoderException( I18n.err( I18n.ERR_04043 ) );
+src/main/java/org/apache/directory/api/ldap/codec/LdapMessageGrammar.java:                        String msg = I18n.err( I18n.ERR_04109 );
+src/main/java/org/apache/directory/api/ldap/codec/LdapMessageGrammar.java:                        throw new DecoderException( I18n.err( I18n.ERR_04109 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java:                throw new EncoderException( I18n.err( I18n.ERR_04056 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java:            throw new DecoderException( I18n.err( I18n.ERR_04057 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java:            throw new DecoderException( I18n.err( I18n.ERR_04057 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java:                throw new EncoderException( I18n.err( I18n.ERR_04058 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/InitLdapMessage.java:            LOG.error( I18n.err( I18n.ERR_04066 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/InitLdapMessage.java:            throw new DecoderException( I18n.err( I18n.ERR_04067 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04068 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            throw new DecoderException( I18n.err( I18n.ERR_04069 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapMessage/StoreMessageId.java:            LOG.error( I18n.err( I18n.ERR_04070, Strings.dumpBytes( value.getData() ), ide
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    LOG.error( I18n.err( I18n.ERR_04015, badUrl, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/AddReferral.java:                    throw new DecoderException( I18n.err( I18n.ERR_04016, luee.getMessage() ), luee );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/InitReferrals.java:            String msg = I18n.err( I18n.ERR_04011 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        String msg = I18n.err( I18n.ERR_04013, dnStr, Strings.dumpBytes( dnBytes ), ine
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreMatchedDN.java:                        throw new DecoderException( I18n.err( I18n.ERR_04014, ine.getLocalizedMessage() ), ine );
+src/main/java/org/apache/directory/api/ldap/codec/actions/ldapResult/StoreResultCode.java:            LOG.error( I18n.err( I18n.ERR_04018, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:            String msg = I18n.err( I18n.ERR_04075 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/abandon/InitAbandonRequest.java:                .err( I18n.ERR_04076, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            String msg = I18n.err( I18n.ERR_04086 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/AddAddRequestAttributeType.java:            String msg = I18n.err( I18n.ERR_04087 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/InitAddRequest.java:            String msg = I18n.err( I18n.ERR_04084 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/add/StoreAddRequestEntryName.java:            String msg = I18n.err( I18n.ERR_04085 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitBindRequest.java:            String msg = I18n.err( I18n.ERR_04077 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/InitSaslBind.java:            String msg = I18n.err( I18n.ERR_04079 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/bind/StoreVersion.java:                .err( I18n.ERR_04078, Strings.dumpBytes( value.getData() ), ide.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestAttributeDesc.java:            String msg = I18n.err( I18n.ERR_04093 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/compare/StoreCompareRequestEntryName.java:            throw new DecoderException( I18n.err( I18n.ERR_04089 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:            throw new DecoderException( I18n.err( I18n.ERR_04073 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/del/InitDelRequest.java:                String msg = I18n.err( I18n.ERR_04074, dnStr, Strings.dumpBytes( dnBytes ), ine
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/extended/StoreExtendedRequestName.java:            String msg = I18n.err( I18n.ERR_04095 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/AddModifyRequestAttribute.java:            String msg = I18n.err( I18n.ERR_04083 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modify/StoreOperationType.java:            String msg = I18n.err( I18n.ERR_04082, Strings.dumpBytes( tlv.getValue().getData() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestDeleteOldRdn.java:                .err( I18n.ERR_04091, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestEntryName.java:            throw new DecoderException( I18n.err( I18n.ERR_04089 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewRdn.java:            String msg = I18n.err( I18n.ERR_04090 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/modifydn/StoreModifyDnRequestNewSuperior.java:                throw new DecoderException( I18n.err( I18n.ERR_04092 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAndFilter.java:            String msg = I18n.err( I18n.ERR_04006 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitAttributeDescFilter.java:            String msg = I18n.err( I18n.ERR_04007 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitNotFilter.java:            String msg = I18n.err( I18n.ERR_04009 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitOrFilter.java:            String msg = I18n.err( I18n.ERR_04010 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/InitSubstringsFilter.java:            String msg = I18n.err( I18n.ERR_04012 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreAny.java:            String msg = I18n.err( I18n.ERR_04019 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreFinal.java:            String msg = I18n.err( I18n.ERR_04020 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreInitial.java:            String msg = I18n.err( I18n.ERR_04108 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreMatchingRuleDnAttributes.java:                .err( I18n.ERR_13014_DN_ATTR_FLAG_INVALID, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/filter/StoreSubstringFilterType.java:            String msg = I18n.err( I18n.ERR_04106 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestDerefAlias.java:            String msg = I18n.err( I18n.ERR_04102, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestScope.java:            String msg = I18n.err( I18n.ERR_04101, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestSizeLimit.java:            String msg = I18n.err( I18n.ERR_04103, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTimeLimit.java:            String msg = I18n.err( I18n.ERR_04104, value.toString() );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreSearchRequestTypesOnly.java:                .err( I18n.ERR_04105, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/search/StoreTypeMatchingRule.java:            String msg = I18n.err( I18n.ERR_04022 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/unbind/InitUnbindRequest.java:            LOG.error( I18n.err( I18n.ERR_04071, Integer.valueOf( expectedLength ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/request/unbind/InitUnbindRequest.java:            throw new DecoderException( I18n.err( I18n.ERR_04072 ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/add/InitAddResponse.java:            String msg = I18n.err( I18n.ERR_04088 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/compare/InitCompareResponse.java:            String msg = I18n.err( I18n.ERR_04094 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/extended/StoreExtendedResponseName.java:            String msg = I18n.err( I18n.ERR_04017 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/intermediate/StoreIntermediateResponseName.java:            String msg = I18n.err( I18n.ERR_04095 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/entry/AddAttributeType.java:            String msg = I18n.err( I18n.ERR_04081 );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:                LOG.error( I18n.err( I18n.ERR_04021, urlStr, luee.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/actions/response/search/reference/StoreReference.java:                throw new DecoderException( I18n.err( I18n.ERR_04016, luee.getMessage() ), luee );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            String message = I18n.err( I18n.ERR_04060, e.getLocalizedMessage() );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            LOG.error( I18n.err( I18n.ERR_04062 ) );
+src/main/java/org/apache/directory/api/ldap/codec/api/LdapDecoder.java:            throw new DecoderException( I18n.err( I18n.ERR_04063 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                    String msg = I18n.err( I18n.ERR_04044 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            String msg = I18n.err( I18n.ERR_04044 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04045 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                            throw new DecoderException( I18n.err( I18n.ERR_04046 ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                LOG.error( I18n.err( I18n.ERR_04047, Strings.dumpBytes( value.getData() ) ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                                throw new DecoderException( I18n.err( I18n.ERR_04048 ), ine );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/entryChange/EntryChangeGrammar.java:                    String msg = I18n.err( I18n.ERR_04049 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/pagedSearch/PagedResultsGrammar.java:                            String msg = I18n.err( I18n.ERR_04050 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04051 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04052 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/persistentSearch/PersistentSearchGrammar.java:                            String msg = I18n.err( I18n.ERR_04053 );
+src/main/java/org/apache/directory/api/ldap/codec/controls/search/subentries/SubentriesGrammar.java:                            LOG.error( I18n.err( I18n.ERR_04054, Strings.dumpBytes( value.getData() ), bde.getMessage() ) );
+src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java:                    //String msg = I18n.err( I18n.ERR_04050 );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/AddRequestDecorator.java:            throw new IllegalArgumentException( I18n.err( I18n.ERR_04481_ENTRY_NULL_VALUE ) );
+src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java:                throw new EncoderException( I18n.err( I18n.ERR_04043 ) );
+src/main/java/org/apache/directory/api/ldap/codec/LdapMessageGrammar.java:                        String msg = I18n.err( I18n.ERR_04109 );
+src/main/java/org/apache/directory/api/ldap/codec/LdapMessageGrammar.java:                        throw new DecoderException( I18n.err( I18n.ERR_04109 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/ExtensibleMatchFilter.java:                throw new EncoderException( I18n.err( I18n.ERR_04056 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java:            throw new DecoderException( I18n.err( I18n.ERR_04057 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/NotFilter.java:            throw new DecoderException( I18n.err( I18n.ERR_04057 ) );
+src/main/java/org/apache/directory/api/ldap/codec/search/SubstringFilter.java:                throw new EncoderException( I18n.err( I18n.ERR_04058 ) );
diff --git a/ldap/model/src/checkstyle/suppressions.xml b/ldap/model/src/checkstyle/suppressions.xml
index a638848..75dd160 100644
--- a/ldap/model/src/checkstyle/suppressions.xml
+++ b/ldap/model/src/checkstyle/suppressions.xml
@@ -55,7 +55,7 @@
     <suppress files="org.apache.directory.api.ldap.model.entry.DefaultAttribute" checks="FileLength" />
     <suppress files="org.apache.directory.api.ldap.model.entry.DefaultEntry" checks="FileLength" />
     <suppress files="org.apache.directory.api.ldap.model.ldif.LdifReader" checks="FileLength" />
-    <suppress files="org.apache.directory.api.ldap.model.schema.parsers.FastOpenLdapSchemaParser" checks="FileLength" />
+    <suppress files="org.apache.directory.api.ldap.model.schema.parsers.OpenLdapSchemaParser" checks="FileLength" />
 
     <!-- Setter return super type, which is not recognized by Checkstyle -->
     <suppress files="org.apache.directory.api.ldap.model.message" checks="HiddenField" />
diff --git a/ldap/model/src/main/antlr/distinguishedName.g b/ldap/model/src/main/antlr/distinguishedName.g
index 9d1d432..2d243e1 100644
--- a/ldap/model/src/main/antlr/distinguishedName.g
+++ b/ldap/model/src/main/antlr/distinguishedName.g
@@ -29,7 +29,6 @@ import java.util.Map;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
 import javax.naming.NameParser;
 import org.apache.directory.api.ldap.model.entry.Value;
-import org.apache.directory.api.ldap.model.schema.parsers.ParserMonitor;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
 import org.apache.directory.api.util.ExpansibleByteBuffer;
@@ -137,19 +136,8 @@ options    {
 }
 
 {
-    private ParserMonitor monitor = null;
-    
-    public void setParserMonitor( ParserMonitor monitor )
-    {
-        this.monitor = monitor;
-    }
-    
     private void matchedProduction( String msg )
     {
-        if ( null != monitor )
-        {
-            monitor.matchedProduction( msg );
-        }
     }
 
     /**
diff --git a/ldap/model/src/main/antlr/schema-extension.g b/ldap/model/src/main/antlr/schema-extension.g
deleted file mode 100644
index b6eb96b..0000000
--- a/ldap/model/src/main/antlr/schema-extension.g
+++ /dev/null
@@ -1,119 +0,0 @@
-header {
-/*
- *  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.schema.syntaxes;
-
-import java.io.StringReader;
-import java.util.List;
-
-}
-
-
-   
-/**
- * An antlr generated schema lexer. This is a sub-lexer.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaExtensionLexer extends Lexer;
-
-options    {
-    k = 2 ;
-    exportVocab=AntlrSchemaExtension ;
-    charVocabulary = '\u0000'..'\uFFFE'; 
-    caseSensitive = false ;
-    defaultErrorHandler = false ;
-}
-
-protected WHSP
-    :
-    ( options {greedy=true;} :
-    ' '
-    |
-    '\t'
-    |
-    '\r' (options {greedy=true;} : '\n')? { newline(); } 
-    |
-    '\n' { newline(); }
-    )+
-    { $setType(Token.SKIP); } //ignore this token
-    ;
-
-protected QUOTE : '\'' ;
-//protected ESC : '\\' ;
-
-XKEY : xstring:XSTRING { setText(xstring.getText().trim()); }; 
-XVALUES : values:VALUES { setText(values.getText().trim()); };
-
-protected XSTRING : ( "x-" ( 'a'..'z' | '-' | '_' )+ (WHSP)? ) ; 
-protected VALUES : ( VALUE | '('  VALUE ( ('$')? VALUE )* ')' ) ;
-protected VALUE : (WHSP)? ( QUOTED_STRING ) (options {greedy=true;}: WHSP)? ;
-protected QUOTED_STRING : ( QUOTE (~'\'')* QUOTE ) ;
-
-
-
-
-
-
-/**
- * An antlr generated schema parser. This is a sub-parser used to parse
- * extensions according to RFC4512.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaExtensionParser extends Parser;
-options    {
-    k = 3 ;
-    defaultErrorHandler = false ;
-    //buildAST=true ;
-}
-
-
-    /**
-     * extensions = *( SP xstring SP qdstrings )
-     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE )
-     */
-extension returns [AntlrSchemaParser.Extension extension = new AntlrSchemaParser.Extension()]
-    :
-    ( xkey:XKEY { extension.key = xkey.getText(); } )
-    ( xvalues:XVALUES { extension.values = qdstrings(xvalues.getText()); } )
-    ;
-    
-    
-qdstrings [String s] returns [List<String> qdstrings]
-    {
-        try 
-        {
-            AntlrSchemaQdstringLexer lexer = new AntlrSchemaQdstringLexer(new StringReader(s));
-            AntlrSchemaQdstringParser parser = new AntlrSchemaQdstringParser(lexer);
-            qdstrings = parser.qdstrings();
-        }
-        catch (RecognitionException re) {
-            re.printStackTrace();
-            throw re;
-        }
-        catch (TokenStreamException tse) {
-            tse.printStackTrace();
-            throw tse;
-        }
-    }
-    :
-    ;
-
diff --git a/ldap/model/src/main/antlr/schema-qdstring.g b/ldap/model/src/main/antlr/schema-qdstring.g
deleted file mode 100644
index 03d8f83..0000000
--- a/ldap/model/src/main/antlr/schema-qdstring.g
+++ /dev/null
@@ -1,162 +0,0 @@
-header {
-/*
- *  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.schema.syntaxes;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.directory.api.ldap.model.schema.parsers.ParserMonitor;
-
-}
-
-   
-/**
- * An antlr generated schema lexer. This is a sub-lexer.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaQdstringLexer extends Lexer;
-
-options    {
-    k = 2 ;
-    exportVocab=AntlrSchemaQdstring ;
-    charVocabulary = '\u0000'..'\uFFFE'; 
-    caseSensitive = false ;
-    defaultErrorHandler = false ;
-}
-
-WHSP
-    :
-    ( options {greedy=true;} :
-    ' '
-    |
-    '\t'
-    |
-    '\r' (options {greedy=true;} : '\n')? { newline(); } 
-    |
-    '\n' { newline(); }
-    )+
-    { $setType(Token.SKIP); } //ignore this token
-    ;
-
-LPAR : '(' ;
-RPAR : ')' ;
-QUOTE : '\'' ;
-QDSTRING : ( QUOTE (~'\'')* QUOTE ) ;
-
-
-/**
- * An antlr generated schema parser. This is a sub-parser used to parse
- * qdstring and qdstrings according to RFC4512.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaQdstringParser extends Parser;
-options    {
-    k = 3 ;
-    defaultErrorHandler = false ;
-    //buildAST=true ;
-}
-
-{
-    private ParserMonitor monitor = null;
-    public void setParserMonitor( ParserMonitor monitor )
-    {
-        this.monitor = monitor;
-    }
-    private void matchedProduction( String msg )
-    {
-        if ( null != monitor )
-        {
-            monitor.matchedProduction( msg );
-        }
-    }
-}
-
-    /**
-     * qdstrings = qdstring / ( LPAREN WSP qdstringlist WSP RPAREN )
-     * qdstringlist = [ qdstring *( SP qdstring ) ]
-     */
-qdstrings returns [List<String> qdstrings]
-    {
-        matchedProduction( "AntlrSchemaQdstringParser.qdstrings()" );
-        qdstrings = new ArrayList<String>();
-        String qdstring = null;
-    }
-    :
-    (
-        ( 
-            q:QDSTRING 
-            { 
-                qdstring = q.getText(); 
-                if(qdstring.startsWith("'")) {
-                    qdstring = qdstring.substring(1, qdstring.length());
-                }
-                if(qdstring.endsWith("'")) {
-                    qdstring = qdstring.substring(0, qdstring.length()-1);
-                }
-                qdstring = qdstring.replaceAll("\\\\5C", "\\\\");
-                qdstring = qdstring.replaceAll("\\\\5c", "\\\\");
-                qdstring = qdstring.replaceAll("\\\\27", "'");
-                qdstrings.add(qdstring);
-            } 
-        )
-    |
-        ( LPAR qdstring=qdstring { qdstrings.add(qdstring); } ( qdstring=qdstring { qdstrings.add(qdstring); } )* RPAR )
-    )
-    ;
-
-    /**
-     * qdstring = SQUOTE dstring SQUOTE
-     * dstring = 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
-     *
-     * QQ =  ESC %x32 %x37 ; "\27"
-     * QS =  ESC %x35 ( %x43 / %x63 ) ; "\5C" / "\5c"
-     *
-     * ; Any UTF-8 encoded Unicode character
-     * ; except %x27 ("\'") and %x5C ("\")
-     * QUTF8    = QUTF1 / UTFMB
-     *
-     * ; Any ASCII character except %x27 ("\'") and %x5C ("\")
-     * QUTF1    = %x00-26 / %x28-5B / %x5D-7F
-     */    
-qdstring returns [String qdstring=null]
-    {
-        matchedProduction( "AntlrSchemaQdstringParser.qdstring()" );
-    }
-    : 
-    ( 
-        q:QDSTRING 
-        { 
-            qdstring = q.getText(); 
-            if(qdstring.startsWith("'")) {
-                qdstring = qdstring.substring(1, qdstring.length());
-            }
-            if(qdstring.endsWith("'")) {
-                qdstring = qdstring.substring(0, qdstring.length()-1);
-            }
-            qdstring = qdstring.replaceAll("\\\\5C", "\\\\");
-            qdstring = qdstring.replaceAll("\\\\5c", "\\\\");
-            qdstring = qdstring.replaceAll("\\\\27", "'");
-        } 
-    )
-    ; 
-
diff --git a/ldap/model/src/main/antlr/schema-value.g b/ldap/model/src/main/antlr/schema-value.g
deleted file mode 100644
index 02992b6..0000000
--- a/ldap/model/src/main/antlr/schema-value.g
+++ /dev/null
@@ -1,442 +0,0 @@
-header {
-/*
- *  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.schema.syntaxes;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import org.apache.directory.api.ldap.model.schema.parsers.ParserMonitor;
-
-}
-
-
-/**
- * An antlr generated schema lexer. This is a sub-lexer.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaValueLexer extends Lexer;
-
-options    {
-    k = 3 ;
-    exportVocab=AntlrSchemaValue ;
-    charVocabulary = '\3'..'\377' ;
-    caseSensitive = false ;
-    defaultErrorHandler = false ;
-}
-
-WHSP
-    :
-    ( options {greedy=true;} :
-    ' '
-    |
-    '\t'
-    |
-    '\r' (options {greedy=true;} : '\n')? { newline(); } 
-    |
-    '\n' { newline(); }
-    |
-    '#' (~'\n')* '\n' { newline(); }
-    )+
-    { setText(" "); }
-    //{$setType(Token.SKIP);} //ignore this token
-    ;
-
-LPAR : '(' ;
-RPAR : ')' ;
-protected CHAR : 'a'..'z' ;
-protected LDIGIT : '1'..'9' ;
-protected DIGIT : '0'..'9' ; 
-protected NUMBER : DIGIT | ( LDIGIT (DIGIT)+ ) ;
-protected NUMBER2 : (DIGIT)+ ;
-protected NUMERICOID : NUMBER2 ( '.' NUMBER2 )+ ;
-protected HYPEN : '-';
-protected OTHER : '_' | ';' | '.' | ':' | '#' ;
-protected DESCR: CHAR ( CHAR | DIGIT | HYPEN )* ;
-protected QUIRKS_DESCR: ( CHAR | DIGIT | HYPEN | OTHER )+ ;
-
-QUOTE : '\'' ;
-DOLLAR : '$' ;
-LCURLY : '{' ;
-RCURLY : '}' ;
-LEN : LCURLY n:NUMBER2 RCURLY { setText(n.getText()); } ;
-
-
-DESCR_OR_QUIRKS_DESCR :
-    ( NUMERICOID QUIRKS_DESCR ) => QUIRKS_DESCR { $setType( QUIRKS_DESCR ); }
-    |
-    ( NUMBER QUIRKS_DESCR ) => QUIRKS_DESCR { $setType( QUIRKS_DESCR ); }
-    |
-    ( HYPEN QUIRKS_DESCR ) => QUIRKS_DESCR { $setType( QUIRKS_DESCR ); }
-    |
-    ( OTHER QUIRKS_DESCR ) => QUIRKS_DESCR { $setType( QUIRKS_DESCR ); }
-    |
-    ( DESCR QUIRKS_DESCR ) => QUIRKS_DESCR { $setType( QUIRKS_DESCR ); }
-    |
-    ( DESCR ) { $setType( DESCR ); }
-    |
-    ( NUMBER '.' ) => NUMERICOID { $setType( NUMERICOID ); }
-    |
-    ( NUMBER ) { $setType( NUMBER ); }
-    ;
-
-
-/**
- * An antlr generated schema parser. This is a sub-parser used to parse
- * numericoid, oid, oids, qdescr, qdescrs according to RFC4512.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaValueParser extends Parser;
-options    {
-    k = 3 ;
-    defaultErrorHandler = false ;
-    //buildAST=true ;
-}
-
-{
-    private ParserMonitor monitor = null;
-    public void setParserMonitor( ParserMonitor monitor )
-    {
-        this.monitor = monitor;
-    }
-    private void matchedProduction( String msg )
-    {
-        if ( null != monitor )
-        {
-            monitor.matchedProduction( msg );
-        }
-    }
-}
-
-    /**
-     * noidlen = numericoid [ LCURLY len RCURLY ]
-     * len = number
-     */
-noidlen returns [AntlrSchemaParser.NoidLen noidlen = new AntlrSchemaParser.NoidLen()]
-    {
-        matchedProduction( "AntlrSchemaValueParser.noidlen()" );
-    }
-    :
-    ( 
-        (LPAR)?
-        (WHSP)?
-        (QUOTE)?
-        (
-            ( d4:DESCR { noidlen.noid = d4.getText(); } )
-            |
-            ( n2:NUMERICOID { noidlen.noid = n2.getText(); } )
-        )
-        (QUOTE)?
-        (WHSP)?
-        (RPAR)?
-        (
-            l:LEN { noidlen.len = Long.parseLong(l.getText()); }
-            (QUOTE)?
-            (WHSP)?
-            (RPAR)?
-        )?
-    )
-    ;
-
-
-    /**
-     * noidlen = numericoid [ LCURLY len RCURLY ]
-     * len = number
-     */
-quirksNoidlen returns [AntlrSchemaParser.NoidLen noidlen = new AntlrSchemaParser.NoidLen()]
-    {
-        matchedProduction( "AntlrSchemaValueParser.quirksNoidlen()" );
-    }
-    :
-    (
-        (LPAR)?
-        (WHSP)?
-        (QUOTE)?
-        (
-            ( q2:QUIRKS_DESCR { noidlen.noid = q2.getText(); } )
-            |
-            ( d4:DESCR { noidlen.noid = d4.getText(); } )
-            |
-            ( n2:NUMERICOID { noidlen.noid = n2.getText(); } )
-        )
-        (QUOTE)?
-        (WHSP)?
-        (RPAR)?
-        (
-            l:LEN { noidlen.len = Long.parseLong(l.getText()); }
-            (QUOTE)?
-            (WHSP)?
-            (RPAR)?
-        )?    
-    )
-    ;
-
-
-    /**
-     * numericoid = number 1*( DOT number )
-     */
-numericoid returns [String numericoid=null]
-    {
-        matchedProduction( "AntlrSchemaValueParser.numericoid()" );
-    }
-    : 
-    (
-        (WHSP)?
-        (LPAR (WHSP)? )?
-        (
-            ( QUOTE n1:NUMERICOID { numericoid = n1.getText(); } QUOTE )
-            |
-            ( n2:NUMERICOID { numericoid = n2.getText(); } )
-        )
-        (
-        (WHSP)?
-        (RPAR)?
-        )
-    )
-    ;
-
-
-    /**
-     * oid = descr / numericoid
-     * numericoid = number 1*( DOT number )
-     * descr = keystring
-     * keystring = leadkeychar *keychar
-     * leadkeychar = ALPHA
-     * keychar = ALPHA / DIGIT / HYPHEN
-     * number  = DIGIT / ( LDIGIT 1*DIGIT )
-     *
-     */
-oid returns [String oid=null]
-    {
-        matchedProduction( "AntlrSchemaValueParser.oid()" );
-    }
-    : 
-    (
-        (WHSP)?
-        (
-            ( QUOTE n1:NUMERICOID { oid = n1.getText(); } QUOTE  )
-            |
-            ( n2:NUMERICOID { oid = n2.getText(); } )
-            |
-            ( QUOTE d1:DESCR { oid = d1.getText(); } QUOTE )
-            |
-            ( d2:DESCR { oid = d2.getText(); } )
-        )
-        (options {greedy=true;} : WHSP)?
-    )
-    ;
-
-
-    /**
-     * oids = oid / ( LPAREN WSP oidlist WSP RPAREN )
-     * oidlist = oid *( WSP DOLLAR WSP oid )
-     */
-oids returns [List<String> oids]
-    {
-        matchedProduction( "AntlrSchemaValueParser.oids()" );
-        oids = new ArrayList<String>();
-        String oid = null;
-    }
-    :
-    (
-        ( 
-            oid=oid { oids.add(oid); } 
-        )
-    |
-        (
-            LPAR
-            oid=oid { oids.add(oid); } 
-            ( 
-                (DOLLAR)? 
-                oid=oid { oids.add(oid); } 
-            )* 
-            RPAR
-        )
-    )
-    ;
-
-
-    /**
-     * qdescr = SQUOTE descr SQUOTE
-     */
-qdescr returns [String qdescr=null]
-    {
-        matchedProduction( "AntlrSchemaValueParser.qdescr()" );
-    }
-    : 
-    ( 
-        (WHSP)?
-        (
-            ( QUOTE d1:DESCR { qdescr = d1.getText(); } QUOTE )
-            |
-            ( d2:DESCR { qdescr = d2.getText(); } )
-        )
-    )
-    ; 
-
-
-    /**
-     * qdescrs = qdescr / ( LPAREN WSP qdescrlist WSP RPAREN )
-     * qdescrlist = [ qdescr *( SP qdescr ) ]
-     */
-qdescrs returns [List<String> qdescrs]
-    {
-        matchedProduction( "AntlrSchemaValueParser.qdescrs()" );
-        qdescrs = new ArrayList<String>();
-        String qdescr = null;
-    }
-    :
-    (
-        ( 
-            qdescr=qdescr { qdescrs.add(qdescr); } 
-        )
-    |
-        (             
-        
-            LPAR 
-            qdescr=qdescr { qdescrs.add(qdescr); } 
-            (options {greedy=true;} : WHSP)?
-            (DOLLAR)?
-            (options {greedy=true;} : WHSP)?
-            (
-                qdescr=qdescr { qdescrs.add(qdescr); } 
-                (options {greedy=true;} : WHSP)?
-                (DOLLAR)?
-                (options {greedy=true;} : WHSP)?
-            )*
-            RPAR 
-        )
-    )
-    ;
-    
-    
-    
-    /**
-     * qdescr = SQUOTE descr SQUOTE
-     */
-quirksQdescr returns [String qdescr=null]
-    {
-        matchedProduction( "AntlrSchemaValueParser.qdescr()" );
-    }
-    : 
-    ( 
-        (WHSP)?
-        (
-            ( QUOTE d1:QUIRKS_DESCR { qdescr = d1.getText(); } QUOTE )
-            |
-            ( d2:QUIRKS_DESCR { qdescr = d2.getText(); } )
-            |
-            ( QUOTE d3:DESCR { qdescr = d3.getText(); } QUOTE )
-            |
-            ( d4:DESCR { qdescr = d4.getText(); } )
-            |
-            ( QUOTE n1:NUMERICOID { qdescr = n1.getText(); } QUOTE  )
-            |
-            ( n2:NUMERICOID { qdescr = n2.getText(); } )
-        )
-        (options {greedy=true;} : WHSP)?
-    )
-    ; 
-
-
-    /**
-     * qdescrs = qdescr / ( LPAREN WSP qdescrlist WSP RPAREN )
-     * qdescrlist = [ qdescr *( SP qdescr ) ]
-     */
-quirksQdescrs returns [List<String> qdescrs]
-    {
-        matchedProduction( "AntlrSchemaValueParser.qdescrs()" );
-        qdescrs = new ArrayList<String>();
-        String qdescr = null;
-    }
-    :
-    (
-        ( 
-            qdescr=quirksQdescr { qdescrs.add(qdescr); } 
-        )
-    |
-        ( 
-            LPAR 
-            qdescr=quirksQdescr { qdescrs.add(qdescr); } 
-            (options {greedy=true;} : WHSP)?
-            (DOLLAR)?
-            (options {greedy=true;} : WHSP)?
-            (
-                qdescr=quirksQdescr { qdescrs.add(qdescr); } 
-                (options {greedy=true;} : WHSP)?
-                (DOLLAR)?
-                (options {greedy=true;} : WHSP)?
-            )*
-            RPAR 
-        )
-    )
-    ;
-    
-    
-    
-    
-    /**
-     * ruleid = number
-     * number  = DIGIT / ( LDIGIT 1*DIGIT )
-     *
-     */
-ruleid returns [Integer ruleid=null]
-    {
-        matchedProduction( "AntlrSchemaValueParser.ruleid()" );
-    }
-    : 
-    (
-        (WHSP)? 
-        n:NUMBER { ruleid = Integer.parseInt(n.getText()); }
-    )
-    ;
-
-
-    /**
-     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
-     * ruleidlist = ruleid *( SP ruleid )
-     */
-ruleids returns [List<Integer> ruleids]
-    {
-        matchedProduction( "AntlrSchemaValueParser.ruleids()" );
-        ruleids = new ArrayList<Integer>();
-        Integer ruleid = null;
-    }
-    :
-    (
-        ( 
-            ruleid=ruleid { ruleids.add(ruleid); } 
-        )
-    |
-        ( 
-            LPAR 
-            ruleid=ruleid { ruleids.add(ruleid); } 
-            ( 
-                WHSP
-                ruleid=ruleid { ruleids.add(ruleid); } 
-            )* 
-            (WHSP)?
-            RPAR 
-        )
-    )
-    ;
-    
\ No newline at end of file
diff --git a/ldap/model/src/main/antlr/schema.g b/ldap/model/src/main/antlr/schema.g
deleted file mode 100644
index 9aa790b..0000000
--- a/ldap/model/src/main/antlr/schema.g
+++ /dev/null
@@ -1,1085 +0,0 @@
-header {
-/*
- *  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.schema.syntaxes;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.directory.api.ldap.model.schema.parsers.LdapComparatorDescription;
-import org.apache.directory.api.ldap.model.schema.DitContentRule;
-import org.apache.directory.api.ldap.model.schema.DitStructureRule;
-import org.apache.directory.api.ldap.model.schema.LdapSyntax;
-import org.apache.directory.api.ldap.model.schema.MatchingRule;
-import org.apache.directory.api.ldap.model.schema.MutableMatchingRule;
-import org.apache.directory.api.ldap.model.schema.MatchingRuleUse;
-import org.apache.directory.api.ldap.model.schema.NameForm;
-import org.apache.directory.api.ldap.model.schema.parsers.NormalizerDescription;
-import org.apache.directory.api.ldap.model.schema.parsers.ParserMonitor;
-import org.apache.directory.api.ldap.model.schema.AttributeType;
-import org.apache.directory.api.ldap.model.schema.MutableAttributeType;
-import org.apache.directory.api.ldap.model.schema.ObjectClass;
-import org.apache.directory.api.ldap.model.schema.MutableObjectClass;
-import org.apache.directory.api.ldap.model.schema.parsers.SyntaxCheckerDescription;
-import org.apache.directory.api.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
-import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
-import org.apache.directory.api.ldap.model.schema.UsageEnum;
-
-}
-
-/**
- * An antlr generated schema main lexer.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaLexer extends Lexer;
-
-options    {
-    k = 8 ;
-    exportVocab=AntlrSchema ;
-    charVocabulary = '\u0000'..'\uFFFE';
-    caseSensitive = false ;
-    defaultErrorHandler = false ;
-}
-
-WHSP
-    :
-    ( options {greedy=true;} :
-    ' '
-    |
-    '\t'
-    |
-    '\r' (options {greedy=true;} : '\n')? { newline(); } 
-    |
-    '\n' { newline(); }
-    |
-    '#' (~'\n')* '\n' { newline(); }
-    )+
-    {$setType(Token.SKIP);} //ignore this token
-    ;
-
-LPAR : '(' ;
-RPAR : ')' ;
-QUOTE : '\'' ;
-DOLLAR : '$' ;
-LBRACKET : '{' ;
-RBRACKET : '}' ;
-
-LEN : LBRACKET ('0'..'9')+ RBRACKET ;
-
-SINGLE_VALUE : ( "single-value" (WHSP)? ) ;
-COLLECTIVE : ( "collective" (WHSP)? ) ;
-NO_USER_MODIFICATION : ( "no-user-modification" (WHSP)? ) ;
-
-OBSOLETE : ( "obsolete" (WHSP)? ) ;
-ABSTRACT : ( "abstract" (WHSP)? ) ;
-STRUCTURAL : ( "structural" (WHSP)? ) ;
-protected AUXILIARY : ( "auxiliary" (WHSP)? ) ;
-
-OBJECTIDENTIFIER : 
-    ( "objectidentifier" 
-      WHSP
-      ( oiName:UNQUOTED_STRING ) 
-      WHSP
-      ( oiValue:UNQUOTED_STRING ) 
-    ) 
-    { setText( oiName.getText() + " " + oiValue.getText() ); }
-    ;
-
-OBJECTCLASS : ( "objectclass" (WHSP)? ) ;
-ATTRIBUTETYPE : ( "attributetype" (WHSP)? ) ;
-
-STARTNUMERICOID : ( LPAR (options {greedy=true;} : WHSP)? ( numericoid:VALUES ) ) { setText(numericoid.getText()); } ;
-NAME : ( "name" (options {greedy=true;} : WHSP)? qdstrings:VALUES ) { setText(qdstrings.getText().trim()); } ;
-DESC : ( "desc" (options {greedy=true;} : WHSP)? qdstring:VALUES ) { setText(qdstring.getText().trim()); } ;
-SUP : ( "sup" (options {greedy=true;} : WHSP)? sup:VALUES ) { setText(sup.getText().trim()); } ;
-MUST : ( "must" (options {greedy=true;} : WHSP)? must:VALUES ) { setText(must.getText().trim()); } ;
-MAY : ( "may" (options {greedy=true;} : WHSP)? may:VALUES ) { setText(may.getText()); } ;
-protected AUX : ( "aux" (options {greedy=true;} : WHSP)? aux:VALUES ) { setText(aux.getText()); } ;
-NOT : ( "not" (options {greedy=true;} : WHSP)? not:VALUES ) { setText(not.getText()); } ;
-FORM : ( "form" (options {greedy=true;} : WHSP)? form:VALUES ) { setText(form.getText()); } ;
-OC : ( "oc" (options {greedy=true;} : WHSP)? oc:VALUES ) { setText(oc.getText()); } ;
-EQUALITY : ( "equality" (options {greedy=true;} : WHSP)? equality:VALUES ) { setText(equality.getText().trim()); } ;
-ORDERING : ( "ordering" (options {greedy=true;} : WHSP)? ordering:VALUES ) { setText(ordering.getText().trim()); } ;
-SUBSTR : ( "substr" (options {greedy=true;} : WHSP)? substring:VALUES ) { setText(substring.getText().trim()); } ;
-SYNTAX : ( "syntax" (options {greedy=true;} : WHSP)? syntax:VALUES (len:LEN)? ) { setText(syntax.getText().trim() + (len!=null?len.getText().trim():"")); } ;
-APPLIES : ( "applies" (options {greedy=true;} : WHSP)? applies:VALUES ) { setText(applies.getText().trim()); } ;
-EXTENSION : x:( "x-" ( options {greedy=true;} : 'a'..'z' | '-' | '_' )+ (options {greedy=true;} : WHSP)? VALUES ) ; 
-FQCN : ( "fqcn" (options {greedy=true;} : WHSP)? fqcn:FQCN_VALUE ) { setText(fqcn.getText().trim()); } ;
-BYTECODE : ( "bytecode" (options {greedy=true;} : WHSP)? bytecode:BYTECODE_VALUE ) { setText(bytecode.getText().trim()); } ;
-
-AUX_OR_AUXILIARY :
-    ( AUXILIARY ) => AUXILIARY { $setType( AUXILIARY ); }
-    |
-    ( AUX ) { $setType( AUX ); }
-    ;
-
-protected VALUES : ( VALUE | LPAR  VALUE ( (DOLLAR)? VALUE )* RPAR ) ;
-protected VALUE : (WHSP)? ( QUOTED_STRING | UNQUOTED_STRING ) (options {greedy=true;}: WHSP)? ;
-protected UNQUOTED_STRING : (options{greedy=true;}: 'a'..'z' | '0'..'9' | '-' | '_' | ';' | '.' | ':' )+ ;
-protected QUOTED_STRING : ( QUOTE (~'\'')* QUOTE ) ;
-protected FQCN_VALUE : ( FQCN_IDENTIFIER ( '.' FQCN_IDENTIFIER )* ) ;
-protected FQCN_IDENTIFIER : ( FQCN_LETTER ( FQCN_LETTERORDIGIT )* ) ;
-protected FQCN_LETTER : 
-       '\u0024' |
-       '\u005f' |
-       '\u0061'..'\u007a' |
-       '\u00c0'..'\u00d6' |
-       '\u00d8'..'\u00f6' |
-       '\u00f8'..'\u00ff' |
-       '\u0100'..'\u1fff' |
-       '\u3040'..'\u318f' |
-       '\u3300'..'\u337f' |
-       '\u3400'..'\u3d2d' |
-       '\u4e00'..'\u9fff' |
-       '\uf900'..'\ufaff' ;
-protected FQCN_LETTERORDIGIT : 
-       '\u0024' |
-       '\u005f' |
-       '\u0061'..'\u007a' |
-       '\u00c0'..'\u00d6' |
-       '\u00d8'..'\u00f6' |
-       '\u00f8'..'\u00ff' |
-       '\u0100'..'\u1fff' |
-       '\u3040'..'\u318f' |
-       '\u3300'..'\u337f' |
-       '\u3400'..'\u3d2d' |
-       '\u4e00'..'\u9fff' |
-       '\uf900'..'\ufaff' |
-       '\u0030'..'\u0039' ;
-protected BYTECODE_VALUE : ( 'a'..'z' | '0'..'9' | '+' | '/' | '=' )+ ;
-
-
-USAGE : ( "usage" (WHSP)? ) ;
-USER_APPLICATIONS : ( "userapplications" (WHSP)? ) ;
-DIRECTORY_OPERATION : ( "directoryoperation" (WHSP)? ) ;
-DISTRIBUTED_OPERATION : ( "distributedoperation" (WHSP)? ) ;
-DSA_OPERATION : ( "dsaoperation" (WHSP)? ) ;
-
-/**
- * An antlr generated schema main parser.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-class AntlrSchemaParser extends Parser;
-options    {
-    k = 3 ;
-    defaultErrorHandler = false ;
-    //buildAST=true ;
-}
-
-{
-    private ParserMonitor monitor = null;
-    private boolean isQuirksModeEnabled = false;
-    public void setParserMonitor( ParserMonitor monitor )
-    {
-        this.monitor = monitor;
-    }
-    private void matchedProduction( String msg )
-    {
-        if ( null != monitor )
-        {
-            monitor.matchedProduction( msg );
-        }
-    }
-    public void setQuirksMode( boolean enabled )
-    {
-        this.isQuirksModeEnabled = enabled;
-    }
-    public boolean isQuirksMode()
-    {
-        return this.isQuirksModeEnabled;
-    }
-    static class Extension
-    {
-        String key = "";
-        List<String> values = new ArrayList<String>();
-        
-        public void addValue( String value )
-        {
-            this.values.add( value );
-        }
-    }
-    static class NoidLen
-    {
-        String noid = "";
-        long len = 0L;
-    }
-    static class ElementTracker
-    {
-        Map<String, Integer> elementMap = new HashMap<String, Integer>();
-        void track(String element, Token token) throws SemanticException 
-        {
-            if(elementMap.containsKey(element))
-            {
-                throw new SemanticException( element + " appears twice.", token.getFilename(), token.getLine() , token.getColumn() );
-            }
-            elementMap.put(element, Integer.valueOf(1));
-        }
-        boolean contains(String element) 
-        {
-            return elementMap.containsKey(element);
-        }
-    }
-
-}
-
-openLdapSchema returns [List<Object> list = new ArrayList<Object>()]
-    {
-        AttributeType attributeType = null;
-        ObjectClass objectClass = null;
-        OpenLdapObjectIdentifierMacro oloid = null;
-    }
-    :
-    (
-        oloid = openLdapObjectIdentifier { list.add( oloid ); }
-        |
-        attributeType = openLdapAttributeType { list.add( attributeType ); }
-        |
-        objectClass = openLdapObjectClass { list.add( objectClass ); }
-    )*
-    ;
-
-openLdapObjectIdentifier returns [OpenLdapObjectIdentifierMacro oloid]
-    {
-        matchedProduction( "openLdapObjectIdentifier()" );
-    }
-    :
-    (
-        oi:OBJECTIDENTIFIER 
-        {
-            String[] nameAndValue = oi.getText().split( " " );
-            oloid = new OpenLdapObjectIdentifierMacro();
-            oloid.setName( nameAndValue[0] );
-            oloid.setRawOidOrNameSuffix( nameAndValue[1] );
-        }
-    )
-    ;
-    
-
-openLdapObjectClass returns [ObjectClass objectClass]
-    {
-        matchedProduction( "openLdapObjectClass()" );
-    }
-    :
-    (
-        OBJECTCLASS
-        ( objectClass=objectClassDescription )
-    )
-    ;
-    
-    
-openLdapAttributeType returns [AttributeType attributeType]
-    {
-        matchedProduction( "openLdapAttributeType()" );
-    }
-    :
-    (
-        ATTRIBUTETYPE
-        ( attributeType=attributeTypeDescription )
-    )
-    ;
-
-
-    /**
-     * Production for matching object class descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * ObjectClassDescription = LPAREN WSP
-     *     numericoid                 ; object identifier
-     *     [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *     [ SP "DESC" SP qdstring ]  ; description
-     *     [ SP "OBSOLETE" ]          ; not active
-     *     [ SP "SUP" SP oids ]       ; superior object classes
-     *     [ SP kind ]                ; kind of class
-     *     [ SP "MUST" SP oids ]      ; attribute types
-     *     [ SP "MAY" SP oids ]       ; attribute types
-     *     extensions WSP RPAREN
-     *
-     * kind = "ABSTRACT" / "STRUCTURAL" / "AUXILIARY"
-     * 
-     * extensions = *( SP xstring SP qdstrings )
-     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
-     * </pre>
-    */
-objectClassDescription returns [MutableObjectClass objectClass]
-    {
-        matchedProduction( "objectClassDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { objectClass = new MutableObjectClass(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); objectClass.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); objectClass.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); objectClass.setObsolete( true ); } )
-        |
-        ( sup:SUP { et.track("SUP", sup); objectClass.setSuperiorOids(oids(sup.getText())); } )
-        |
-        ( kind1:ABSTRACT { et.track("KIND", kind1); objectClass.setType( ObjectClassTypeEnum.ABSTRACT ); }
-          |
-          kind2:STRUCTURAL { et.track("KIND", kind2); objectClass.setType( ObjectClassTypeEnum.STRUCTURAL ); }
-          |
-          kind3:AUXILIARY { et.track("KIND", kind3); objectClass.setType( ObjectClassTypeEnum.AUXILIARY ); } 
-        )
-        |
-        ( must:MUST { et.track("MUST", must); objectClass.setMustAttributeTypeOids(oids(must.getText())); } )
-        |
-        ( may:MAY { et.track("MAY", may); objectClass.setMayAttributeTypeOids(oids(may.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            objectClass.addExtension(ex.key, ex.values); 
-         } )
-    )*    
-    RPAR
-    ;
-
-
-    /**
-     * Production for matching attribute type descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * AttributeTypeDescription = LPAREN WSP
-     *     numericoid                    ; object identifier
-     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
-     *     [ SP "DESC" SP qdstring ]     ; description
-     *     [ SP "OBSOLETE" ]             ; not active
-     *     [ SP "SUP" SP oid ]           ; supertype
-     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
-     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
-     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
-     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
-     *     [ SP "SINGLE-VALUE" ]         ; single-value
-     *     [ SP "COLLECTIVE" ]           ; collective
-     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
-     *     [ SP "USAGE" SP usage ]       ; usage
-     *     extensions WSP RPAREN         ; extensions
-     * 
-     * usage = "userApplications"     /  ; user
-     *         "directoryOperation"   /  ; directory operational
-     *         "distributedOperation" /  ; DSA-shared operational
-     *         "dSAOperation"            ; DSA-specific operational     
-     * 
-     * extensions = *( SP xstring SP qdstrings )
-     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
-     * </pre>
-    */
-attributeTypeDescription returns [MutableAttributeType attributeType]
-    {
-        matchedProduction( "attributeTypeDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { attributeType = new MutableAttributeType(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); attributeType.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); attributeType.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); attributeType.setObsolete( true ); } )
-        |
-        ( superior:SUP { et.track("SUP", superior); attributeType.setSuperiorOid(oid(superior.getText())); } )
-        |
-        ( equality:EQUALITY { et.track("EQUALITY", equality); attributeType.setEqualityOid(oid(equality.getText())); } )
-        |
-        ( ordering:ORDERING { et.track("ORDERING", ordering); attributeType.setOrderingOid(oid(ordering.getText())); } )
-        |
-        ( substring:SUBSTR { et.track("SUBSTR", substring); attributeType.setSubstringOid(oid(substring.getText())); } )
-        |
-        ( syntax:SYNTAX { 
-           et.track("SYNTAX", syntax); 
-            NoidLen noidlen = noidlen(syntax.getText());
-            attributeType.setSyntaxOid(noidlen.noid); 
-            attributeType.setSyntaxLength(noidlen.len);
-          } )
-        |
-        ( singleValued:SINGLE_VALUE { et.track("SINGLE_VALUE", singleValued); attributeType.setSingleValued( true ); } )
-        |
-        ( collective:COLLECTIVE { et.track("COLLECTIVE", collective); attributeType.setCollective( true ); } )
-        |
-        ( noUserModification:NO_USER_MODIFICATION { et.track("NO_USER_MODIFICATION", noUserModification); attributeType.setUserModifiable( false ); } )
-        |
-        ( usage1:USAGE (WHSP)* USER_APPLICATIONS { et.track("USAGE", usage1); attributeType.setUsage( UsageEnum.USER_APPLICATIONS ); }
-          |
-          usage2:USAGE DIRECTORY_OPERATION { et.track("USAGE", usage2); attributeType.setUsage( UsageEnum.DIRECTORY_OPERATION ); }
-          |
-          usage3:USAGE DISTRIBUTED_OPERATION { et.track("USAGE", usage3); attributeType.setUsage( UsageEnum.DISTRIBUTED_OPERATION ); } 
-          |
-          usage4:USAGE DSA_OPERATION { et.track("USAGE", usage4); attributeType.setUsage( UsageEnum.DSA_OPERATION ); } 
-        )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            attributeType.addExtension(ex.key, ex.values); 
-         } )
-    )*    
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("SYNTAX") && !et.contains("SUP") ) 
-            {
-                throw new SemanticException( "One of SYNTAX or SUP is required", null, 0, 0 );
-            }
-        
-            // COLLECTIVE requires USAGE userApplications
-            if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
-            {
-                throw new SemanticException( "COLLECTIVE requires USAGE userApplications", null, 0, 0 );
-            }
-        
-            // NO-USER-MODIFICATION requires an operational USAGE.
-            if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
-            {
-                throw new SemanticException( "NO-USER-MODIFICATION requires an operational USAGE", null, 0, 0 );
-            }
-        }
-    }
-    ;
-
-
-    /**
-     * Production for matching ldap syntax descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * SyntaxDescription = LPAREN WSP
-     *    numericoid                 ; object identifier
-     *    [ SP "DESC" SP qdstring ]  ; description
-     *    extensions WSP RPAREN      ; extensions
-     * </pre>
-    */
-ldapSyntaxDescription returns [LdapSyntax ldapSyntax]
-    {
-        matchedProduction( "ldapSyntaxDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { ldapSyntax = new LdapSyntax(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); ldapSyntax.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); ldapSyntax.setDescription(qdstring(desc.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            ldapSyntax.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    ;
-
-
-
-    /**
-     * Production for matching rule descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * MatchingRuleDescription = LPAREN WSP
-     *    numericoid                 ; object identifier
-     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *    [ SP "DESC" SP qdstring ]  ; description
-     *    [ SP "OBSOLETE" ]          ; not active
-     *    SP "SYNTAX" SP numericoid  ; assertion syntax
-     *    extensions WSP RPAREN      ; extensions
-     * </pre>
-    */
-matchingRuleDescription returns [MutableMatchingRule matchingRule]
-    {
-        matchedProduction( "matchingRuleDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { matchingRule = new MutableMatchingRule(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); matchingRule.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); matchingRule.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); matchingRule.setObsolete( true ); } )
-        |
-        ( syntax:SYNTAX { et.track("SYNTAX", syntax); matchingRule.setSyntaxOid(numericoid(syntax.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            matchingRule.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {    
-            // semantic check: required elements
-            if( !et.contains("SYNTAX") ) {
-                throw new SemanticException( "SYNTAX is required", null, 0, 0 );
-            }
-        }
-    }
-    ;
-
-
-    /**
-     * Production for matching rule use descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * MatchingRuleUseDescription = LPAREN WSP
-     *    numericoid                 ; object identifier
-     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *    [ SP "DESC" SP qdstring ]  ; description
-     *    [ SP "OBSOLETE" ]          ; not active
-     *    SP "APPLIES" SP oids       ; attribute types
-     *    extensions WSP RPAREN      ; extensions
-     * </pre>
-    */
-matchingRuleUseDescription returns [MatchingRuleUse matchingRuleUse]
-    {
-        matchedProduction( "matchingRuleUseDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { matchingRuleUse = new MatchingRuleUse(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); matchingRuleUse.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); matchingRuleUse.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); matchingRuleUse.setObsolete( true ); } )
-        |
-        ( applies:APPLIES { et.track("APPLIES", applies); matchingRuleUse.setApplicableAttributeOids(oids(applies.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            matchingRuleUse.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("APPLIES") ) {
-                throw new SemanticException( "APPLIES is required", null, 0, 0 );
-            }
-        }
-    }
-    ;
-
-
-    /**
-     * Production for DIT content rule descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * DITContentRuleDescription = LPAREN WSP
-     *    numericoid                 ; object identifier
-     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *    [ SP "DESC" SP qdstring ]  ; description
-     *    [ SP "OBSOLETE" ]          ; not active
-     *    [ SP "AUX" SP oids ]       ; auxiliary object classes
-     *    [ SP "MUST" SP oids ]      ; attribute types
-     *    [ SP "MAY" SP oids ]       ; attribute types
-     *    [ SP "NOT" SP oids ]       ; attribute types
-     *    extensions WSP RPAREN      ; extensions
-     * </pre>
-    */
-ditContentRuleDescription returns [DitContentRule ditContentRule]
-    {
-        matchedProduction( "ditContentRuleDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { ditContentRule = new DitContentRule(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); ditContentRule.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); ditContentRule.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); ditContentRule.setObsolete( true ); } )
-        |
-        ( aux:AUX { et.track("AUX", aux); ditContentRule.setAuxObjectClassOids(oids(aux.getText())); } )
-        |
-        ( must:MUST { et.track("MUST", must); ditContentRule.setMustAttributeTypeOids(oids(must.getText())); } )
-        |
-        ( may:MAY { et.track("MAY", may); ditContentRule.setMayAttributeTypeOids(oids(may.getText())); } )
-        |
-        ( not:NOT { et.track("NOT", not); ditContentRule.setNotAttributeTypeOids(oids(not.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            ditContentRule.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    ;
-
-
-    /**
-     * Production for DIT structure rules descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * DITStructureRuleDescription = LPAREN WSP
-     *   ruleid                     ; rule identifier
-     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *   [ SP "DESC" SP qdstring ]  ; description
-     *   [ SP "OBSOLETE" ]          ; not active
-     *   SP "FORM" SP oid           ; NameForm
-     *   [ SP "SUP" ruleids ]       ; superior rules
-     *   extensions WSP RPAREN      ; extensions
-     *
-     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
-     * ruleidlist = ruleid *( SP ruleid )
-     * ruleid = number
-     * </pre>
-    */
-ditStructureRuleDescription returns [DitStructureRule ditStructureRule]
-    {
-        matchedProduction( "ditStructureRuleDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( ruleid:STARTNUMERICOID { ditStructureRule = new DitStructureRule(ruleid(ruleid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); ditStructureRule.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); ditStructureRule.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); ditStructureRule.setObsolete( true ); } )
-        |
-        ( form:FORM { et.track("FORM", form); ditStructureRule.setForm(oid(form.getText())); } )
-        |
-        ( sup:SUP { et.track("SUP", sup); ditStructureRule.setSuperRules(ruleids(sup.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            ditStructureRule.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("FORM") ) {
-                throw new SemanticException( "FORM is required", null, 0, 0 );
-            }
-        }
-    }
-    ;
-
-
-    /**
-     * Production for name form descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * NameFormDescription = LPAREN WSP
-     *    numericoid                 ; object identifier
-     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *    [ SP "DESC" SP qdstring ]  ; description
-     *    [ SP "OBSOLETE" ]          ; not active
-     *    SP "OC" SP oid             ; structural object class
-     *    SP "MUST" SP oids          ; attribute types
-     *    [ SP "MAY" SP oids ]       ; attribute types
-     *    extensions WSP RPAREN      ; extensions
-     * </pre>
-    */
-nameFormDescription returns [NameForm nameForm]
-    {
-        matchedProduction( "nameFormDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { nameForm = new NameForm(numericoid(oid.getText())); } )
-    (
-        ( name:NAME { et.track("NAME", name); nameForm.setNames(qdescrs(name.getText())); } )
-        |
-        ( desc:DESC { et.track("DESC", desc); nameForm.setDescription(qdstring(desc.getText())); } )
-        |
-        ( obsolete:OBSOLETE { et.track("OBSOLETE", obsolete); nameForm.setObsolete( true ); } )
-        |
-        ( oc:OC { et.track("OC", oc); nameForm.setStructuralObjectClassOid(oid(oc.getText())); } )
-        |
-        ( must:MUST { et.track("MUST", must); nameForm.setMustAttributeTypeOids(oids(must.getText())); } )
-        |
-        ( may:MAY { et.track("MAY", may); nameForm.setMayAttributeTypeOids(oids(may.getText())); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            nameForm.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("MUST") ) {
-                throw new SemanticException( "MUST is required", null, 0, 0 );
-            }
-            if( !et.contains("OC") ) {
-                throw new SemanticException( "OC is required", null, 0, 0 );
-            }
-        
-            // semantic check: MUST and MAY must be disjoint
-            //List<String> aList = new ArrayList<String>( nfd.getMustAttributeTypes() );
-            //aList.retainAll( nfd.getMayAttributeTypes() );
-            //if( !aList.isEmpty() ) 
-            //{
-            //    throw new SemanticException( "MUST and MAY must be disjoint, "+aList.get( 0 )+" appears in both", null, 0, 0 );
-            //}
-        }
-    }
-    ;
-    
-
-    /**
-     * Production for comparator descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * LdapComparator = LPAREN WSP
-     *       numericoid                           ; object identifier
-     *       [ SP "DESC" SP qdstring ]            ; description
-     *       SP "FQCN" SP fqcn                    ; fully qualified class name
-     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
-     *       extensions WSP RPAREN                ; extensions
-     * 
-     * base64          = *(4base64-char)
-     * base64-char     = ALPHA / DIGIT / "+" / "/"
-     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
-     * fqcnComponent = ???
-     * </pre>
-    */
-ldapComparator returns [LdapComparatorDescription lcd]
-    {
-        matchedProduction( "ldapComparator()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { lcd = new LdapComparatorDescription(numericoid(oid.getText())); } )
-    (
-        ( desc:DESC { et.track("DESC", desc); lcd.setDescription(qdstring(desc.getText())); } )
-        |
-        ( fqcn:FQCN { et.track("FQCN", fqcn); lcd.setFqcn(fqcn.getText()); } )
-        |
-        ( bytecode:BYTECODE { et.track("BYTECODE", bytecode); lcd.setBytecode(bytecode.getText()); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            lcd.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("FQCN") ) {
-                throw new SemanticException( "FQCN is required", null, 0, 0 );
-            }
-        
-            // semantic check: length should be divisible by 4
-            if( ( lcd.getBytecode() != null ) && ( lcd.getBytecode().length() % 4 != 0 ) ) {
-                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
-            }
-        }
-    }
-    ;
-    
-
-    /**
-     * Production for normalizer descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * NormalizerDescription = LPAREN WSP
-     *       numericoid                           ; object identifier
-     *       [ SP "DESC" SP qdstring ]            ; description
-     *       SP "FQCN" SP fqcn                    ; fully qualified class name
-     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
-     *       extensions WSP RPAREN                ; extensions
-     * 
-     * base64          = *(4base64-char)
-     * base64-char     = ALPHA / DIGIT / "+" / "/"
-     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
-     * fqcnComponent = ???
-     * </pre>
-    */
-normalizerDescription returns [NormalizerDescription nd]
-    {
-        matchedProduction( "normalizerDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { nd = new NormalizerDescription(numericoid(oid.getText())); } )
-    (
-        ( desc:DESC { et.track("DESC", desc); nd.setDescription(qdstring(desc.getText())); } )
-        |
-        ( fqcn:FQCN { et.track("FQCN", fqcn); nd.setFqcn(fqcn.getText()); } )
-        |
-        ( bytecode:BYTECODE { et.track("BYTECODE", bytecode); nd.setBytecode(bytecode.getText()); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            nd.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("FQCN") ) {
-                throw new SemanticException( "FQCN is required", null, 0, 0 );
-            }
-        
-            // semantic check: length should be divisible by 4
-            if( nd.getBytecode() != null && ( nd.getBytecode().length() % 4 != 0 ) ) {
-                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
-            }     
-        }   
-    }
-    ;
-    
-
-    /**
-     * Production for syntax checker descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * SyntaxCheckerDescription = LPAREN WSP
-     *       numericoid                           ; object identifier
-     *       [ SP "DESC" SP qdstring ]            ; description
-     *       SP "FQCN" SP fqcn                    ; fully qualified class name
-     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
-     *       extensions WSP RPAREN                ; extensions
-     * 
-     * base64          = *(4base64-char)
-     * base64-char     = ALPHA / DIGIT / "+" / "/"
-     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
-     * fqcnComponent = ???
-     * </pre>
-    */
-syntaxCheckerDescription returns [SyntaxCheckerDescription scd]
-    {
-        matchedProduction( "syntaxCheckerDescription()" );
-        ElementTracker et = new ElementTracker();
-    }
-    :
-    ( oid:STARTNUMERICOID { scd = new SyntaxCheckerDescription(numericoid(oid.getText())); } )
-    (
-        ( desc:DESC { et.track("DESC", desc); scd.setDescription(qdstring(desc.getText())); } )
-        |
-        ( fqcn:FQCN { et.track("FQCN", fqcn); scd.setFqcn(fqcn.getText()); } )
-        |
-        ( bytecode:BYTECODE { et.track("BYTECODE", bytecode); scd.setBytecode(bytecode.getText()); } )
-        |
-        ( extension:EXTENSION { 
-            Extension ex = extension(extension.getText());
-            et.track(ex.key, extension); 
-            scd.addExtension(ex.key, ex.values); 
-         } )
-    )*
-    RPAR
-    {
-        if( !isQuirksModeEnabled )
-        {
-            // semantic check: required elements
-            if( !et.contains("FQCN") ) {
-                throw new SemanticException( "FQCN is required", null, 0, 0 );
-            }
-        
-            // semantic check: length should be divisible by 4
-            if( scd.getBytecode() != null && ( scd.getBytecode().length() % 4 != 0 ) ) {
-                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
-            }  
-        }      
-    }
-    ;
-    
-
-
-
-noidlen [String s] returns [NoidLen noidlen]
-    {
-        matchedProduction( "noidlen()" );
-        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-        parser.setParserMonitor(monitor);
-        noidlen = isQuirksModeEnabled ? parser.quirksNoidlen() : parser.noidlen();
-    }
-    :
-    ;
-
-
-extension [String s] returns [Extension extension]
-    {
-        matchedProduction( "extension()" );
-        AntlrSchemaExtensionLexer lexer = new AntlrSchemaExtensionLexer(new StringReader(s));
-        AntlrSchemaExtensionParser parser = new AntlrSchemaExtensionParser(lexer);
-        extension = parser.extension();
-    }
-    :
-    ;
-
-
-numericoid [String s] returns [String numericoid]
-    {
-        matchedProduction( "numericoid()");
-        if(isQuirksModeEnabled)
-        {
-             numericoid = oid(s);
-        }
-        else
-        {
-	        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-	        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-	        parser.setParserMonitor(monitor);
-	        numericoid = parser.numericoid();
-        }
-    }
-    :
-    ;
-
-oid [String s] returns [String oid]
-    {
-        matchedProduction( "oid()" );
-        List<String> oids = oids(s);
-        if( oids.size() != 1 ) 
-        {
-            throw new SemanticException( "Exactly one OID expected", null, 0, 0 );
-        }
-        oid = oids.get(0);
-    }
-    :
-    ;
-
-oids [String s] returns [List<String> oids]
-    {
-        matchedProduction( "oids()" );
-        if(isQuirksModeEnabled)
-        {
-             oids = qdescrs(s);
-        }
-        else
-        {
-	        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-	        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-	        parser.setParserMonitor(monitor);
-	        oids = parser.oids();
-	    }
-    }
-    :
-    ;
-
-qdescr [String s] returns [String qdescr]
-    {
-        matchedProduction( "qdescr()" );
-        List<String> qdescrs = qdescrs(s);
-        if( qdescrs.size() != 1 ) 
-        {
-            throw new SemanticException( "Exactly one qdescrs expected", null, 0, 0 );
-        }
-        qdescr = qdescrs.get(0);
-    }
-    :
-    ;
-
-qdescrs [String s] returns [List<String> qdescrs]
-    {
-        matchedProduction( "qdescrs()" );
-        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-        parser.setParserMonitor(monitor);
-        qdescrs = isQuirksModeEnabled ? parser.quirksQdescrs() : parser.qdescrs();
-    }
-    :
-    ;
-
-qdstring [String s] returns [String qdstring]
-    {
-        matchedProduction( "qdstring()" );
-        List<String> qdstrings = qdstrings(s);
-        if( qdstrings.size() != 1 ) 
-        {
-            throw new SemanticException( "Exactly one qdstrings expected", null, 0, 0 );
-        }
-        qdstring = qdstrings.get(0);
-    }
-    :
-    ;
-
-qdstrings [String s] returns [List<String> qdstrings]
-    {
-        matchedProduction( "qdstrings()" );
-        AntlrSchemaQdstringLexer lexer = new AntlrSchemaQdstringLexer(new StringReader(s));
-        AntlrSchemaQdstringParser parser = new AntlrSchemaQdstringParser(lexer);
-        parser.setParserMonitor(monitor);
-        qdstrings = parser.qdstrings();
-    }
-    :
-    ;
-
-ruleid [String s] returns [Integer ruleid]
-    {
-        matchedProduction( "ruleid()" );
-        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-        parser.setParserMonitor(monitor);
-        ruleid = parser.ruleid();
-    }
-    :
-    ;
-
-ruleids [String s] returns [List<Integer> ruleids]
-    {
-        matchedProduction( "ruleids()" );
-        AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
-        AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
-        parser.setParserMonitor(monitor);
-        ruleids = parser.ruleids();
-    }
-    :
-    ;
-
-
-    
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AbstractSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AbstractSchemaParser.java
index 7764652..8c082e5 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AbstractSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AbstractSchemaParser.java
@@ -20,21 +20,18 @@
 package org.apache.directory.api.ldap.model.schema.parsers;
 
 
-import java.io.StringReader;
 import java.text.ParseException;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.constants.MetaSchemaConstants;
 import org.apache.directory.api.ldap.model.schema.SchemaObject;
+import org.apache.directory.api.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
 import org.apache.directory.api.util.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-import antlr.TokenStreamRecognitionException;
-
 
 /**
  * Base class of all schema parsers.
@@ -48,28 +45,12 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
     /** The LoggerFactory used by this class */
     protected static final Logger LOG = LoggerFactory.getLogger( AbstractSchemaParser.class );
 
-    /** the monitor to use for this parser */
-    protected ParserMonitor monitor = new ParserMonitorAdapter();
-
-    /** the antlr generated parser being wrapped */
-    protected ReusableAntlrSchemaParser parser;
-
-    /** the antlr generated lexer being wrapped */
-    protected ReusableAntlrSchemaLexer lexer;
-
-    /** the schema object sub-type */
-    private Class<T> schemaObjectType;
+    /** The fast schemaObject parser */
+    protected OpenLdapSchemaParser fastParser;
 
     /** error code used when schema descritpion is null */
     private I18n errorCodeOnNull;
 
-    /** error code used on parse error when position is known */
-    private I18n errorCodeOnParseExceptionWithPosition;
-
-    /** error code used on parse error when position is unknown */
-    private I18n errorCodeOnParseException;
-
-
     /**
      * Instantiates a new abstract schema parser.
      * 
@@ -82,40 +63,11 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
         I18n errorCodeOnParseExceptionWithPosition,
         I18n errorCodeOnParseException )
     {
-        this.schemaObjectType = schemaObjectType;
         this.errorCodeOnNull = errorCodeOnNull;
-        this.errorCodeOnParseExceptionWithPosition = errorCodeOnParseExceptionWithPosition;
-        this.errorCodeOnParseException = errorCodeOnParseException;
-        lexer = new ReusableAntlrSchemaLexer( new StringReader( "" ) );
-        parser = new ReusableAntlrSchemaParser( lexer );
-    }
-
-
-    /**
-     * Initializes the plumbing by creating a pipe and coupling the parser/lexer
-     * pair with it. param spec the specification to be parsed
-     *
-     * @param spec the spec
-     */
-    protected void reset( String spec )
-    {
-        StringReader in = new StringReader( spec );
-        lexer.prepareNextInput( in );
-        parser.resetState();
+        fastParser = new OpenLdapSchemaParser();
     }
 
 
-    /**
-     * Sets the parser monitor.
-     * 
-     * @param parserMonitor the new parser monitor
-     */
-    public void setParserMonitor( ParserMonitor parserMonitor )
-    {
-        this.monitor = parserMonitor;
-        parser.setParserMonitor( parserMonitor );
-    }
-
 
     /**
      * Sets the quirks mode. 
@@ -127,7 +79,7 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
      */
     public void setQuirksMode( boolean enabled )
     {
-        parser.setQuirksMode( enabled );
+        fastParser.setQuirksMode( enabled );
     }
 
 
@@ -138,7 +90,7 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
      */
     public boolean isQuirksMode()
     {
-        return parser.isQuirksMode();
+        return fastParser.isQuirksMode();
     }
 
 
@@ -149,83 +101,7 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
      * @return A SchemaObject instance
      * @throws ParseException If the parsing failed
      */
-    public synchronized T parse( String schemaDescription ) throws ParseException
-    {
-        if ( LOG.isDebugEnabled() )
-        {
-            LOG.debug( I18n.msg( I18n.MSG_13718_PARSING_A, schemaObjectType.getClass().getSimpleName(), schemaDescription ) );
-        }
-
-        if ( schemaDescription == null )
-        {
-            LOG.error( I18n.err( errorCodeOnNull ) );
-            throw new ParseException( I18n.err( I18n.ERR_13714_NULL ), 0 );
-        }
-
-        // reset and initialize the parser / lexer pair
-        reset( schemaDescription );
-
-        try
-        {
-            T schemaObject = doParse();
-            schemaObject.setSpecification( schemaDescription );
-
-            // Update the schemaName
-            updateSchemaName( schemaObject );
-
-            return schemaObject;
-        }
-        catch ( RecognitionException re )
-        {
-            throw wrapRecognitionException( schemaDescription, re );
-        }
-        catch ( TokenStreamRecognitionException tsre )
-        {
-            if ( tsre.recog != null )
-            {
-                throw wrapRecognitionException( schemaDescription, tsre.recog );
-            }
-            else
-            {
-                throw wrapTokenStreamException( schemaDescription, tsre );
-            }
-        }
-        catch ( TokenStreamException tse )
-        {
-            throw wrapTokenStreamException( schemaDescription, tse );
-        }
-    }
-
-
-    private ParseException wrapRecognitionException( String schemaDescription, RecognitionException re )
-    {
-        String msg = I18n.err( errorCodeOnParseExceptionWithPosition, schemaDescription, re.getMessage(),
-            re.getColumn() );
-        LOG.error( msg );
-        ParseException parseException = new ParseException( msg, re.getColumn() );
-        parseException.initCause( re );
-        return parseException;
-    }
-
-
-    private ParseException wrapTokenStreamException( String schemaDescription, TokenStreamException tse )
-    {
-        String msg = I18n.err( errorCodeOnParseException, schemaDescription, tse.getMessage() );
-        LOG.error( msg );
-        ParseException parseException = new ParseException( msg, 0 );
-        parseException.initCause( tse );
-        return parseException;
-    }
-
-
-    /**
-     * Parse a SchemaObject description and returns back an instance of SchemaObject.
-     * 
-     * @return A SchemaObject instance
-     * @throws RecognitionException the native antlr exception
-     * @throws TokenStreamException the native antlr exception
-     */
-    protected abstract T doParse() throws RecognitionException, TokenStreamException;
+    public abstract T parse( String schemaDescription ) throws ParseException;
 
 
     /**
@@ -234,7 +110,7 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
      *
      * @param schemaObject the schema object where the name should be updated
      */
-    private void updateSchemaName( SchemaObject schemaObject )
+    protected void updateSchemaName( SchemaObject schemaObject )
     {
         // Update the Schema if we have the X-SCHEMA extension
         List<String> schemaExtension = schemaObject.getExtension( MetaSchemaConstants.X_SCHEMA_AT );
@@ -257,4 +133,15 @@ public abstract class AbstractSchemaParser<T extends SchemaObject>
             schemaObject.setSchemaName( MetaSchemaConstants.SCHEMA_OTHER );
         }
     }
+    
+    
+    /**
+     * Get the defined macros.
+     * 
+     * @return The map of defined macros
+     */
+    public Map<String, OpenLdapObjectIdentifierMacro> getObjectIdentifiers()
+    {
+        return fastParser.getObjectIdentifierMacros();
+    }
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AttributeTypeDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AttributeTypeDescriptionSchemaParser.java
index 1250f96..281545e 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AttributeTypeDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/AttributeTypeDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 attribute type descriptions.
@@ -36,7 +33,6 @@ import antlr.TokenStreamException;
  */
 public class AttributeTypeDescriptionSchemaParser extends AbstractSchemaParser<AttributeType>
 {
-
     /**
      * Creates a schema parser instance.
      */
@@ -80,19 +76,14 @@ public class AttributeTypeDescriptionSchemaParser extends AbstractSchemaParser<A
      * @return the parsed AttributeTypeDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public AttributeType parseAttributeTypeDescription( String attributeTypeDescription ) throws ParseException
+    public AttributeType parse( String attributeTypeDescription ) throws ParseException
     {
-        return super.parse( attributeTypeDescription );
-    }
+        AttributeType attributeType = fastParser.parseAttributeType( attributeTypeDescription );
+        attributeType.setSpecification( attributeTypeDescription );
 
+        // Update the schemaName
+        updateSchemaName( attributeType );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected AttributeType doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.attributeTypeDescription();
+        return attributeType;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ConsoleParserMonitor.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ConsoleParserMonitor.java
deleted file mode 100644
index 2351aa1..0000000
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ConsoleParserMonitor.java
+++ /dev/null
@@ -1,72 +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.model.schema.parsers;
-
-
-/**
- * A console reporting monitor.  Add system property 'maven.eve.schema.parser.trace'
- * to get this monitor to trace parser production execution.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class ConsoleParserMonitor implements ParserMonitor
-{
-    /** The maven property to add on the commmand line */
-    public static final String TRACE_KEY = "maven.eve.schema.parser.trace";
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void matchedProduction( String prod )
-    {
-        if ( System.getProperties().containsKey( TRACE_KEY ) )
-        {
-            System.out.println( prod );
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void startedParse( String s )
-    {
-        if ( System.getProperties().containsKey( TRACE_KEY ) )
-        {
-            System.out.println( s );
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void finishedParse( String s )
-    {
-        if ( System.getProperties().containsKey( TRACE_KEY ) )
-        {
-            System.out.println( s );
-        }
-    }
-}
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitContentRuleDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitContentRuleDescriptionSchemaParser.java
index 3635130..59287a0 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitContentRuleDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitContentRuleDescriptionSchemaParser.java
@@ -25,10 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.DitContentRule;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
-
 /**
  * A parser for RFC 4512 DIT content rule descriptions.
  * 
@@ -66,19 +62,14 @@ public class DitContentRuleDescriptionSchemaParser extends AbstractSchemaParser<
      * @return the parsed DITContentRuleDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public DitContentRule parseDITContentRuleDescription( String ditContentRuleDescription ) throws ParseException
+    public DitContentRule parse( String ditContentRuleDescription ) throws ParseException
     {
-        return super.parse( ditContentRuleDescription );
-    }
+        DitContentRule ditContentRule = fastParser.parseDitContentRule( ditContentRuleDescription );
+        ditContentRule.setSpecification( ditContentRuleDescription );
 
+        // Update the schemaName
+        updateSchemaName( ditContentRule );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected DitContentRule doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.ditContentRuleDescription();
+        return ditContentRule;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitStructureRuleDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitStructureRuleDescriptionSchemaParser.java
index 806d663..891eeb5 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitStructureRuleDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/DitStructureRuleDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.DitStructureRule;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 DIT structure rule descriptions.
@@ -68,20 +65,14 @@ public class DitStructureRuleDescriptionSchemaParser extends AbstractSchemaParse
      * @return the parsed DITStructureRuleDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public DitStructureRule parseDITStructureRuleDescription( String ditStructureRuleDescription )
-        throws ParseException
+    public DitStructureRule parse( String ditStructureRuleDescription ) throws ParseException
     {
-        return super.parse( ditStructureRuleDescription );
-
-    }
+        DitStructureRule ditStructureRule = fastParser.parseDitStructureRule( ditStructureRuleDescription );
+        ditStructureRule.setSpecification( ditStructureRuleDescription );
 
+        // Update the schemaName
+        updateSchemaName( ditStructureRule );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected DitStructureRule doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.ditStructureRuleDescription();
+        return ditStructureRule;
     }
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java
deleted file mode 100644
index 12ae6cc..0000000
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/FastOpenLdapSchemaParser.java
+++ /dev/null
@@ -1,2266 +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.model.schema.parsers;
-
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.directory.api.i18n.I18n;
-import org.apache.directory.api.ldap.model.exception.LdapSchemaException;
-import org.apache.directory.api.ldap.model.ldif.LdapLdifException;
-import org.apache.directory.api.ldap.model.schema.AttributeType;
-import org.apache.directory.api.ldap.model.schema.MutableAttributeType;
-import org.apache.directory.api.ldap.model.schema.MutableObjectClass;
-import org.apache.directory.api.ldap.model.schema.ObjectClass;
-import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
-import org.apache.directory.api.ldap.model.schema.SchemaObject;
-import org.apache.directory.api.ldap.model.schema.UsageEnum;
-import org.apache.directory.api.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
-import org.apache.directory.api.util.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A reusable wrapper for hand parser OpenLDAP schema.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class FastOpenLdapSchemaParser
-{
-    /** The LoggerFactory used by this class */
-    protected static final Logger LOG = LoggerFactory.getLogger( FastOpenLdapSchemaParser.class );
-
-    /** the monitor to use for this parser */
-    protected ParserMonitor monitor = new ParserMonitorAdapter();
-
-    /** A flag used to tell the parser if it should be strict or not */
-    private boolean isQuirksModeEnabled = false;
-
-    /** the number of the current line being parsed by the reader */
-    protected int lineNumber;
-
-    /** The list of parsed schema descriptions */
-    private List<Object> schemaDescriptions = new ArrayList<>();
-
-    /** The list of attribute type, initialized by splitParsedSchemaDescriptions() */
-    private List<MutableAttributeType> attributeTypes;
-
-    /** The list of object classes, initialized by splitParsedSchemaDescriptions()*/
-    private List<ObjectClass> objectClasses;
-
-    /** The map of object identifier macros, initialized by splitParsedSchemaDescriptions()*/
-    private Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros = new HashMap<>();
-
-    /** Flag whether object identifier macros should be resolved. */
-    private boolean isResolveObjectIdentifierMacros;
-    
-    private static final boolean QUOTED = true;
-    private static final boolean UN_QUOTED = false;
-    
-    
-    private class Extension
-    {
-        /** The extension key */
-        String key;
-        
-        /** The extension values */
-        List<String> values = new ArrayList<>();
-        
-        /**
-         * {@inheritDoc} 
-         */
-        @Override
-        public String toString()
-        {
-            StringBuilder sb = new StringBuilder();
-            
-            sb.append( key );
-            
-            if ( values.size() > 1 )
-            {
-                boolean isFirst = true;
-                sb.append( "( " );
-                
-                for ( String value : values )
-                {
-                    if ( isFirst )
-                    {
-                        isFirst = false;
-                    }
-                    else
-                    {
-                        sb.append( ' ' );
-                    }
-                    
-                    sb.append( '\'' ) .append( value ).append( '\'' );
-                }
-
-                sb.append( " )" );
-            }
-            else
-            {
-                sb.append( ' ' ).append( '\'' ) .append( values.get( 0 ) ).append( '\'' );
-            }
-            
-            return sb.toString();
-        }
-    }
-    
-    private class NoidLen
-    {
-        /** The syntax OID */
-        String noid;
-        
-        /** The syntax length */
-        long len = 0;
-        
-        /**
-         * {@inheritDoc} 
-         */
-        @Override
-        public String toString()
-        {
-            if ( len > 0 )
-            {
-                return noid + '{' + len + '}';
-            }
-            else
-            {
-                return noid;
-            }
-        }
-    }
-    
-    
-    private class PosSchema
-    {
-        /** The line number in the file */
-        int lineNumber;
-        
-        /** The position in the current line */
-        int start;
-        
-        /** The line being processed */
-        String line;
-        
-        /**
-         * {@inheritDoc} 
-         */
-        @Override
-        public String toString()
-        {
-            if ( line == null )
-            {
-                return "null";
-            }
-            else if ( line.length() < start )
-            {
-                return "EOL";
-            }
-            else
-            {
-                return line.substring( start ); 
-            }
-        }
-    }
-
-    
-    /**
-     * The list of AttributeTypeDescription elements that can be seen 
-     */
-    private enum AttributeTypeElements
-    {
-        NAME(1),
-        DESC(2),
-        OBSOLETE(4),
-        SUP(8),
-        EQUALITY(16),
-        ORDERING(32),
-        SUBSTR(64),
-        SYNTAX(128),
-        SINGLE_VALUE(256),
-        COLLECTIVE(512),
-        NO_USER_MODIFICATION(1024),
-        USAGE(2048);
-        
-        private int value;
-        
-        AttributeTypeElements( int value )
-        {
-            this.value = value;
-        }
-    }
-
-    
-    /**
-     * The list of ObjectClassDescription elements that can be seen 
-     */
-    private enum ObjectClassElements
-    {
-        NAME(1),
-        DESC(2),
-        OBSOLETE(4),
-        SUP(8),
-        MUST(16),
-        MAY(32),
-        ABSTRACT(64),
-        STRUCTURAL(64),
-        AUXILIARY(64);
-        
-        private int value;
-        
-        ObjectClassElements( int value )
-        {
-            this.value = value;
-        }
-    }
-
-    /**
-     * Creates a reusable instance of an OpenLdapSchemaParser.
-     *
-     * @throws IOException if the pipe cannot be formed
-     */
-    public FastOpenLdapSchemaParser() throws IOException
-    {
-        isResolveObjectIdentifierMacros = true;
-        isQuirksModeEnabled = true;
-    }
-
-
-    /**
-     * Reset the parser
-     */
-    public void clear()
-    {
-        if ( attributeTypes != null )
-        {
-            attributeTypes.clear();
-        }
-        
-        if ( objectClasses != null )
-        {
-            objectClasses.clear();
-        }
-        
-        if ( schemaDescriptions != null )
-        {
-            schemaDescriptions.clear();
-        }
-    
-        if ( objectIdentifierMacros != null )
-        {
-            objectIdentifierMacros.clear();
-        }
-    }
-
-
-    /**
-     * Gets the attribute types.
-     * 
-     * @return the attribute types
-     */
-    public List<MutableAttributeType> getAttributeTypes()
-    {
-        return attributeTypes;
-    }
-
-
-    /**
-     * Gets the object class types.
-     * 
-     * @return the object class types
-     */
-    public List<ObjectClass> getObjectClassTypes()
-    {
-        return objectClasses;
-    }
-
-
-    /**
-     * Gets the object identifier macros.
-     * 
-     * @return the object identifier macros
-     */
-    public Map<String, OpenLdapObjectIdentifierMacro> getObjectIdentifierMacros()
-    {
-        return objectIdentifierMacros;
-    }
-
-
-    /**
-     * Splits parsed schema descriptions and resolved
-     * object identifier macros.
-     * 
-     * @throws ParseException the parse exception
-     */
-    private void afterParse() throws ParseException
-    {
-        objectClasses = new ArrayList<>();
-        attributeTypes = new ArrayList<>();
-
-        // split parsed schema descriptions
-        for ( Object obj : schemaDescriptions )
-        {
-            if ( obj instanceof OpenLdapObjectIdentifierMacro )
-            {
-                OpenLdapObjectIdentifierMacro oid = ( OpenLdapObjectIdentifierMacro ) obj;
-                objectIdentifierMacros.put( oid.getName(), oid );
-            }
-            else if ( obj instanceof AttributeType )
-            {
-                MutableAttributeType attributeType = ( MutableAttributeType ) obj;
-
-                attributeTypes.add( attributeType );
-            }
-            else if ( obj instanceof ObjectClass )
-            {
-                ObjectClass objectClass = ( ObjectClass ) obj;
-
-                objectClasses.add( objectClass );
-            }
-        }
-
-        if ( isResolveObjectIdentifierMacros() )
-        {
-            // resolve object identifier macros
-            for ( OpenLdapObjectIdentifierMacro oid : objectIdentifierMacros.values() )
-            {
-                resolveObjectIdentifierMacro( oid );
-            }
-
-            // apply object identifier macros to object classes
-            for ( ObjectClass objectClass : objectClasses )
-            {
-                objectClass.setOid( getResolveOid( objectClass.getOid() ) );
-            }
-
-            // apply object identifier macros to attribute types
-            for ( MutableAttributeType attributeType : attributeTypes )
-            {
-                attributeType.setOid( getResolveOid( attributeType.getOid() ) );
-                attributeType.setSyntaxOid( getResolveOid( attributeType.getSyntaxOid() ) );
-            }
-
-        }
-    }
-
-
-    private String getResolveOid( String oid )
-    {
-        if ( oid != null && oid.indexOf( ':' ) != -1 )
-        {
-            // resolve OID
-            String[] nameAndSuffix = oid.split( ":" );
-            
-            if ( objectIdentifierMacros.containsKey( nameAndSuffix[0] ) )
-            {
-                OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( nameAndSuffix[0] );
-                
-                return macro.getResolvedOid() + "." + nameAndSuffix[1];
-            }
-        }
-        
-        return oid;
-    }
-
-
-    private void resolveObjectIdentifierMacro( OpenLdapObjectIdentifierMacro macro ) throws ParseException
-    {
-        String rawOidOrNameSuffix = macro.getRawOidOrNameSuffix();
-
-        if ( macro.isResolved() )
-        {
-            // finished
-            return;
-        }
-        else if ( rawOidOrNameSuffix.indexOf( ':' ) != -1 )
-        {
-            // resolve OID
-            String[] nameAndSuffix = rawOidOrNameSuffix.split( ":" );
-            
-            if ( objectIdentifierMacros.containsKey( nameAndSuffix[0] ) )
-            {
-                OpenLdapObjectIdentifierMacro parentMacro = objectIdentifierMacros.get( nameAndSuffix[0] );
-                resolveObjectIdentifierMacro( parentMacro );
-                macro.setResolvedOid( parentMacro.getResolvedOid() + "." + nameAndSuffix[1] );
-            }
-            else
-            {
-                throw new ParseException( I18n.err( I18n.ERR_13726_NO_OBJECT_IDENTIFIER_MACRO, nameAndSuffix[0] ), 0 );
-            }
-
-        }
-        else
-        {
-            // no :suffix,
-            if ( objectIdentifierMacros.containsKey( rawOidOrNameSuffix ) )
-            {
-                OpenLdapObjectIdentifierMacro parentMacro = objectIdentifierMacros.get( rawOidOrNameSuffix );
-                resolveObjectIdentifierMacro( parentMacro );
-                macro.setResolvedOid( parentMacro.getResolvedOid() );
-            }
-            else
-            {
-                macro.setResolvedOid( rawOidOrNameSuffix );
-            }
-        }
-    }
-
-
-    /**
-     * Parses an OpenLDAP schemaObject element/object.
-     *
-     * @param schemaObject the String image of a complete schema object
-     * @return the schema object
-     * @throws ParseException If the schemaObject can't be parsed
-     */
-    public SchemaObject parse( String schemaObject ) throws ParseException
-    {
-        if ( ( schemaObject == null ) || Strings.isEmpty( schemaObject.trim() ) )
-        {
-            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
-        }
-        
-        try ( Reader reader = new BufferedReader( new StringReader( schemaObject ) ) )
-        {
-            parse( reader );
-            afterParse();
-        }
-        catch ( IOException | LdapSchemaException e )
-        {
-            throw new ParseException( e.getMessage(), 0 );
-        }
-
-        if ( !schemaDescriptions.isEmpty() )
-        {
-            for ( Object obj : schemaDescriptions )
-            {
-                if ( obj instanceof SchemaObject )
-                {
-                    return ( SchemaObject ) obj;
-                }
-            }
-        }
-        
-        return null;
-    }
-
-
-    /**
-     * Parses a stream of OpenLDAP schemaObject elements/objects. Default charset is used.
-     *
-     * @param schemaIn a stream of schema objects
-     * @throws Exception 
-     */
-    public void parse( InputStream schemaIn ) throws Exception
-    {
-        try ( InputStreamReader in = new InputStreamReader( schemaIn, Charset.defaultCharset() ) )
-        {
-            try ( Reader reader = new BufferedReader( in ) )
-            {
-                parse( reader );
-                afterParse();
-            }
-        }
-    }
-    
-    
-    private void skipWhites( Reader reader, PosSchema pos, boolean mandatory ) throws IOException, LdapSchemaException
-    {
-        boolean hasSpace = false;
-        
-        while ( true )
-        {
-            if ( isEmpty( pos ) )
-            {
-                getLine( reader, pos );
-                
-                if ( pos.line == null )
-                {
-                    return;
-                }
-                
-                hasSpace = true;
-                continue;
-            }
-            
-            if ( pos.line == null )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13782_END_OF_FILE, pos.lineNumber, pos.start ) );
-            }
-            
-            while ( Character.isWhitespace( pos.line.charAt( pos.start ) ) )
-            {
-                hasSpace = true;
-                pos.start++;
-                
-                if ( isEmpty( pos ) )
-                {
-                    getLine( reader, pos );
-
-                    if ( pos.line == null )
-                    {
-                        return;
-                    }
-                    
-                    continue;
-                }
-            }
-            
-            if ( pos.line.charAt( pos.start ) == '#' )
-            {
-                getLine( reader, pos );
-
-                if ( pos.line == null )
-                {
-                    return;
-                }
-                
-                hasSpace = true;
-                continue;
-            }
-            else
-            {
-                if ( mandatory && !hasSpace )
-                {
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13783_SPACE_EXPECTED, pos.lineNumber, pos.start ) );
-                }
-                else
-                {
-                    return;
-                }
-            }
-        }
-    }
-    
-    
-    private boolean isComment( PosSchema pos )
-    {
-        if ( isEmpty( pos ) )
-        {
-            return true;
-        }
-        
-        return pos.line.charAt( pos.start ) == '#';
-    }
-    
-    
-    private boolean isEmpty( PosSchema pos )
-    {
-        return ( pos.line == null ) || ( pos.start >= pos.line.length() );
-    }
-    
-    
-    private boolean startsWith( PosSchema pos, String text )
-    {
-        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < text.length() ) )
-        {
-            return false;
-        }
-        
-        return text.equalsIgnoreCase( pos.line.substring( pos.start, pos.start + text.length() ) );
-    }
-    
-    
-    private boolean startsWith( Reader reader, PosSchema pos, char c ) throws IOException, LdapSchemaException
-    {
-        return startsWith( reader, pos, c, UN_QUOTED );
-    }
-    
-    
-    private boolean startsWith( Reader reader, PosSchema pos, char c, boolean quoted ) throws IOException, LdapSchemaException
-    {
-        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
-        {
-            return false;
-        }
-        
-        if ( quoted )
-        {
-            // Don't read a new line when we are within quotes
-            return pos.line.charAt( pos.start ) == c;
-        }
-
-        while ( isEmpty( pos ) || ( isComment( pos ) ) )
-        {
-            getLine( reader, pos );
-            
-            if ( pos.line == null )
-            {
-                return false;
-            }
-            
-            skipWhites( reader, pos, false );
-            
-            if ( isComment( pos ) )
-            {
-                continue;
-            }
-        }
-        
-        return pos.line.charAt( pos.start ) == c;
-    }
-    
-    
-    private boolean isAlpha( PosSchema pos )
-    {
-        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
-        {
-            return false;
-        }
-        
-        return Character.isAlphabetic( pos.line.charAt( pos.start ) );
-    }
-    
-    
-    private boolean isDigit( PosSchema pos )
-    {
-        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
-        {
-            return false;
-        }
-        
-        return Character.isDigit( pos.line.charAt( pos.start ) );
-    }
-
-    
-    private void getLine( Reader reader, PosSchema pos ) throws IOException
-    {
-        pos.line = ( ( BufferedReader ) reader ).readLine();
-        pos.start = 0;
-        
-        if ( pos.line != null )
-        {
-            pos.lineNumber++;
-        }
-    }
-    
-    
-    /**
-     * numericoid   ::= number ( DOT number )+ |
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * DOT          ::= %x2E                ; period (".")
-     */
-    private String getNumericOid( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        boolean isDot = true;
-        int start = pos.start;
-        int numberStart = start;
-        boolean firstIsZero = false;
-        boolean isFirstDigit = true;
-        
-        while ( true )
-        {
-            if ( isDigit( pos ) )
-            {
-                if ( firstIsZero )
-                {
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13784_BAD_OID_TWO_ZEROES, pos.lineNumber, pos.start ) );
-                }
-                    
-                if ( ( pos.line.charAt( pos.start ) == '0' ) && isFirstDigit )
-                {
-                    firstIsZero = true;
-                }
-                
-                isDot = false;
-                pos.start++;
-                isFirstDigit = false;
-            }
-            else if ( startsWith( reader, pos, '.' ) )
-            {
-                if ( isDot )
-                {
-                    // We can't have two consecutive dots or a dot at the beginning
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13785_BAD_OID_CONSECUTIVE_DOTS, pos.lineNumber, pos.start ) );
-                }
-                
-                firstIsZero = false;
-                isFirstDigit = true;
-                pos.start++;
-                isDot = true;
-            }
-            else
-            {
-                break;
-            }
-        }
-        
-        if ( isDot )
-        {
-            // We can't have two consecutive dots or a dot at the beginning
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13786_BAD_OID_DOT_AT_THE_END, pos.lineNumber, pos.start ) );
-        }
-        
-        return pos.line.substring( start, pos.start );
-    }
-
-    
-    /**
-     * In normal mode :
-     * <pre>
-     * oid          ::= descr | numericoid
-     * descr        ::= keystring
-     * keystring    ::= leadkeychar keychar*
-     * leadkeychar  ::= ALPHA
-     * keychar      ::= ALPHA | DIGIT | HYPHEN
-     * numericoid   ::= number ( DOT number )+ |
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * DOT          ::= %x2E                ; period (".")
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * </pre>
-     * 
-     * In quirks mode :
-     * <pre>
-     * oid          ::= descr | numericoid
-     * descr        ::= descrQ (COLON numericoid)
-     * descrQ       ::= keystringQ
-     * keystringQ   ::= LkeycharQ keycharQ*
-     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * numericoid   ::= number ( DOT number )+
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * UNDERSCORE   ::= %x5F                ; underscore ("_")
-     * DOT          ::= %x2E                ; period (".")
-     * COLON        ::= %x3A                ; colon (":")
-     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
-     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
-     * </pre>
-     */
-    private String getOidAndMacro( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        if ( isAlpha( pos ) )
-        {
-            // A descr (likely)
-            if ( isQuirksModeEnabled )
-            {
-                // This is a OID name
-                int start = pos.start;
-                char c = pos.line.charAt( pos.start );
-                
-                while ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
-                    || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) )
-                {
-                    pos.start++;
-                    
-                    if ( isEmpty( pos ) )
-                    {
-                        break;
-                    }
-                }
-                
-                String oidName = pos.line.substring( start, pos.start  );
-                
-                // We may have a ':' followed by an OID
-                if ( startsWith( reader, pos, ':' ) )
-                {
-                    pos.start++;
-                    
-                    String oid = getNumericOid( reader, pos );
-                    
-                    return objectIdentifierMacros.get( oidName ).getRawOidOrNameSuffix() + '.' + oid;
-                }
-                else
-                {
-                    // Ok, we may just have an oidName
-                    OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( oidName );
-                    
-                    if ( macro == null )
-                    {
-                        return oidName;
-                    }
-                    else
-                    {
-                        return macro.getRawOidOrNameSuffix();
-                    }
-                }
-            }
-            else
-            {
-                // A simple descr
-                return getDescr( reader, pos );
-            }
-        }
-        else if ( isDigit( pos ) )
-        {
-            // This is a numeric oid
-            return getNumericOid( reader, pos );
-        }
-        else
-        {
-            // This is an error
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
-        }
-    }
-
-    
-    /**
-     * In normal mode :
-     * <pre>
-     * oid          ::= descr | numericoid
-     * descr        ::= keystring
-     * keystring    ::= leadkeychar keychar*
-     * leadkeychar  ::= ALPHA
-     * keychar      ::= ALPHA | DIGIT | HYPHEN
-     * numericoid   ::= number ( DOT number )+ |
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * DOT          ::= %x2E                ; period (".")
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * </pre>
-     * 
-     * In quirks mode :
-     * <pre>
-     * oid          ::= descr | numericoid
-     * descr        ::= descrQ (COLON numericoid)
-     * descrQ       ::= keystringQ
-     * keystringQ   ::= LkeycharQ keycharQ*
-     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * numericoid   ::= number ( DOT number )+
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * UNDERSCORE   ::= %x5F                ; underscore ("_")
-     * DOT          ::= %x2E                ; period (".")
-     * COLON        ::= %x3A                ; colon (":")
-     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
-     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
-     * </pre>
-     */
-    private String getOid( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        if ( isAlpha( pos ) )
-        {
-            // A descr (likely)
-            if ( isQuirksModeEnabled )
-            {
-                // This is a OID name
-                int start = pos.start;
-                char c = pos.line.charAt( pos.start );
-                
-                while ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' )
-                    || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
-                {
-                    pos.start++;
-                    
-                    if ( isEmpty( pos ) )
-                    {
-                        break;
-                    }
-                    
-                    c = pos.line.charAt( pos.start );
-                }
-                
-                return pos.line.substring( start, pos.start  );
-            }
-            else
-            {
-                // A simple descr
-                return getDescr( reader, pos );
-            }
-        }
-        else if ( isDigit( pos ) )
-        {
-            // This is a numeric oid
-            return getNumericOid( reader, pos );
-        }
-        else
-        {
-            // This is an error
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
-        }
-    }
-    
-    
-    /**
-     * In normal mode :
-     * 
-     * <pre>
-     * descr        ::= keystring
-     * keystring    ::= leadkeychar keychar*
-     * leadkeychar  ::= ALPHA
-     * keychar      ::= ALPHA | DIGIT | HYPHEN
-     * numericoid   ::= number ( DOT number )+ |
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * DOT          ::= %x2E                ; period (".")
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * </pre>
-     * 
-     * In quirksMode :
-     * 
-     * <pre>
-     * descr        ::= descrQ (COLON numericoid)
-     * descrQ       ::= keystringQ
-     * keystringQ   ::= LkeycharQ keycharQ*
-     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * numericoid   ::= number ( DOT number )+
-     * number       ::= DIGIT | LDIGIT DIGIT+
-     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
-     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
-     * LDIGIT       ::= %x31-39             ; "1"-"9"
-     * HYPHEN       ::= %x2D                ; hyphen ("-")
-     * UNDERSCORE   ::= %x5F                ; underscore ("_")
-     * DOT          ::= %x2E                ; period (".")
-     * COLON        ::= %x3A                ; colon (":")
-     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
-     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
-     * </pre
-     * @throws IOException 
-     */
-    private String getDescr( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        if ( isQuirksModeEnabled )
-        {
-            int start = pos.start;
-            boolean isFirst = true;
-            
-            while ( !isEmpty( pos ) )
-            {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                    
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
-                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) ) 
-                    {
-                        // leadkeycharQ
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // Error, we are expecting a leadKeychar
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-                else
-                {
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' )
-                        || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) ) 
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // We are done 
-                        return pos.line.substring( start, pos.start );
-                    }
-                }
-            }
-            
-            return pos.line.substring( start, pos.start );
-        }
-        else
-        {
-            int start = pos.start;
-            boolean isFirst = true;
-            
-            while ( !isEmpty( pos ) )
-            {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                    
-                    if ( isAlpha( pos ) ) 
-                    {
-                        // leadkeychar
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // Error, we are expecting a leadKeychar
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-                else
-                {
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // We are done 
-                        return pos.line.substring( start, pos.start );
-                    }
-                }
-            }
-
-            return pos.line.substring( start, pos.start );
-        }
-    }
-    
-    
-    private String getMacro( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        if ( isQuirksModeEnabled )
-        {
-            int start = pos.start;
-            boolean isFirst = true;
-            
-            while ( !isEmpty( pos ) )
-            {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                    
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' ) 
-                        || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) ) 
-                    {
-                        // leadkeycharQ
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // Error, we are expecting a leadKeychar
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-                else
-                {
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) 
-                        || ( c == '_' ) || ( c == ';' ) || ( c == '.' ) || ( c == '#' ) ) 
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // We are done 
-                        return pos.line.substring( start, pos.start );
-                    }
-                }
-            }
-            
-            return pos.line.substring( start, pos.start );
-        }
-        else
-        {
-            int start = pos.start;
-            boolean isFirst = true;
-            
-            while ( !isEmpty( pos ) )
-            {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                    
-                    if ( isAlpha( pos ) ) 
-                    {
-                        // leadkeychar
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // Error, we are expecting a leadKeychar
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-                else
-                {
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // We are done 
-                        return pos.line.substring( start, pos.start );
-                    }
-                }
-            }
-
-            return pos.line.substring( start, pos.start );
-        }
-    }
-
-    
-    
-    /**
-     * <pre>
-     * qdescr ::== SQUOTE descr SQUOTE
-     * descr ::= keystring
-     * keystring ::= leadkeychar *keychar
-     * leadkeychar ::= ALPHA
-     * keychar ::= ALPHA | DIGIT | HYPHEN
-     * </pre>
-     * 
-     * In quirksMode :
-     * 
-     * <pre>
-     * qdescr ::== SQUOTE descr SQUOTE | descr | SQUOTE numericoid SQUOTE
-     * descr ::= keystring
-     * keystring ::= keychar+
-     * keychar ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
-     * </pre>
-     * @throws IOException 
-     */
-    private String getQDescr( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        if ( isQuirksModeEnabled )
-        {
-            if ( startsWith( reader, pos, '\'' ) )
-            {
-                pos.start++;
-                int start = pos.start;
-                
-                while ( !startsWith( reader, pos, '\'' ) )
-                {
-                    if ( isEmpty( pos ) )
-                    {
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                    
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
-                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
-                    {
-                        pos.start++;
-                    }
-                    else if ( c != '\'' )
-                    {
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13790_NOT_A_KEYSTRING, pos.lineNumber, pos.start ) );
-                    }
-                }
-                
-                pos.start++;
-                
-                return pos.line.substring( start, pos.start - 1 );
-            }
-            else
-            {
-                int start = pos.start;
-                while ( !isEmpty( pos ) )
-                {
-                    char c = pos.line.charAt( pos.start );
-
-                    if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == '-' ) || ( c == '_' )
-                        || ( c == ';' ) || ( c == '.' ) || ( c == ':' ) || ( c == '#' ) )
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        break;
-                    }
-                }
-
-                return pos.line.substring( start, pos.start );
-            }
-        }
-        else
-        {
-            // The first quote
-            if ( !startsWith( reader, pos, '\'' ) )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            pos.start++;
-            int start = pos.start;
-            boolean isFirst = true;
-            
-            while ( !startsWith( reader, pos, '\'' ) )
-            {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                    
-                    if ( isAlpha( pos ) ) 
-                    {
-                        // leadkeychar
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // Error, we are expecting a leadKeychar
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-                else
-                {
-                    char c = pos.line.charAt( pos.start );
-                    
-                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == '-' ) )
-                    {
-                        pos.start++;
-                    }
-                    else
-                    {
-                        // This is an error
-                        throw new LdapSchemaException( I18n.err( I18n.ERR_13791_KEYCHAR_EXPECTED, c, 
-                            pos.lineNumber, pos.start ) );
-                    }
-                }
-            }
-            
-            if ( startsWith( reader, pos, '\'' ) )
-            {
-                // We are done, move one char forward to eliminate the simple quote
-                pos.start++;
-                
-                return pos.line.substring( start, pos.start - 1 );
-            }
-            else
-            {
-                // No closing simple quote, this is an error
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
-                    pos.lineNumber, pos.start ) );
-            }
-        }
-    }
-    
-    
-    /**
-     * <pre>
-     * qdstring ::== SQUOTE dstring SQUOTE
-     * dstring  ::= ( QS | QQ | QUTF8 )+            ; escaped UTF-8 string
-     * QS       ::= ESC %x35 ( %x43 | %x63 )        ; "\5C" | "\5c", escape char
-     * QQ       ::= ESC %x32 %x37                   ; "\27", simple quote char
-     * QUTF8    ::= QUTF1 | UTFMB
-     * QUTF1    ::= %x00-26 | %x28-5B | %x5D-7F     ; All ascii but ' and \
-     * UTFMB    ::= UTF2 | UTF3 | UTF4
-     * UTF0     ::= %x80-BF
-     * UTF2     ::= %xC2-DF UTF0
-     * UTF3     ::= %xE0 %xA0-BF UTF0 | %xE1-EC UTF0 UTF0 | %xED %x80-9F UTF0 | %xEE-EF UTF0 UTF0
-     * UTF4     ::= %xF0 %x90-BF UTF0 UTF0 | %xF1-F3 UTF0 UTF0 UTF0 | %xF4 %x80-8F UTF0 UTF0
-     * ESC      ::= %x5C                            ; backslash ("\")
-     * </pre>
-     */
-    private String getQDString( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        // The first quote
-        if ( !startsWith( reader, pos, '\'' ) )
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
-                pos.lineNumber, pos.start ) );
-        }
-        
-        pos.start++;
-        int start = pos.start;
-        
-        while ( !startsWith( reader, pos, '\'', QUOTED ) )
-        {
-            // At the moment, just swallow anything
-            pos.start++;
-        }
-        
-        if ( startsWith( reader, pos, '\'' ) )
-        {
-            // We are done, move one char forward to eliminate the simple quote
-            pos.start++;
-            
-            return pos.line.substring( start, pos.start - 1 );
-        }
-        else
-        {
-            // No closing simple quote, this is an error
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
-                pos.lineNumber, pos.start ) );
-        }
-    }
-
-
-    /**
-     * qdescrs ::= qdescr | LPAREN WSP qdescrlist WSP RPAREN
-     * qdescrlist ::= [ qdescr *( SP qdescr ) ]
-     * qdescr ::== SQUOTE descr SQUOTE
-     * descr ::= keystring
-     * keystring ::= leadkeychar *keychar
-     * leadkeychar ::= ALPHA
-     * keychar ::= ALPHA / DIGIT / HYPHEN
-     * @throws LdapSchemaException 
-     * @throws IOException 
-     */
-    private List<String> getQDescrs( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        List<String> qdescrs = new ArrayList<>();
-        
-        // It may start with a '('
-        if ( startsWith( reader, pos, '(' ) )
-        {
-            pos.start++;
-            
-            // We have more than a name
-            skipWhites( reader, pos, false );
-            
-            while ( !startsWith( reader, pos, ')' ) )
-            {
-                qdescrs.add( getQDescr( reader, pos ) );
-                
-                if ( startsWith( reader, pos, ')' ) )
-                {
-                    break;
-                }
-                
-                skipWhites( reader, pos, true );
-            }
-            
-            if ( !startsWith( reader, pos, ')' ) )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            pos.start++;
-        }
-        else
-        {
-            // Only one name, read it
-            qdescrs.add( getQDescr( reader, pos ) );
-        }
-        
-        return qdescrs;
-    }
-
-
-    /**
-     * <pre>
-     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
-     * qdstringlist ::= qdstring *( SP qdstring )*
-     * qdstring     ::= SQUOTE dstring SQUOTE
-     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
-     * </pre>
-     * @throws LdapSchemaException 
-     * @throws IOException 
-     */
-    private List<String> getQDStrings( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        List<String> qdStrings = new ArrayList<>();
-        
-        // It may start with a '('
-        if ( startsWith( reader, pos, '(' ) )
-        {
-            pos.start++;
-            
-            // We have more than a name
-            skipWhites( reader, pos, false );
-            
-            while ( !startsWith( reader, pos, ')' ) )
-            {
-                qdStrings.add( getQDString( reader, pos ) );
-                
-                if ( startsWith( reader, pos, ')' ) )
-                {
-                    break;
-                }
-                
-                skipWhites( reader, pos, true );
-            }
-            
-            if ( !startsWith( reader, pos, ')' ) )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            pos.start++;
-        }
-        else
-        {
-            // Only one name, read it
-            qdStrings.add( getQDString( reader, pos ) );
-        }
-        
-        return qdStrings;
-    }
-
-    
-
-    
-    /**
-     * <pre>
-     * oids     ::= oid | ( LPAREN WSP oidlist WSP RPAREN )
-     * oidlist  ::= oid *( WSP DOLLAR WSP oid )
-     * </pre>
-     */
-    private List<String> getOids( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        List<String> oids = new ArrayList<>();
-        
-        // It may start with a '('
-        if ( startsWith( reader, pos, '(' ) )
-        {
-            pos.start++;
-            
-            // We have more than a name
-            skipWhites( reader, pos, false );
-            boolean moreExpected = false;
-            
-            while ( !startsWith( reader, pos, ')' ) )
-            {
-                moreExpected = false;
-                
-                oids.add( getOid( reader, pos ) );
-                
-                if ( startsWith( reader, pos, ')' ) )
-                {
-                    break;
-                }
-                
-                skipWhites( reader, pos, false );
-                
-                if ( startsWith( reader, pos, '$' ) )
-                {
-                    pos.start++;
-                    moreExpected = true;
-                }
-
-                skipWhites( reader, pos, false );
-            }
-            
-            if ( !startsWith( reader, pos, ')' ) )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            if ( moreExpected )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13794_MORE_OIDS_EXPECTED, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            pos.start++;
-        }
-        else
-        {
-            // Only one name, read it
-            oids.add( getOid( reader, pos ) );
-        }
-        
-        return oids;
-    }
-
-    
-    /**
-     * noidlen = numericoid [ LCURLY len RCURLY ]
-     */
-    private NoidLen getNoidLen( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        // Get the numericOid
-        String numericOid = getNumericOid( reader, pos );
-        NoidLen noidLen = new NoidLen();
-        noidLen.noid = numericOid;
-
-        // Then the len, if any
-        if ( startsWith( reader, pos, '{' ) )
-        {
-            pos.start++;
-            int start = pos.start;
-            
-            while ( isDigit( pos ) )
-            {
-                pos.start++;
-            }
-            
-            if ( startsWith( reader, pos, '}' ) )
-            {
-                String lenStr = pos.line.substring( start, pos.start );
-                
-                pos.start++;
-                
-                if ( Strings.isEmpty( lenStr ) )
-                {
-                    noidLen.len = -1;
-                }
-                else
-                {
-                    noidLen.len = Integer.parseInt( lenStr );
-                }
-            }
-            else
-            {
-                // The opening curly hasn't been closed
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13795_OPENED_BRACKET_NOT_CLOSED, 
-                    pos.lineNumber, pos.start ) );
-            }
-        }
-
-        return noidLen;
-    }
-    
-    
-    private UsageEnum getUsage( Reader reader, PosSchema pos ) throws LdapSchemaException
-    {
-        if ( isEmpty( pos ) )
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
-                pos.lineNumber, pos.start ) );
-        }
-        
-        if ( startsWith( pos, "userApplications" ) )
-        { 
-            return UsageEnum.USER_APPLICATIONS;
-        }
-        else if ( startsWith( pos, "directoryOperation" ) )
-        { 
-            return UsageEnum.DIRECTORY_OPERATION;
-        } 
-        else if ( startsWith( pos, "distributedOperation" ) )
-        { 
-            return UsageEnum.DISTRIBUTED_OPERATION;
-        } 
-        else if ( startsWith( pos, "dSAOperation" ) )
-        { 
-            return UsageEnum.DSA_OPERATION;
-        } 
-        else
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13797_USAGE_UNKNOWN, 
-                pos.lineNumber, pos.start ) );
-        }
-    }
-
-    
-    /**
-     * Production for matching attribute type descriptions. It is fault-tolerant
-     * against element ordering.
-     *
-     * <pre>
-     * AttributeTypeDescription = LPAREN WSP
-     *     numericoid                    ; object identifier
-     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
-     *     [ SP "DESC" SP qdstring ]     ; description
-     *     [ SP "OBSOLETE" ]             ; not active
-     *     [ SP "SUP" SP oid ]           ; supertype
-     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
-     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
-     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
-     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
-     *     [ SP "SINGLE-VALUE" ]         ; single-value
-     *     [ SP "COLLECTIVE" ]           ; collective
-     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
-     *     [ SP "USAGE" SP usage ]       ; usage
-     *     extensions WSP RPAREN         ; extensions
-     * 
-     * usage = "userApplications"     /  ; user
-     *         "directoryOperation"   /  ; directory operational
-     *         "distributedOperation" /  ; DSA-shared operational
-     *         "dSAOperation"            ; DSA-specific operational     
-     * 
-     * extensions = *( SP xstring SP qdstrings )
-     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
-     * </pre>
-     * @throws IOException 
-     * @throws LdapSchemaException 
-     */
-    private MutableAttributeType parseAttributeType( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        // Get rid of whites, comments end empty lines
-        skipWhites( reader, pos, false );
-        
-        // we must have a '('
-        if ( pos.line.charAt( pos.start ) != '(' )
-        {
-            return null;
-        }
-        else
-        {
-            pos.start++;
-        }
-        
-        // Get rid of whites, comments end empty lines
-        skipWhites( reader, pos, false );
-        
-        // Now, the OID. 
-        String oid = getOidAndMacro( reader, pos );
-        
-        MutableAttributeType attributeType = new MutableAttributeType( oid );
-        boolean hasSup = false;
-        boolean hasSyntax = false;
-        int elementsSeen = 0;
-        
-        while ( !startsWith( reader, pos, ')' ) )
-        {
-            skipWhites( reader, pos, true );
-
-            if ( startsWith( pos, "NAME" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.NAME, pos );
-                
-                pos.start += "NAME".length();
-                
-                skipWhites( reader, pos, true );
-
-                attributeType.setNames( getQDescrs( reader, pos ) );
-            }
-            else if ( startsWith( pos, "DESC" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.DESC, pos );
-
-                pos.start += "DESC".length();
-                
-                skipWhites( reader, pos, true );
-
-                attributeType.setDescription( getQDString( reader, pos ) );
-            }
-            else if ( startsWith( pos, "OBSOLETE" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.OBSOLETE, pos );
-                
-                pos.start += "OBSOLETE".length();
-                
-                attributeType.setObsolete( true );
-            }
-            else if ( startsWith( pos, "SUP" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.SUP, pos );
-                
-                pos.start += "SUP".length();
-                
-                skipWhites( reader, pos, true );
-                
-                String superiorOid = getOid( reader, pos );
-
-                attributeType.setSuperiorOid( superiorOid );
-                hasSup = true;
-            }
-            else if ( startsWith( pos, "EQUALITY" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.EQUALITY, pos );
-                
-                pos.start += "EQUALITY".length();
-                
-                skipWhites( reader, pos, true );
-                
-                String equalityOid = getOid( reader, pos );
-
-                attributeType.setEqualityOid( equalityOid );
-            }
-            else if ( startsWith( pos, "ORDERING" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.ORDERING, pos );
-                
-                pos.start += "ORDERING".length();
-                
-                skipWhites( reader, pos, true );
-                
-                String orderingOid = getOid( reader, pos );
-
-                attributeType.setOrderingOid( orderingOid );
-            }
-            else if ( startsWith( pos, "SUBSTR" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.SUBSTR, pos );
-
-                pos.start += "SUBSTR".length();
-                
-                skipWhites( reader, pos, true );
-                
-                String substrOid = getOid( reader, pos );
-
-                attributeType.setSubstringOid( substrOid );
-            }
-            else if ( startsWith( pos, "SYNTAX" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.SYNTAX, pos );
-                
-                pos.start += "SYNTAX".length();
-                
-                skipWhites( reader, pos, true );
-                
-                NoidLen noidLen = getNoidLen( reader, pos );
-
-                attributeType.setSyntaxOid( noidLen.noid );
-                attributeType.setSyntaxLength( noidLen.len );
-                hasSyntax = true;
-            }
-            else if ( startsWith( pos, "SINGLE-VALUE" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.SINGLE_VALUE, pos );
-                
-                pos.start += "SINGLE-VALUE".length();
-                
-                attributeType.setSingleValued( true );
-            }
-            else if ( startsWith( pos, "COLLECTIVE" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.COLLECTIVE, pos );
-                
-                pos.start += "COLLECTIVE".length();
-                
-                attributeType.setCollective( true );
-            }
-            else if ( startsWith( pos, "NO-USER-MODIFICATION\"" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.NO_USER_MODIFICATION, pos );
-                
-                pos.start += "NO-USER-MODIFICATION\"".length();
-                
-                attributeType.setUserModifiable( false );
-            }
-            else if ( startsWith( pos, "USAGE" ) )
-            {
-                elementsSeen = check( elementsSeen, AttributeTypeElements.USAGE, pos );
-                
-                pos.start += "USAGE".length();
-                
-                skipWhites( reader, pos, true );
-                
-                UsageEnum usage = getUsage( reader, pos );
-
-                attributeType.setUsage( usage );
-            }
-            else if ( startsWith( pos, "X-" ) )
-            {
-                Extension extension = getExtension( reader, pos );
-                attributeType.addExtension( extension.key, extension.values );
-            }
-            else if ( startsWith( reader, pos, ')' ) )
-            {
-                pos.start++;
-                
-                return attributeType;
-            }
-            else
-            {
-                // This is an error
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
-                    pos.lineNumber, pos.start ) );
-            }
-        }
-        
-        if ( startsWith( reader, pos, ')' ) )
-        {
-            pos.start++;
-            
-            // Semantic checks
-            if ( !isQuirksModeEnabled )
-            {
-                if ( !hasSup && !hasSyntax )
-                {
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13799_SYNTAX_OR_SUP_REQUIRED, 
-                        pos.lineNumber, pos.start ) );
-                }
-
-                if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
-                {
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION, 
-                        pos.lineNumber, pos.start ) );
-                }
-            
-                // NO-USER-MODIFICATION requires an operational USAGE.
-                if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
-                {
-                    throw new LdapSchemaException( I18n.err( I18n.ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL, 
-                        pos.lineNumber, pos.start ) );
-                }
-            }
-            
-            return attributeType;
-        }
-        
-        throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
-            pos.lineNumber, pos.start ) );
-    }
-    
-    
-    private int check( int elementsSeen, AttributeTypeElements element, PosSchema pos ) throws LdapSchemaException
-    {
-        if ( ( elementsSeen & element.value ) != 0 )
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13780_AT_DESCRIPTION_HAS_ELEMENT_TWICE, element, pos.lineNumber, pos.start ) );
-        }
-        
-        elementsSeen |= element.value;
-        
-        return elementsSeen;
-    }
-    
-    
-    /**
-     * <pre>
-     * extension    ::= xstring SP qdstrings
-     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
-     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
-     * qdstringlist ::= qdstring *( SP qdstring )*
-     * qdstring     ::= SQUOTE dstring SQUOTE
-     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
-     * </pre>
-     * @throws IOException 
-     * @throws LdapSchemaException 
-     */
-    private Extension getExtension( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        Extension extension = new Extension();
-        
-        // The xstring first
-        extension.key = getXString( reader, pos );
-        
-        skipWhites( reader, pos, true );
-        
-        extension.values = getQDStrings( reader, pos );
-        
-        return extension;
-    }
-    
-    
-    /**
-     * <pre>
-     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
-     * </pre>
-     */
-    private String getXString( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
-    {
-        int start = pos.start;
-        
-        if ( startsWith( pos, "X-" ) )
-        {
-            pos.start += 2;
-            
-            // Now parse the remaining string
-            while ( isAlpha( pos ) || startsWith( reader, pos, '-' ) || startsWith( reader, pos, '_' ) )
-            {
-                pos.start++;
-            }
-            
-            return pos.line.substring( start, pos.start );
-        }
-        else
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13802_EXTENSION_SHOULD_START_WITH_X, 
-                pos.lineNumber, pos.start ) );
-        }
-    }
-    
-    
-    /**
-     * Production for matching ObjectClass descriptions. It is fault-tolerant
-     * against element ordering.
-     * <pre>
-     * ObjectClassDescription = LPAREN WSP
-     *   numericoid                 ; object identifier
-     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
-     *   [ SP "DESC" SP qdstring ]  ; description
-     *   [ SP "OBSOLETE" ]          ; not active
-     *   [ SP "SUP" SP oids ]       ; superior object classes
-     *   [ SP kind ]                ; kind of class
-     *   [ SP "MUST" SP oids ]      ; attribute types
-     *   [ SP "MAY" SP oids ]       ; attribute types
-     *   extensions WSP RPAREN
-     *
-     *   kind = "ABSTRACT" / "STRUCTURAL" / "AUXILIARY"
-     * </pre>
-     */
-    private MutableObjectClass parseObjectClass( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        // Get rid of whites, comments end empty lines
-        skipWhites( reader, pos, false );
-        
-        // we must have a '('
-        if ( pos.line.charAt( pos.start ) != '(' )
-        {
-            return null;
-        }
-        else
-        {
-            pos.start++;
-        }
-        
-        // Get rid of whites, comments end empty lines
-        skipWhites( reader, pos, false );
-        
-        // Now, the numeric OID
-        String oid = getOid( reader, pos );
-        
-        MutableObjectClass objectClass = new MutableObjectClass( oid );
-        int elementsSeen = 0;
-        
-        while ( !startsWith( reader, pos, ')' ) )
-        {
-            skipWhites( reader, pos, true );
-
-            if ( startsWith( pos, "NAME" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.NAME, pos );
-
-                pos.start += "NAME".length();
-                
-                skipWhites( reader, pos, true );
-
-                List<String> names = getQDescrs( reader, pos );
-                objectClass.setNames( names );
-            }
-            else if ( startsWith( pos, "DESC" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.DESC, pos );
-                
-                pos.start += "DESC".length();
-                
-                skipWhites( reader, pos, true );
-
-                objectClass.setDescription( getQDString( reader, pos ) );
-            }
-            else if ( startsWith( pos, "OBSOLETE" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.OBSOLETE, pos );
-                
-                pos.start += "OBSOLETE".length();
-                
-                objectClass.setObsolete( true );
-            }
-            else if ( startsWith( pos, "SUP" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.SUP, pos );
-                
-                pos.start += "SUP".length();
-                
-                skipWhites( reader, pos, true );
-                
-                List<String> superiorOids = getOids( reader, pos );
-
-                objectClass.setSuperiorOids( superiorOids );
-            }
-            else if ( startsWith( pos, "ABSTRACT" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.ABSTRACT, pos );
-                
-                pos.start += "ABSTRACT".length();
-                
-                objectClass.setType( ObjectClassTypeEnum.ABSTRACT );
-            }
-            else if ( startsWith( pos, "STRUCTURAL" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.STRUCTURAL, pos );
-                
-                pos.start += "STRUCTURAL".length();
-                
-                objectClass.setType( ObjectClassTypeEnum.STRUCTURAL );
-            }
-            else if ( startsWith( pos, "AUXILIARY" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.AUXILIARY, pos );
-                
-                pos.start += "AUXILIARY".length();
-                
-                objectClass.setType( ObjectClassTypeEnum.AUXILIARY );
-            }
-            else if ( startsWith( pos, "MUST" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.MUST, pos );
-                
-                pos.start += "MUST".length();
-                
-                skipWhites( reader, pos, true );
-                
-                List<String> mustAttributeTypes = getOids( reader, pos );
-                objectClass.setMustAttributeTypeOids( mustAttributeTypes );
-            }
-            else if ( startsWith( pos, "MAY" ) )
-            {
-                elementsSeen = check( elementsSeen, ObjectClassElements.MAY, pos );
-                
-                pos.start += "MAY".length();
-                
-                skipWhites( reader, pos, true );
-                
-                List<String> mayAttributeTypes = getOids( reader, pos );
-                objectClass.setMayAttributeTypeOids( mayAttributeTypes );
-            }
-            else if ( startsWith( pos, "X-" ) )
-            {
-                Extension extension = getExtension( reader, pos );
-                objectClass.addExtension( extension.key, extension.values );
-            }
-            else if ( startsWith( reader, pos, ')' ) )
-            {
-                pos.start++;
-                
-                return objectClass;
-            }
-            else
-            {
-                // This is an error
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13803_OC_DESCRIPTION_INVALID, 
-                    pos.lineNumber, pos.start ) );
-            }
-        }
-        
-        return objectClass;
-    }
-    
-    
-    private int check( int elementsSeen, ObjectClassElements element, PosSchema pos ) throws LdapSchemaException
-    {
-        if ( ( elementsSeen & element.value ) != 0 )
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13781_OC_DESCRIPTION_HAS_ELEMENT_TWICE, element, pos.lineNumber, pos.start ) );
-        }
-        
-        elementsSeen |= element.value;
-        
-        return elementsSeen;
-    }
-
-    
-    /**
-     * Process OpenLDAP macros, like : objectidentifier DUAConfSchemaOID 1.3.6.1.4.1.11.1.3.1.
-     * 
-     * <pre>
-     * objectidentifier ::= 'objectidentifier' descr SP+ macroOid
-     * descr             ::= ALPHA ( ALPHA | DIGIT | HYPHEN )*
-     * macroOid         ::= (descr ':')? oid
-     * </pre>
-     */
-    private void processObjectIdentifier( Reader reader, PosSchema pos ) throws IOException, LdapSchemaException
-    {
-        // Get rid of whites, comments end empty lines
-        skipWhites( reader, pos, false );
-        
-        // Now, the name
-        String name = getDescr( reader, pos );
-        
-        OpenLdapObjectIdentifierMacro macro = new OpenLdapObjectIdentifierMacro();
-        
-        skipWhites( reader, pos, true );
-
-        if ( isEmpty( pos ) )
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID, 
-                pos.lineNumber, pos.start ) );
-        }
-        
-        // Get the descr, if any
-        if ( isAlpha( pos ) )
-        {
-            // A macro
-            String descr = getMacro( reader, pos );
-            
-            if ( isEmpty( pos ) )
-            {
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13804_OBJECT_IDENTIFIER_HAS_NO_OID, 
-                    pos.lineNumber, pos.start ) );
-            }
-            
-            if ( startsWith( reader, pos, ':' ) )
-            {
-                pos.start++;
-                
-                // Now, the OID
-                String numericOid = getNumericOid( reader, pos );
-                String realOid = objectIdentifierMacros.get( descr ).getRawOidOrNameSuffix() + '.' + numericOid;
-                macro.setName( name );
-                macro.setRawOidOrNameSuffix( realOid );
-                
-                objectIdentifierMacros.put( name, macro );
-                
-                return;
-            }
-        }
-        else if ( isDigit( pos ) )
-        {
-            // An oid
-            String numericOid = getNumericOid( reader, pos );
-            macro.setRawOidOrNameSuffix( numericOid );
-            macro.setName( name );
-            
-            objectIdentifierMacros.put( name, macro );
-            
-            return;
-        }
-        else
-        {
-            throw new LdapSchemaException( I18n.err( I18n.ERR_13805_OBJECT_IDENTIFIER_INVALID_OID, 
-                pos.lineNumber, pos.start ) );
-        }
-    }
-    
-    
-    /**
-     * Reads an entry in a ldif buffer, and returns the resulting lines, without
-     * comments, and unfolded.
-     *
-     * The lines represent *one* entry.
-     *
-     * @throws LdapLdifException If something went wrong
-     */
-    private void parse( Reader reader ) throws LdapSchemaException, IOException
-    {
-        PosSchema pos = new PosSchema();
-
-        while ( true )
-        {
-            // Always move forward to the next element, skipping whites, NL and comments
-            skipWhites( reader, pos, false );
-            
-            if ( pos.line == null )
-            {
-                // The end, get out
-                break;
-            }
-            
-            // Ok, we have something which must be one of openLdapObjectIdentifier( "objectidentifier" ), 
-            // openLdapAttributeType ( "attributetype" )  or openLdapObjectClass ( "objectclass" )
-            if ( startsWith( pos, "objectidentifier" ) )
-            {
-                pos.start += "objectidentifier".length();
-                
-                processObjectIdentifier( reader, pos );
-            }
-            else if ( startsWith( pos, "attributetype" ) )
-            {
-                pos.start += "attributetype".length();
-                
-                MutableAttributeType attributeType = parseAttributeType( reader, pos );
-                schemaDescriptions.add( attributeType );
-            }
-            else if ( startsWith( pos, "objectclass" ) )
-            {
-                pos.start += "objectclass".length();
-                
-                MutableObjectClass objectClass = parseObjectClass( reader, pos );
-                schemaDescriptions.add( objectClass );
-            }
-            else
-            {
-                // This is an error
-                throw new LdapSchemaException( I18n.err( I18n.ERR_13806_UNEXPECTED_ELEMENT_READ, 
-                    pos.line.substring( pos.start ), pos.lineNumber, pos.start ) );
-            }
-        }
-    }
-
-
-    /**
-     * Parses a file of OpenLDAP schemaObject elements/objects. Default charset is used.
-     *
-     * @param schemaFile a file of schema objects
-     * @throws IOException If the schemaObject can't be transformed to a byteArrayInputStream
-     * @throws ParseException If the schemaObject can't be parsed
-     */
-    public void parse( File schemaFile ) throws ParseException
-    {
-        try ( InputStream is = Files.newInputStream( Paths.get( schemaFile.getPath() ) ) )
-        {
-            try ( Reader reader = new BufferedReader( new InputStreamReader( is, Charset.defaultCharset() ) ) )
-            {
-                parse( reader );
-                afterParse();
-            }
-            catch ( LdapSchemaException | IOException e )
-            {
-                throw new ParseException( e.getMessage(), 0 );
-            }
-        }
-        catch ( IOException e )
-        {
-            String msg = I18n.err( I18n.ERR_13443_CANNOT_FIND_FILE, schemaFile.getAbsoluteFile() );
-            LOG.error( msg );
-            throw new ParseException( e.getMessage(), 0 );
-        }
-    }
-
-
-    /**
-     * Checks if object identifier macros should be resolved.
-     * 
-     * @return true, object identifier macros should be resolved.
-     */
-    public boolean isResolveObjectIdentifierMacros()
-    {
-        return isResolveObjectIdentifierMacros;
-    }
-
-
-    /**
-     * Sets if object identifier macros should be resolved.
-     * 
-     * @param resolveObjectIdentifierMacros true if object identifier macros should be resolved
-     */
-    public void setResolveObjectIdentifierMacros( boolean resolveObjectIdentifierMacros )
-    {
-        this.isResolveObjectIdentifierMacros = resolveObjectIdentifierMacros;
-    }
-
-    /**
-     * Checks if quirks mode is enabled.
-     * 
-     * @return true, if is quirks mode is enabled
-     */
-    public boolean isQuirksMode()
-    {
-        return isQuirksModeEnabled;
-    }
-
-
-    /**
-     * Sets the quirks mode. 
-     * 
-     * If enabled the parser accepts non-numeric OIDs and some 
-     * special characters in descriptions.
-     * 
-     * @param enabled the new quirks mode
-     */
-    public void setQuirksMode( boolean enabled )
-    {
-        isQuirksModeEnabled = enabled;
-    }
-}
\ No newline at end of file
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapComparatorDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapComparatorDescriptionSchemaParser.java
index 0539944..5d17b0a 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapComparatorDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapComparatorDescriptionSchemaParser.java
@@ -24,9 +24,6 @@ import java.text.ParseException;
 
 import org.apache.directory.api.i18n.I18n;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for ApacheDS comparator descriptions.
@@ -69,19 +66,15 @@ public class LdapComparatorDescriptionSchemaParser extends AbstractSchemaParser<
      * @return the parsed ComparatorDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public LdapComparatorDescription parseComparatorDescription( String comparatorDescription ) throws ParseException
+    public LdapComparatorDescription parse( String comparatorDescription ) throws ParseException
     {
-        return super.parse( comparatorDescription );
-    }
+        LdapComparatorDescription comparator = fastParser.parseLdapComparator( comparatorDescription );
+        comparator.setSpecification( comparatorDescription );
 
+        
+        // Update the schemaName
+        updateSchemaName( comparator );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected LdapComparatorDescription doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.ldapComparator();
+        return comparator;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapSyntaxDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapSyntaxDescriptionSchemaParser.java
index caf1d73..2163369 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapSyntaxDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/LdapSyntaxDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.LdapSyntax;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 LDAP syntx descriptions.
@@ -60,18 +57,14 @@ public class LdapSyntaxDescriptionSchemaParser extends AbstractSchemaParser<Ldap
      * @return the parsed LdapSyntax bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public LdapSyntax parseLdapSyntaxDescription( String ldapSyntaxDescription ) throws ParseException
+    public LdapSyntax parse( String ldapSyntaxDescription ) throws ParseException
     {
-        return super.parse( ldapSyntaxDescription );
-    }
+        LdapSyntax ldapSyntax = fastParser.parseLdapSyntax( ldapSyntaxDescription );
+        ldapSyntax.setSpecification( ldapSyntaxDescription );
 
+        // Update the schemaName
+        updateSchemaName( ldapSyntax );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected LdapSyntax doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.ldapSyntaxDescription();
+        return ldapSyntax;
     }
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleDescriptionSchemaParser.java
index 103fe2b..6ecc3a7 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.MatchingRule;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 matching rule descriptions.
@@ -65,19 +62,14 @@ public class MatchingRuleDescriptionSchemaParser extends AbstractSchemaParser<Ma
      * @return the parsed MatchingRuleDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public MatchingRule parseMatchingRuleDescription( String matchingRuleDescription ) throws ParseException
+    public MatchingRule parse( String matchingRuleDescription ) throws ParseException
     {
-        return super.parse( matchingRuleDescription );
-    }
+        MatchingRule matchingRule = fastParser.parseMatchingRule( matchingRuleDescription );
+        matchingRule.setSpecification( matchingRuleDescription );
 
+        // Update the schemaName
+        updateSchemaName( matchingRule );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected MatchingRule doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.matchingRuleDescription();
+        return matchingRule;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleUseDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleUseDescriptionSchemaParser.java
index b8b5f15..41a9f1e 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleUseDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/MatchingRuleUseDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.MatchingRuleUse;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 matching rule use descriptions.
@@ -66,19 +63,14 @@ public class MatchingRuleUseDescriptionSchemaParser extends AbstractSchemaParser
      * @return the parsed MatchingRuleUseDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public MatchingRuleUse parseMatchingRuleUseDescription( String matchingRuleUseDescription ) throws ParseException
+    public MatchingRuleUse parse( String matchingRuleUseDescription ) throws ParseException
     {
-        return super.parse( matchingRuleUseDescription );
-    }
+        MatchingRuleUse matchingRuleUse = fastParser.parseMatchingRuleUse( matchingRuleUseDescription );
+        matchingRuleUse.setSpecification( matchingRuleUseDescription );
 
+        // Update the schemaName
+        updateSchemaName( matchingRuleUse );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected MatchingRuleUse doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.matchingRuleUseDescription();
+        return matchingRuleUse;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NameFormDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NameFormDescriptionSchemaParser.java
index 4d81cf7..c9c1911 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NameFormDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NameFormDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.NameForm;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 name form descriptions
@@ -65,19 +62,14 @@ public class NameFormDescriptionSchemaParser extends AbstractSchemaParser<NameFo
      * @return the parsed NameForm bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public NameForm parseNameFormDescription( String nameFormDescription ) throws ParseException
+    public NameForm parse( String nameFormDescription ) throws ParseException
     {
-        return super.parse( nameFormDescription );
-    }
+        NameForm nameForm = fastParser.parseNameForm( nameFormDescription );
+        nameForm.setSpecification( nameFormDescription );
 
+        // Update the schemaName
+        updateSchemaName( nameForm );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected NameForm doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.nameFormDescription();
+        return nameForm;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NormalizerDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NormalizerDescriptionSchemaParser.java
index defacda..a10463f 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NormalizerDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/NormalizerDescriptionSchemaParser.java
@@ -24,9 +24,6 @@ import java.text.ParseException;
 
 import org.apache.directory.api.i18n.I18n;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for ApacheDS normalizer descriptions.
@@ -69,19 +66,14 @@ public class NormalizerDescriptionSchemaParser extends AbstractSchemaParser<Norm
      * @return the parsed NormalizerDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public NormalizerDescription parseNormalizerDescription( String normalizerDescription ) throws ParseException
+    public NormalizerDescription parse( String normalizerDescription ) throws ParseException
     {
-        return super.parse( normalizerDescription );
-    }
+        NormalizerDescription normalizer = fastParser.parseNormalizer( normalizerDescription );
+        normalizer.setSpecification( normalizerDescription );
 
+        // Update the schemaName
+        updateSchemaName( normalizer );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected NormalizerDescription doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.normalizerDescription();
+        return normalizer;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ObjectClassDescriptionSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ObjectClassDescriptionSchemaParser.java
index e9ca3bd..1b96a49 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ObjectClassDescriptionSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/ObjectClassDescriptionSchemaParser.java
@@ -25,9 +25,6 @@ import java.text.ParseException;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.model.schema.ObjectClass;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
 
 /**
  * A parser for RFC 4512 object class descriptons
@@ -71,19 +68,14 @@ public class ObjectClassDescriptionSchemaParser extends AbstractSchemaParser<Obj
      * @return the parsed ObjectClassDescription bean
      * @throws ParseException if there are any recognition errors (bad syntax)
      */
-    public ObjectClass parseObjectClassDescription( String objectClassDescription ) throws ParseException
+    public ObjectClass parse( String objectClassDescription ) throws ParseException
     {
-        return super.parse( objectClassDescription );
-    }
+        ObjectClass objectClass = fastParser.parseObjectClass( objectClassDescription );
+        objectClass.setSpecification( objectClassDescription );
 
+        // Update the schemaName
+        updateSchemaName( objectClass );
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected ObjectClass doParse() throws RecognitionException, TokenStreamException
-    {
-        return parser.objectClassDescription();
+        return objectClass;
     }
-
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java
index 354e1b7..a77a21f 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/parsers/OpenLdapSchemaParser.java
@@ -20,10 +20,13 @@
 package org.apache.directory.api.ldap.model.schema.parsers;
 
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -33,29 +36,47 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.directory.api.asn1.util.Oid;
 import org.apache.directory.api.i18n.I18n;
+import org.apache.directory.api.ldap.model.exception.LdapSchemaException;
+import org.apache.directory.api.ldap.model.ldif.LdapLdifException;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
+import org.apache.directory.api.ldap.model.schema.DitContentRule;
+import org.apache.directory.api.ldap.model.schema.DitStructureRule;
+import org.apache.directory.api.ldap.model.schema.LdapSyntax;
+import org.apache.directory.api.ldap.model.schema.MatchingRule;
+import org.apache.directory.api.ldap.model.schema.MatchingRuleUse;
 import org.apache.directory.api.ldap.model.schema.MutableAttributeType;
+import org.apache.directory.api.ldap.model.schema.MutableMatchingRule;
+import org.apache.directory.api.ldap.model.schema.MutableObjectClass;
+import org.apache.directory.api.ldap.model.schema.NameForm;
 import org.apache.directory.api.ldap.model.schema.ObjectClass;
+import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
 import org.apache.directory.api.ldap.model.schema.SchemaObject;
+import org.apache.directory.api.ldap.model.schema.UsageEnum;
 import org.apache.directory.api.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
 import org.apache.directory.api.util.Strings;
-
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * A reusable wrapper for antlr generated OpenLDAP schema parsers.
+ * A reusable wrapper for hand parser OpenLDAP schema.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
+public class OpenLdapSchemaParser
 {
+    /** The LoggerFactory used by this class */
+    protected static final Logger LOG = LoggerFactory.getLogger( OpenLdapSchemaParser.class );
+
+    /** A flag used to tell the parser if it should be strict or not */
+    private boolean isQuirksModeEnabled = false;
+
+    /** the number of the current line being parsed by the reader */
+    protected int lineNumber;
 
     /** The list of parsed schema descriptions */
-    private List<Object> schemaDescriptions;
+    private List<Object> schemaDescriptions = new ArrayList<>();
 
     /** The list of attribute type, initialized by splitParsedSchemaDescriptions() */
     private List<MutableAttributeType> attributeTypes;
@@ -64,32 +85,406 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
     private List<ObjectClass> objectClasses;
 
     /** The map of object identifier macros, initialized by splitParsedSchemaDescriptions()*/
-    private Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros;
+    private Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros = new HashMap<>();
+    
+    /** Some contant strings used in descriptions */
+    private static final String APPLIES_STR                 = "APPLIES";
+    private static final String ABSTRACT_STR                = "ABSTRACT";
+    private static final String AUX_STR                     = "AUX";
+    private static final String AUXILIARY_STR               = "AUXILIARY";
+    private static final String BYTECODE_STR                = "BYTECODE";
+    private static final String COLLECTIVE_STR              = "COLLECTIVE";
+    private static final String DESC_STR                    = "DESC";
+    private static final String EQUALITY_STR                = "EQUALITY";
+    private static final String FORM_STR                    = "FORM";
+    private static final String FQCN_STR                    = "FQCN";
+    private static final String MAY_STR                     = "MAY";
+    private static final String MUST_STR                    = "MUST";
+    private static final String NAME_STR                    = "NAME";
+    private static final String NO_USER_MODIFICATION_STR    = "NO-USER-MODIFICATION";
+    private static final String NOT_STR                     = "NOT";
+    private static final String OBSOLETE_STR                = "OBSOLETE";
+    private static final String OC_STR                      = "OC";
+    private static final String ORDERING_STR                = "ORDERING";
+    private static final String SINGLE_VALUE_STR            = "SINGLE-VALUE";
+    private static final String STRUCTURAL_STR              = "STRUCTURAL";
+    private static final String SUBSTR_STR                  = "SUBSTR";
+    private static final String SUP_STR                     = "SUP";
+    private static final String SYNTAX_STR                  = "SYNTAX";
+    private static final String USAGE_STR                   = "USAGE";
+    private static final String EXTENSION_PREFIX            = "X-";
+    
+    /** Usage */
+    private static final String DIRECTORY_OPERATION_STR     = "directoryOperation";
+    private static final String DISTRIBUTED_OPERATION_STR   = "distributedOperation";
+    private static final String DSA_OPERATION_STR           = "dSAOperation";
+    private static final String USER_APPLICATIONS_STR       = "userApplications";
+
+    /** Tokens */
+    private static final char COLON         = ':';
+    private static final char DOLLAR        = '$';
+    private static final char DOT           = '.';
+    private static final char EQUAL         = '=';
+    private static final char ESCAPE        = '\\';
+    private static final char HYPHEN        = '-';
+    private static final char LBRACE        = '{';
+    private static final char LPAREN        = '(';
+    private static final char PLUS          = '+';
+    private static final char RBRACE        = '}';
+    private static final char RPAREN        = ')';
+    private static final char SEMI_COLON    = ';';
+    private static final char SHARP         = '#';
+    private static final char SLASH         = '/';
+    private static final char SQUOTE        = '\'';
+    private static final char UNDERSCORE    = '_';
+    private static final char DQUOTE        = '"';
+
 
     /** Flag whether object identifier macros should be resolved. */
     private boolean isResolveObjectIdentifierMacros;
+    
+    private static final boolean UN_QUOTED = false;
+    
+    /** Flag for strict or relaxed mode */
+    private static final boolean STRICT = false;
+    private static final boolean RELAXED = true;
+    
+    private class PosSchema
+    {
+        /** The line number in the file */
+        int lineNumber;
+        
+        /** The position in the current line */
+        int start;
+        
+        /** The line being processed */
+        String line;
+        
+        /**
+         * {@inheritDoc} 
+         */
+        @Override
+        public String toString()
+        {
+            if ( line == null )
+            {
+                return "null";
+            }
+            else if ( line.length() < start )
+            {
+                return "EOL";
+            }
+            else
+            {
+                return line.substring( start ); 
+            }
+        }
+    }
 
 
+    private interface SchemaObjectElements
+    {
+        int getValue();
+    }
+
+    
     /**
-     * Creates a reusable instance of an OpenLdapSchemaParser.
-     *
-     * @throws IOException if the pipe cannot be formed
+     * The list of AttributeTypeDescription elements that can be seen 
      */
-    public OpenLdapSchemaParser() throws IOException
+    private enum AttributeTypeElements implements SchemaObjectElements
     {
-        super( null, null, null, null );
-        isResolveObjectIdentifierMacros = true;
-        super.setQuirksMode( true );
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        SUP(8),
+        EQUALITY(16),
+        ORDERING(32),
+        SUBSTR(64),
+        SYNTAX(128),
+        SINGLE_VALUE(256),
+        COLLECTIVE(512),
+        NO_USER_MODIFICATION(1024),
+        USAGE(2048);
+        
+        private int value;
+        
+        AttributeTypeElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+    
+    
+    /**
+     * The list of DitContentRuleDescription elements that can be seen 
+     */
+    private enum DitContentRuleElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        AUX(8),
+        MUST(16),
+        MAY(32),
+        NOT(64);
+        
+        private int value;
+        
+        DitContentRuleElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+
+    /**
+     * The list of DitStructureRuleDescription elements that can be seen 
+     */
+    private enum DitStructureRuleElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        FORM(8),
+        SUP(16);
+        
+        private int value;
+        
+        DitStructureRuleElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+    
+    /**
+     * The list of LdapComparatorDescription elements that can be seen 
+     */
+    private enum LdapComparatorElements implements SchemaObjectElements
+    {
+        DESC(1),
+        FQCN(2),
+        BYTECODE(4);
+        
+        private int value;
+        
+        LdapComparatorElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+    
+    /**
+     * The list of LdapSyntaxDescription elements that can be seen 
+     */
+    private enum LdapSyntaxElements implements SchemaObjectElements
+    {
+        DESC(1);
+        
+        private int value;
+        
+        LdapSyntaxElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+
+    /**
+     * The list of MatchingRuleDescription elements that can be seen 
+     */
+    private enum MatchingRuleElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        SYNTAX(8);
+        
+        private int value;
+        
+        MatchingRuleElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+    
+    /**
+     * The list of MatchingRuleUseDescription elements that can be seen 
+     */
+    private enum MatchingRuleUseElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        APPLIES(8);
+        
+        private int value;
+        
+        MatchingRuleUseElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+    
+    /**
+     * The list of NameFormDescription elements that can be seen 
+     */
+    private enum NameFormElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        OC(8),
+        MUST(16),
+        MAY(32);
+        
+        private int value;
+        
+        NameFormElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+
+    /**
+     * The list of NormalizerDescription elements that can be seen 
+     */
+    private enum NormalizerElements implements SchemaObjectElements
+    {
+        DESC(1),
+        FQCN(2),
+        BYTECODE(4);
+        
+        private int value;
+        
+        NormalizerElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+
+    /**
+     * The list of ObjectClassDescription elements that can be seen 
+     */
+    private enum ObjectClassElements implements SchemaObjectElements
+    {
+        NAME(1),
+        DESC(2),
+        OBSOLETE(4),
+        SUP(8),
+        MUST(16),
+        MAY(32),
+        ABSTRACT(64),
+        STRUCTURAL(64),
+        AUXILIARY(64);
+        
+        private int value;
+        
+        ObjectClassElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
+    }
+
+
+    /**
+     * The list of SyntaxCheckerDescription elements that can be seen 
+     */
+    private enum SyntaxCheckerElements implements SchemaObjectElements
+    {
+        DESC(1),
+        FQCN(2),
+        BYTECODE(4);
+        
+        private int value;
+        
+        SyntaxCheckerElements( int value )
+        {
+            this.value = value;
+        }
+        
+        
+        public int getValue()
+        {
+            return value;
+        }
     }
 
 
     /**
-     * {@inheritDoc}
+     * Creates a reusable instance of an OpenLdapSchemaParser.
+     *
+     * @throws IOException if the pipe cannot be formed
      */
-    @Override
-    protected SchemaObject doParse() throws RecognitionException, TokenStreamException
+    public OpenLdapSchemaParser()
     {
-        throw new UnsupportedOperationException( I18n.err( I18n.ERR_13715_OPENLDAP_PARSER_NON_STANDARD ) );
+        isResolveObjectIdentifierMacros = true;
+        isQuirksModeEnabled = false;
     }
 
 
@@ -98,6 +493,25 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
      */
     public void clear()
     {
+        if ( attributeTypes != null )
+        {
+            attributeTypes.clear();
+        }
+        
+        if ( objectClasses != null )
+        {
+            objectClasses.clear();
+        }
+        
+        if ( schemaDescriptions != null )
+        {
+            schemaDescriptions.clear();
+        }
+    
+        if ( objectIdentifierMacros != null )
+        {
+            objectIdentifierMacros.clear();
+        }
     }
 
 
@@ -117,7 +531,7 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
      * 
      * @return the object class types
      */
-    public List<ObjectClass> getObjectClassTypes()
+    public List<ObjectClass> getObjectClasses()
     {
         return objectClasses;
     }
@@ -144,7 +558,6 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
     {
         objectClasses = new ArrayList<>();
         attributeTypes = new ArrayList<>();
-        objectIdentifierMacros = new HashMap<>();
 
         // split parsed schema descriptions
         for ( Object obj : schemaDescriptions )
@@ -195,7 +608,7 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
 
     private String getResolveOid( String oid )
     {
-        if ( oid != null && oid.indexOf( ':' ) != -1 )
+        if ( oid != null && oid.indexOf( COLON ) != -1 )
         {
             // resolve OID
             String[] nameAndSuffix = oid.split( ":" );
@@ -203,6 +616,7 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
             if ( objectIdentifierMacros.containsKey( nameAndSuffix[0] ) )
             {
                 OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( nameAndSuffix[0] );
+                
                 return macro.getResolvedOid() + "." + nameAndSuffix[1];
             }
         }
@@ -220,7 +634,7 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
             // finished
             return;
         }
-        else if ( rawOidOrNameSuffix.indexOf( ':' ) != -1 )
+        else if ( rawOidOrNameSuffix.indexOf( COLON ) != -1 )
         {
             // resolve OID
             String[] nameAndSuffix = rawOidOrNameSuffix.split( ":" );
@@ -261,17 +675,22 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
      * @return the schema object
      * @throws ParseException If the schemaObject can't be parsed
      */
-    @Override
     public SchemaObject parse( String schemaObject ) throws ParseException
     {
         if ( ( schemaObject == null ) || Strings.isEmpty( schemaObject.trim() ) )
         {
             throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
         }
-
-        // reset and initialize the parser / lexer pair
-        reset( schemaObject );
-        invokeParser( schemaObject );
+        
+        try ( Reader reader = new BufferedReader( new StringReader( schemaObject ) ) )
+        {
+            parse( reader );
+            afterParse();
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
 
         if ( !schemaDescriptions.isEmpty() )
         {
@@ -288,69 +707,5579 @@ public class OpenLdapSchemaParser extends AbstractSchemaParser<SchemaObject>
     }
 
 
-    private void invokeParser( String subject ) throws ParseException
-    {
-        try
-        {
-            monitor.startedParse( "starting parse on:\n" + subject );
-            schemaDescriptions = parser.openLdapSchema();
-            afterParse();
-            monitor.finishedParse( "Done parsing!" );
-        }
-        catch ( RecognitionException re )
-        {
-            String msg = I18n.err( I18n.ERR_15003_PARSER_FAILURE, subject, ExceptionUtils.getFullStackTrace( re ) );
-            throw new ParseException( msg, re.getColumn() );
-        }
-        catch ( TokenStreamException tse )
-        {
-            String msg = I18n.err( I18n.ERR_15003_PARSER_FAILURE, subject, ExceptionUtils.getFullStackTrace( tse ) );
-            throw new ParseException( msg, 0 );
-        }
-    }
-
-
     /**
      * Parses a stream of OpenLDAP schemaObject elements/objects. Default charset is used.
      *
      * @param schemaIn a stream of schema objects
-     * @throws IOException If the schemaObject can't be transformed to a byteArrayInputStream
-     * @throws ParseException If the schemaObject can't be parsed
+     * @throws Exception 
      */
-    public void parse( InputStream schemaIn ) throws IOException, ParseException
+    public void parse( InputStream schemaIn ) throws Exception
     {
-        InputStreamReader in = new InputStreamReader( schemaIn, Charset.defaultCharset() );
-        lexer.prepareNextInput( in );
-        parser.resetState();
-
-        invokeParser( "schema input stream ==> " + schemaIn.toString() );
+        try ( InputStreamReader in = new InputStreamReader( schemaIn, Charset.defaultCharset() ) )
+        {
+            try ( Reader reader = new BufferedReader( in ) )
+            {
+                parse( reader );
+                afterParse();
+            }
+        }
     }
+    
+    
+    private static void skipWhites( Reader reader, PosSchema pos, boolean mandatory ) throws IOException, LdapSchemaException
+    {
+        boolean hasSpace = false;
+        
+        while ( true )
+        {
+            if ( isEmpty( pos ) )
+            {
+                getLine( reader, pos );
+                
+                if ( pos.line == null )
+                {
+                    return;
+                }
+                
+                hasSpace = true;
+                continue;
+            }
+            
+            if ( pos.line == null )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13782_END_OF_FILE, pos.lineNumber, pos.start ) );
+            }
+            
+            while ( Character.isWhitespace( pos.line.charAt( pos.start ) ) )
+            {
+                hasSpace = true;
+                pos.start++;
+                
+                if ( isEmpty( pos ) )
+                {
+                    getLine( reader, pos );
 
+                    if ( pos.line == null )
+                    {
+                        return;
+                    }
+                    
+                    continue;
+                }
+            }
+            
+            if ( pos.line.charAt( pos.start ) == SHARP )
+            {
+                getLine( reader, pos );
 
-    /**
-     * Parses a file of OpenLDAP schemaObject elements/objects. Default charset is used.
-     *
-     * @param schemaFile a file of schema objects
-     * @throws IOException If the schemaObject can't be transformed to a byteArrayInputStream
-     * @throws ParseException If the schemaObject can't be parsed
-     */
-    public void parse( File schemaFile ) throws IOException, ParseException
+                if ( pos.line == null )
+                {
+                    return;
+                }
+                
+                hasSpace = true;
+                continue;
+            }
+            else
+            {
+                if ( mandatory && !hasSpace )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13783_SPACE_EXPECTED, pos.lineNumber, pos.start ) );
+                }
+                else
+                {
+                    return;
+                }
+            }
+        }
+    }
+    
+    
+    private static boolean isComment( PosSchema pos )
     {
-        InputStreamReader in = new InputStreamReader(
-            Files.newInputStream( Paths.get( schemaFile.getPath() ) ), Charset.defaultCharset() );
-        lexer.prepareNextInput( in );
-        parser.resetState();
-
-        invokeParser( "schema file ==> " + schemaFile.getAbsolutePath() );
+        if ( isEmpty( pos ) )
+        {
+            return true;
+        }
+        
+        return pos.line.charAt( pos.start ) == SHARP;
     }
-
-
-    /**
-     * Checks if object identifier macros should be resolved.
-     * 
-     * @return true, object identifier macros should be resolved.
-     */
-    public boolean isResolveObjectIdentifierMacros()
+    
+    
+    private static boolean isEmpty( PosSchema pos )
+    {
+        return ( pos.line == null ) || ( pos.start >= pos.line.length() );
+    }
+    
+    
+    private static boolean startsWith( PosSchema pos, String text )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < text.length() ) )
+        {
+            return false;
+        }
+        
+        return text.equalsIgnoreCase( pos.line.substring( pos.start, pos.start + text.length() ) );
+    }
+    
+    
+    private static boolean startsWith( Reader reader, PosSchema pos, char c ) throws IOException, LdapSchemaException
+    {
+        return startsWith( reader, pos, c, UN_QUOTED );
+    }
+    
+    
+    private static boolean startsWith( Reader reader, PosSchema pos, char c, boolean quoted ) throws IOException, LdapSchemaException
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return false;
+        }
+        
+        if ( quoted )
+        {
+            // Don't read a new line when we are within quotes
+            return pos.line.charAt( pos.start ) == c;
+        }
+
+        while ( isEmpty( pos ) || ( isComment( pos ) ) )
+        {
+            getLine( reader, pos );
+            
+            if ( pos.line == null )
+            {
+                return false;
+            }
+            
+            skipWhites( reader, pos, false );
+            
+            if ( isComment( pos ) )
+            {
+                continue;
+            }
+        }
+        
+        return pos.line.charAt( pos.start ) == c;
+    }
+    
+    
+    private static boolean startsWith( PosSchema pos, char c )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return false;
+        }
+        
+        return pos.line.charAt( pos.start ) == c;
+    }
+
+    
+    private static boolean isAlpha( PosSchema pos )
+    {
+        return Character.isAlphabetic( pos.line.charAt( pos.start ) );
+    }
+    
+    
+    private static boolean isDigit( PosSchema pos )
+    {
+        return Character.isDigit( pos.line.charAt( pos.start ) );
+    }
+
+    
+    private static void getLine( Reader reader, PosSchema pos ) throws IOException
+    {
+        pos.line = ( ( BufferedReader ) reader ).readLine();
+        pos.start = 0;
+        
+        if ( pos.line != null )
+        {
+            pos.lineNumber++;
+        }
+    }
+    
+    
+    /**
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     */
+    private static String getNumericOid( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+        boolean isDot = false;
+        boolean isFirstZero = false;
+        boolean isFirstDigit = true; 
+        
+        while ( !isEmpty( pos ) )
+        {
+            char c = pos.line.charAt( pos.start );
+            
+            if ( Character.isDigit( c ) )
+            {
+                if ( isFirstZero )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13784_BAD_OID_TWO_ZEROES, pos.lineNumber, pos.start ) );
+                }
+                    
+                if ( ( pos.line.charAt( pos.start ) == '0' ) && isFirstDigit )
+                {
+                    isFirstZero = true;
+                }
+                
+                isDot = false;
+                pos.start++;
+                isFirstDigit = false;
+            }
+            else if ( c == DOT )
+            {
+                if ( isDot )
+                {
+                    // We can't have two consecutive dots or a dot at the beginning
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13785_BAD_OID_CONSECUTIVE_DOTS, pos.lineNumber, pos.start ) );
+                }
+                
+                isFirstZero = false;
+                isFirstDigit = true;
+                pos.start++;
+                isDot = true;
+            }
+            else
+            {
+                break;
+            }
+        }
+        
+        if ( isDot )
+        {
+            // We can't have two consecutive dots or a dot at the beginning
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13786_BAD_OID_DOT_AT_THE_END, pos.lineNumber, pos.start ) );
+        }
+
+        String oidStr = pos.line.substring( start, pos.start );
+
+        if ( Oid.isOid( oidStr ) )
+        {
+            return oidStr;
+        }
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.line, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * partialNumericoid   ::= number ( DOT number )*
+     * number              ::= DIGIT | LDIGIT DIGIT+
+     * DIGIT               ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT              ::= %x31-39             ; "1"-"9"
+     * DOT                 ::= %x2E                ; period (".")
+     */
+    private static String getPartialNumericOid( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+        boolean isDot = false;
+        boolean isFirstZero = false;
+        boolean isFirstDigit = true; 
+        
+        while ( !isEmpty( pos ) )
+        {
+            if ( isDigit( pos ) )
+            {
+                if ( isFirstZero )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13784_BAD_OID_TWO_ZEROES, pos.lineNumber, pos.start ) );
+                }
+                    
+                if ( ( pos.line.charAt( pos.start ) == '0' ) && isFirstDigit )
+                {
+                    isFirstZero = true;
+                }
+                
+                isDot = false;
+                pos.start++;
+                isFirstDigit = false;
+            }
+            else if ( startsWith( pos, DOT ) )
+            {
+                if ( isDot )
+                {
+                    // We can't have two consecutive dots or a dot at the beginning
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13785_BAD_OID_CONSECUTIVE_DOTS, pos.lineNumber, pos.start ) );
+                }
+                
+                isFirstZero = false;
+                isFirstDigit = true;
+                pos.start++;
+                isDot = true;
+            }
+            else
+            {
+                break;
+            }
+        }
+        
+        if ( isDot )
+        {
+            // We can't have two consecutive dots or a dot at the beginning
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13786_BAD_OID_DOT_AT_THE_END, pos.lineNumber, pos.start ) );
+        }
+
+        return pos.line.substring( start, pos.start );
+    }
+
+    
+
+    
+    /**
+     * In relaxed mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= descrQ (COLON numericoid)
+     * descrQ       ::= keystringQ
+     * keystringQ   ::= LkeycharQ keycharQ*
+     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre>
+     */
+    private static String getOidAndMacroRelaxed( PosSchema pos, 
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            return "";
+        }
+
+        // This is a OID name
+        int start = pos.start;
+        char c = pos.line.charAt( pos.start );
+        boolean isDigit = Character.isDigit( c );
+        
+        while ( isDigit || Character.isAlphabetic( c ) || ( c == HYPHEN ) || ( c == UNDERSCORE )
+            || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == SHARP ) )
+        {
+            pos.start++;
+            
+            if ( isEmpty( pos ) )
+            {
+                break;
+            }
+            
+            c = pos.line.charAt( pos.start );
+            isDigit = Character.isDigit( c );
+        }
+        
+        String oidName = pos.line.substring( start, pos.start  );
+        
+        if ( Strings.isEmpty( oidName ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        // We may have a ':' followed by an OID
+        if ( startsWith( pos, COLON ) )
+        {
+            pos.start++;
+            String oid = getPartialNumericOid( pos );
+            
+            return objectIdentifierMacros.get( oidName ).getRawOidOrNameSuffix() + DOT + oid;
+        }
+        else
+        {
+            // Ok, we may just have an oidName
+            OpenLdapObjectIdentifierMacro macro = objectIdentifierMacros.get( oidName );
+            
+            if ( macro == null )
+            {
+                return oidName;
+            }
+            else
+            {
+                return macro.getRawOidOrNameSuffix();
+            }
+        }
+    }
+
+    
+    /**
+     * In normal mode :
+     * <pre>
+     * oid          ::= descr | numericoid
+     * descr        ::= keystring
+     * keystring    ::= leadkeychar keychar*
+     * leadkeychar  ::= ALPHA
+     * keychar      ::= ALPHA | DIGIT | HYPHEN
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * </pre>
+     */
+    private static String getOidStrict( PosSchema pos ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            return "";
+        }
+
+        if ( isAlpha( pos ) )
+        {
+            // A descr
+            return getDescrStrict( pos );
+        }
+        else if ( isDigit( pos ) )
+        {
+            // This is a numeric oid
+            return getNumericOid( pos );
+        }
+        else
+        {
+            // This is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+    }
+
+    
+    /**
+     * In quirks mode :
+     * <pre>
+     * oid          ::= descr-relaxed | numericoid | SQUOTE descr-relaxed SQUOTE |
+     *                  DQUOTE descr-relaxed DQUOTE | SQUOTE numericoid SQUOTE |
+     *                  DQUOTE numericoid DQUOTE
+     * descr-relaxed::= macro (COLON numericoid)
+     * macro        ::= keystring
+     * keystring    ::= Lkeychar  keychar*
+     * Lkeychar     ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keychar      ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre>
+     */
+    private static String getOidRelaxed( PosSchema pos, boolean hadQuote ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            return "";
+        }
+        
+        boolean hasQuote = false;
+
+        char c = pos.line.charAt( pos.start );
+        
+        if ( c == SQUOTE )
+        {
+            if ( hadQuote )
+            {
+                return "";
+            }
+            
+            hasQuote = true;
+            pos.start++;
+
+            if ( isEmpty( pos ) )
+            {
+                return "";
+            }
+            
+            c = pos.line.charAt( pos.start );
+        }
+        
+        String oid;
+
+        if ( Character.isAlphabetic( c ) )
+        {
+            // This is a OID name
+            oid = getDescrRelaxed( pos );
+        }
+        else if ( Character.isDigit( c ) )
+        {
+            // This is a numeric oid
+            oid = getNumericOid( pos );
+        }
+        else
+        {
+            // This is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        if ( isEmpty( pos ) )
+        {
+            if ( hasQuote || hadQuote )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+            else
+            {
+                return oid;
+            }
+        }
+        
+        c = pos.line.charAt( pos.start );
+        
+        if ( ( c == SQUOTE ) && !hadQuote )
+        {
+           if ( hasQuote )
+           {
+               pos.start++;
+           }
+           else
+           {
+               throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                   pos.lineNumber, pos.start ) );
+           }
+        }
+        
+        return oid;
+    }
+    
+    
+    /**
+     * In strict mode :
+     * 
+     * <pre>
+     * descr        ::= keystring
+     * keystring    ::= leadkeychar keychar*
+     * leadkeychar  ::= ALPHA
+     * keychar      ::= ALPHA | DIGIT | HYPHEN
+     * numericoid   ::= number ( DOT number )+ |
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * DOT          ::= %x2E                ; period (".")
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * </pre>
+     */
+    private static String getDescrStrict( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+        boolean isFirst = true;
+        
+        while ( !isEmpty( pos ) )
+        {
+            if ( isFirst )
+            {
+                isFirst = false;
+                
+                if ( isAlpha( pos ) ) 
+                {
+                    // leadkeychar
+                    pos.start++;
+                }
+                else
+                {
+                    // Error, we are expecting a leadKeychar
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                        pos.lineNumber, pos.start ) );
+                }
+            }
+            else
+            {
+                char c = pos.line.charAt( pos.start );
+                
+                if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == HYPHEN ) )
+                {
+                    pos.start++;
+                }
+                else
+                {
+                    // We are done 
+                    return pos.line.substring( start, pos.start );
+                }
+            }
+        }
+
+        return pos.line.substring( start, pos.start );
+    }
+    
+    
+    
+    /**
+     * In quirksMode :
+     * 
+     * <pre>
+     * descr        ::= descrQ (COLON numericoid)
+     * descrQ       ::= keystringQ
+     * keystringQ   ::= LkeycharQ keycharQ*
+     * LkeycharQ    ::= ALPHA | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * keycharQ     ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * numericoid   ::= number ( DOT number )+
+     * number       ::= DIGIT | LDIGIT DIGIT+
+     * ALPHA        ::= %x41-5A | %x61-7A   ; "A"-"Z" / "a"-"z"
+     * DIGIT        ::= %x30 | LDIGIT       ; "0"-"9"
+     * LDIGIT       ::= %x31-39             ; "1"-"9"
+     * HYPHEN       ::= %x2D                ; hyphen ("-")
+     * UNDERSCORE   ::= %x5F                ; underscore ("_")
+     * DOT          ::= %x2E                ; period (".")
+     * COLON        ::= %x3A                ; colon (":")
+     * SEMI_COLON   ::= %x3B                ; semi-colon(";")
+     * SHARP        ::= %x23                ; octothorpe (or sharp sign) ("#")
+     * </pre
+     */
+    private static String getDescrRelaxed( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+        boolean isFirst = true;
+        
+        while ( !isEmpty( pos ) )
+        {
+            if ( isFirst )
+            {
+                isFirst = false;
+                
+                char c = pos.line.charAt( pos.start );
+                
+                if ( Character.isAlphabetic( c ) || ( c == HYPHEN ) || ( c == UNDERSCORE )
+                    || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == COLON ) || ( c == SHARP ) ) 
+                {
+                    // leadkeycharQ
+                    pos.start++;
+                }
+                else
+                {
+                    // Error, we are expecting a leadKeychar
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                        pos.lineNumber, pos.start ) );
+                }
+            }
+            else
+            {
+                char c = pos.line.charAt( pos.start );
+                
+                if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == HYPHEN )
+                    || ( c == UNDERSCORE ) || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == COLON ) || ( c == SHARP ) ) 
+                {
+                    pos.start++;
+                }
+                else
+                {
+                    // We are done 
+                    return pos.line.substring( start, pos.start );
+                }
+            }
+        }
+        
+        return pos.line.substring( start, pos.start );
+    }
+    
+    
+    private String getMacro( PosSchema pos ) throws LdapSchemaException
+    {
+        if ( isQuirksModeEnabled )
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || ( c == HYPHEN ) || ( c == UNDERSCORE ) 
+                        || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == SHARP ) ) 
+                    {
+                        // leadkeycharQ
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == HYPHEN ) 
+                        || ( c == UNDERSCORE ) || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == SHARP ) ) 
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+            
+            return pos.line.substring( start, pos.start );
+        }
+        else
+        {
+            int start = pos.start;
+            boolean isFirst = true;
+            
+            while ( !isEmpty( pos ) )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                    
+                    if ( isAlpha( pos ) ) 
+                    {
+                        // leadkeychar
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // Error, we are expecting a leadKeychar
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                }
+                else
+                {
+                    char c = pos.line.charAt( pos.start );
+                    
+                    if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == HYPHEN ) )
+                    {
+                        pos.start++;
+                    }
+                    else
+                    {
+                        // We are done 
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+
+            return pos.line.substring( start, pos.start );
+        }
+    }
+    
+    
+    /**
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE
+     * descr ::= keystring
+     * keystring ::= leadkeychar *keychar
+     * leadkeychar ::= ALPHA
+     * keychar ::= ALPHA | DIGIT | HYPHEN
+     * </pre>
+     * 
+     * In quirksMode :
+     * 
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE | descr | SQUOTE numericoid SQUOTE
+     * descr ::= keystring
+     * keystring ::= keychar+
+     * keychar ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * </pre>
+     * @throws IOException 
+     */
+    private static String getQDescrStrict( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        // The first quote
+        if ( !startsWith( reader, pos, SQUOTE ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        pos.start++;
+        int start = pos.start;
+        boolean isFirst = true;
+        
+        while ( !startsWith( pos, SQUOTE ) )
+        {
+            if ( isFirst )
+            {
+                isFirst = false;
+                
+                if ( !isEmpty( pos ) && isAlpha( pos ) ) 
+                {
+                    // leadkeychar
+                    pos.start++;
+                }
+                else
+                {
+                    // Error, we are expecting a leadKeychar
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13788_LEAD_KEY_CHAR_EXPECTED, 
+                        pos.lineNumber, pos.start ) );
+                }
+            }
+            else
+            {
+                if ( isEmpty( pos ) )
+                {
+                    // This is an error
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                        pos.lineNumber, pos.start ) );
+                }
+                
+                char c = pos.line.charAt( pos.start );
+                
+                if ( Character.isAlphabetic( c ) || Character.isDigit( c ) || ( c == HYPHEN ) )
+                {
+                    pos.start++;
+                }
+                else
+                {
+                    // This is an error
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13791_KEYCHAR_EXPECTED, c, 
+                        pos.lineNumber, pos.start ) );
+                }
+            }
+        }
+        
+        if ( startsWith( pos, SQUOTE ) )
+        {
+            // We are done, move one char forward to eliminate the simple quote
+            pos.start++;
+            
+            return pos.line.substring( start, pos.start - 1 );
+        }
+        else
+        {
+            // No closing simple quote, this is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE
+     * descr ::= keystring
+     * keystring ::= leadkeychar *keychar
+     * leadkeychar ::= ALPHA
+     * keychar ::= ALPHA | DIGIT | HYPHEN
+     * </pre>
+     * 
+     * In quirksMode :
+     * 
+     * <pre>
+     * qdescr ::== SQUOTE descr SQUOTE | descr | SQUOTE numericoid SQUOTE
+     * descr ::= keystring
+     * keystring ::= keychar+
+     * keychar ::= ALPHA | DIGIT | HYPHEN | UNDERSCORE | SEMI_COLON | DOT | COLON | SHARP 
+     * </pre>
+     * @throws IOException 
+     */
+    private static String getQDescrRelaxed( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        if ( startsWith( reader, pos, SQUOTE ) )
+        {
+            pos.start++;
+            int start = pos.start;
+            
+            while ( !startsWith( pos, SQUOTE ) )
+            {
+                if ( isEmpty( pos ) )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                        pos.lineNumber, pos.start ) );
+                }
+                
+                char c = pos.line.charAt( pos.start );
+                
+                if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == HYPHEN ) || ( c == UNDERSCORE )
+                    || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == COLON ) || ( c == SHARP ) )
+                {
+                    pos.start++;
+                }
+                else if ( c != SQUOTE )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13790_NOT_A_KEYSTRING, pos.lineNumber, pos.start ) );
+                }
+            }
+            
+            pos.start++;
+            
+            return pos.line.substring( start, pos.start - 1 );
+        }
+        else
+        {
+            int start = pos.start;
+            
+            while ( !isEmpty( pos ) )
+            {
+                char c = pos.line.charAt( pos.start );
+
+                if ( Character.isDigit( c ) || Character.isAlphabetic( c ) || ( c == HYPHEN ) || ( c == UNDERSCORE )
+                    || ( c == SEMI_COLON ) || ( c == DOT ) || ( c == COLON ) || ( c == SHARP ) )
+                {
+                    pos.start++;
+                }
+                else
+                {
+                    break;
+                }
+            }
+
+            return pos.line.substring( start, pos.start );
+        }
+    }
+    
+    
+    /**
+     * No relaxed version.
+     * <pre>
+     * qdstring ::== SQUOTE dstring SQUOTE
+     * dstring  ::= ( QS | QQ | QUTF8 )+            ; escaped UTF-8 string
+     * QS       ::= ESC %x35 ( %x43 | %x63 )        ; "\5C" | "\5c", escape char
+     * QQ       ::= ESC %x32 %x37                   ; "\27", simple quote char
+     * QUTF8    ::= QUTF1 | UTFMB
+     * QUTF1    ::= %x00-26 | %x28-5B | %x5D-7F     ; All ascii but ' and \
+     * UTFMB    ::= UTF2 | UTF3 | UTF4
+     * UTF0     ::= %x80-BF
+     * UTF2     ::= %xC2-DF UTF0
+     * UTF3     ::= %xE0 %xA0-BF UTF0 | %xE1-EC UTF0 UTF0 | %xED %x80-9F UTF0 | %xEE-EF UTF0 UTF0
+     * UTF4     ::= %xF0 %x90-BF UTF0 UTF0 | %xF1-F3 UTF0 UTF0 UTF0 | %xF4 %x80-8F UTF0 UTF0
+     * ESC      ::= %x5C                            ; backslash ("\")
+     * </pre>
+     */
+    private static String getQDString( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        // The first quote
+        if ( !startsWith( reader, pos, SQUOTE ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13789_SIMPLE_QUOTE_EXPECTED_AT_START, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        pos.start++;
+        int start = pos.start;
+        int nbEscapes = 0;
+        
+        while ( !isEmpty( pos ) && !startsWith( pos, SQUOTE ) )
+        {
+            // At the moment, just swallow anything
+            if ( startsWith( pos, ESCAPE ) )
+            {
+                nbEscapes++;
+            }
+            
+            pos.start++;
+            
+        }
+        
+        if ( startsWith( pos, SQUOTE ) )
+        {
+            // We are done, move one char forward to eliminate the simple quote
+            pos.start++;
+            
+            // Now, un-escape the escaped chars
+            char[] unescaped = new char[pos.start - 1 - start - nbEscapes * 2];
+            int newPos = 0;
+            
+            for ( int i = start; i < pos.start - 1; i++ )
+            {
+                char c = pos.line.charAt( i );
+                
+                if ( c == ESCAPE )
+                {
+                    if ( i + 2 > pos.start )
+                    {
+                        // Error : not enough hex value
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                    
+                    int u = Character.digit( pos.line.charAt( i + 1 ), 16 );
+                    int l = Character.digit( pos.line.charAt( i + 2 ), 16 );
+
+                    unescaped[newPos] = ( char ) ( ( u << 4 ) + l );
+                    i += 2;
+                }
+                else
+                {
+                    unescaped[newPos] = c;
+                }
+                
+                newPos++;
+            }
+            
+            return new String( unescaped );
+        }
+        else
+        {
+            // No closing simple quote, this is an error
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+
+
+    /**
+     * qdescrs ::= qdescr | LPAREN WSP qdescrlist WSP RPAREN
+     * qdescrlist ::= [ qdescr *( SP qdescr ) ]
+     * qdescr ::== SQUOTE descr SQUOTE
+     * descr ::= keystring
+     * keystring ::= leadkeychar *keychar
+     * leadkeychar ::= ALPHA
+     * keychar ::= ALPHA / DIGIT / HYPHEN
+     * @throws LdapSchemaException 
+     * @throws IOException 
+     */
+    private static List<String> getQDescrs( Reader reader, PosSchema pos, boolean relaxed ) throws LdapSchemaException, IOException
+    {
+        List<String> qdescrs = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, LPAREN ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            
+            while ( !startsWith( reader, pos, RPAREN ) )
+            {
+                String qdescr;
+                
+                if ( relaxed )
+                {
+                    qdescr = getQDescrRelaxed( reader, pos );
+                }
+                else
+                {
+                    qdescr = getQDescrStrict( reader, pos );
+                }
+                
+                qdescrs.add( qdescr );
+                
+                if ( startsWith( reader, pos, RPAREN ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, true );
+            }
+            
+            if ( !startsWith( reader, pos, RPAREN ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            String qDescr;
+            
+            if ( relaxed )
+            {
+                qDescr = getQDescrRelaxed( reader, pos );
+            }
+            else
+            {
+                qDescr = getQDescrStrict( reader, pos );
+            }
+            
+            if ( Strings.isEmpty( qDescr ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13732_NAME_CANNOT_BE_NULL, pos.lineNumber, pos.start ) );
+            }
+            
+            qdescrs.add( qDescr );
+        }
+        
+        return qdescrs;
+    }
+
+
+    /**
+     * <pre>
+     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
+     * qdstringlist ::= qdstring *( SP qdstring )*
+     * qdstring     ::= SQUOTE dstring SQUOTE
+     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
+     * </pre>
+     * @throws LdapSchemaException 
+     * @throws IOException 
+     */
+    private static List<String> getQDStrings( Reader reader, PosSchema pos ) 
+        throws LdapSchemaException, IOException
+    {
+        List<String> qdStrings = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, LPAREN ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            
+            while ( !startsWith( reader, pos, RPAREN ) )
+            {
+                qdStrings.add( getQDString( reader, pos ) );
+                
+                if ( startsWith( reader, pos, RPAREN ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, true );
+            }
+            
+            if ( !startsWith( reader, pos, RPAREN ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            qdStrings.add( getQDString( reader, pos ) );
+        }
+        
+        return qdStrings;
+    }
+
+    
+    /**
+     * <pre>
+     * oids     ::= oid | ( LPAREN WSP oidlist WSP RPAREN )
+     * oidlist  ::= oid *( WSP DOLLAR WSP oid )
+     * </pre>
+     */
+    private static List<String> getOidsStrict( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<String> oids = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, LPAREN ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            boolean moreExpected = false;
+            
+            while ( !startsWith( reader, pos, RPAREN ) )
+            {
+                moreExpected = false;
+                
+                oids.add( getOidStrict( pos ) );
+                
+                if ( startsWith( reader, pos, RPAREN ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, false );
+                
+                if ( startsWith( reader, pos, DOLLAR ) )
+                {
+                    pos.start++;
+                    moreExpected = true;
+                }
+
+                skipWhites( reader, pos, false );
+            }
+            
+            if ( !startsWith( reader, pos, RPAREN ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( moreExpected )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13794_MORE_OIDS_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            oids.add( getOidStrict( pos ) );
+        }
+        
+        return oids;
+    }
+
+    
+    /**
+     * <pre>
+     * oids     ::= oid | ( LPAREN WSP oidlist WSP RPAREN )
+     * oidlist  ::= oid *( WSP DOLLAR WSP oid )
+     * </pre>
+     */
+    private static List<String> getOidsRelaxed( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<String> oids = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, LPAREN ) )
+        {
+            pos.start++;
+            
+            // We have more than a name
+            skipWhites( reader, pos, false );
+            boolean moreExpected = false;
+            
+            while ( !startsWith( reader, pos, RPAREN ) )
+            {
+                moreExpected = false;
+                
+                oids.add( getOidRelaxed( pos, UN_QUOTED ) );
+                
+                if ( startsWith( reader, pos, RPAREN ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, false );
+                
+                if ( startsWith( reader, pos, DOLLAR ) )
+                {
+                    pos.start++;
+                    moreExpected = true;
+                }
+
+                skipWhites( reader, pos, false );
+            }
+            
+            if ( !startsWith( reader, pos, RPAREN ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( moreExpected )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13794_MORE_OIDS_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one name, read it
+            oids.add( getOidRelaxed( pos, UN_QUOTED ) );
+        }
+        
+        return oids;
+    }
+
+    
+    /**
+     * noidlen = oidStrict [ LCURLY len RCURLY ]
+     */
+    private static void getNoidLenStrict( MutableAttributeType attributeType, PosSchema pos ) throws LdapSchemaException
+    {
+        // Get the oid
+        String oid = getOidStrict( pos );
+        
+        if ( oid.length() == 0 )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13828_MISSING_SYNTAX_OID, pos.line, pos.start ) );
+        }
+        
+        attributeType.setSyntaxOid( oid );
+
+        // Then the len, if any
+        if ( startsWith( pos, LBRACE ) )
+        {
+            pos.start++;
+            int start = pos.start;
+            
+            while ( !isEmpty( pos ) && isDigit( pos ) )
+            {
+                pos.start++;
+            }
+            
+            if ( startsWith( pos, RBRACE ) )
+            {
+                String lenStr = pos.line.substring( start, pos.start );
+                
+                if ( lenStr.length() == 0 )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13827_EMPTY_SYNTAX_LEN, pos.line, pos.start ) );
+                }
+                
+                pos.start++;
+                
+                if ( Strings.isEmpty( lenStr ) )
+                {
+                    attributeType.setSyntaxLength( -1L );
+                }
+                else
+                {
+                    attributeType.setSyntaxLength( Long.parseLong( lenStr ) );
+                }
+            }
+            else
+            {
+                // The opening curly hasn't been closed
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13795_OPENED_BRACKET_NOT_CLOSED, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+    }
+
+    
+    /**
+     * noidlen = oidRelaxed [ LCURLY len RCURLY ]
+     */
+    private static void getNoidLenRelaxed( MutableAttributeType attributeType, PosSchema pos ) throws LdapSchemaException
+    {
+        // Check for quotes
+        boolean hasQuote = false;
+
+        char c = pos.line.charAt( pos.start );
+        
+        if ( c == SQUOTE )
+        {
+            hasQuote = true;
+            pos.start++;
+
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+
+        // Get the oid
+        String oid = getOidRelaxed( pos, hasQuote );
+        
+        if ( oid.length() == 0 )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13828_MISSING_SYNTAX_OID, pos.line, pos.start ) );
+        }
+        
+        attributeType.setSyntaxOid( oid );
+
+        // Then the len, if any
+        if ( startsWith( pos, LBRACE ) )
+        {
+            pos.start++;
+            int start = pos.start;
+            
+            while ( !isEmpty( pos ) && isDigit( pos ) )
+            {
+                pos.start++;
+            }
+            
+            if ( startsWith( pos, RBRACE ) )
+            {
+                String lenStr = pos.line.substring( start, pos.start );
+                
+                pos.start++;
+                
+                if ( Strings.isEmpty( lenStr ) )
+                {
+                    attributeType.setSyntaxLength( -1L );
+                }
+                else
+                {
+                    attributeType.setSyntaxLength( Long.parseLong( lenStr ) );
+                }
+            }
+            else
+            {
+                // The opening curly hasn't been closed
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13795_OPENED_BRACKET_NOT_CLOSED, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        if ( hasQuote )
+        {
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            c = pos.line.charAt( pos.start );
+            
+            if ( c == SQUOTE )
+            {
+               pos.start++;
+           }
+           else
+           {
+               throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                   pos.lineNumber, pos.start ) );
+           }
+        }
+    }
+    
+
+    
+    /**
+     * <pre>
+     * ruleid ::= number
+     * number ::= DIGIT | LDIGIT DIGIT+
+     * DIGIT  ::= [0-9]
+     * LDIGIT ::= [1-9]
+     */
+    private static int getRuleId( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+
+        while ( !isEmpty( pos ) && isDigit( pos ) )
+        {
+            pos.start++;
+        }
+        
+        if ( start == pos.start )
+        {
+            // No ruleID
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13811_INVALID_RULE_ID, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        String lenStr = pos.line.substring( start, pos.start );
+        
+        return Integer.parseInt( lenStr );
+    }
+
+    
+    /**
+     * <pre>
+     * ruleids      ::= ruleid | ( LPAREN WSP ruleidlist WSP RPAREN )
+     * ruleidlist   ::= ruleid ( SP ruleid )*
+     * </pre>
+     */
+    private static List<Integer> getRuleIds( Reader reader, PosSchema pos ) throws LdapSchemaException, IOException
+    {
+        List<Integer> ruleIds = new ArrayList<>();
+        
+        // It may start with a '('
+        if ( startsWith( reader, pos, LPAREN ) )
+        {
+            pos.start++;
+            
+            // We may have more than a ruleid
+            skipWhites( reader, pos, false );
+            boolean moreExpected = false;
+            
+            while ( !startsWith( reader, pos, RPAREN ) )
+            {
+                moreExpected = false;
+                
+                ruleIds.add( getRuleId( pos ) );
+                
+                if ( startsWith( reader, pos, RPAREN ) )
+                {
+                    break;
+                }
+                
+                skipWhites( reader, pos, false );
+                
+                if ( startsWith( reader, pos, DOLLAR ) )
+                {
+                    pos.start++;
+                    moreExpected = true;
+                }
+
+                skipWhites( reader, pos, false );
+            }
+            
+            if ( !startsWith( reader, pos, RPAREN ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13793_NO_CLOSING_PAREN, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( moreExpected )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13813_MORE_RULE_IDS_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else
+        {
+            // Only one ruleId, read it
+            ruleIds.add( getRuleId( pos ) );
+        }
+        
+        return ruleIds;
+    }
+    
+    
+    private static UsageEnum getUsageStrict( PosSchema pos ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        if ( startsWith( pos, USER_APPLICATIONS_STR ) )
+        { 
+            pos.start += USER_APPLICATIONS_STR.length();
+            
+            return UsageEnum.USER_APPLICATIONS;
+        }
+        else if ( startsWith( pos, DIRECTORY_OPERATION_STR ) )
+        {
+            pos.start += DIRECTORY_OPERATION_STR.length();
+            
+            return UsageEnum.DIRECTORY_OPERATION;
+        }
+        else if ( startsWith( pos, DISTRIBUTED_OPERATION_STR ) )
+        { 
+            pos.start += DISTRIBUTED_OPERATION_STR.length();
+            
+            return UsageEnum.DISTRIBUTED_OPERATION;
+        }
+        else if ( startsWith( pos, DSA_OPERATION_STR ) )
+        { 
+            pos.start += DSA_OPERATION_STR.length();
+
+            return UsageEnum.DSA_OPERATION;
+        }
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13797_USAGE_UNKNOWN, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    private static UsageEnum getUsageRelaxed( PosSchema pos ) throws LdapSchemaException
+    {
+        if ( isEmpty( pos ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        boolean isSQuoted = false;
+        boolean isDQuoted = false;
+        
+        if ( pos.line.charAt( pos.start ) == SQUOTE )
+        {
+            isSQuoted = true;
+            pos.start++;
+
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        else if ( pos.line.charAt( pos.start ) == DQUOTE )
+        {
+            isDQuoted = true;
+            pos.start++;
+
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+
+        UsageEnum usage = UsageEnum.USER_APPLICATIONS;
+
+        if ( startsWith( pos, USER_APPLICATIONS_STR ) )
+        { 
+            pos.start += USER_APPLICATIONS_STR.length();
+            
+            usage = UsageEnum.USER_APPLICATIONS;
+        }
+        else if ( startsWith( pos, DIRECTORY_OPERATION_STR ) )
+        {
+            pos.start += DIRECTORY_OPERATION_STR.length();
+            
+            usage = UsageEnum.DIRECTORY_OPERATION;
+        } 
+        else if ( startsWith( pos, DISTRIBUTED_OPERATION_STR ) )
+        { 
+            pos.start += DISTRIBUTED_OPERATION_STR.length();
+            
+            usage = UsageEnum.DISTRIBUTED_OPERATION;
+        } 
+        else if ( startsWith( pos, DSA_OPERATION_STR ) )
+        { 
+            pos.start += DSA_OPERATION_STR.length();
+
+            usage = UsageEnum.DSA_OPERATION;
+        } 
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13797_USAGE_UNKNOWN, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        if ( isSQuoted )
+        {
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( pos.line.charAt( pos.start ) != SQUOTE )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        else if ( isDQuoted )
+        {
+            if ( isEmpty( pos ) )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13796_USAGE_EXPECTED, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            if ( pos.line.charAt( pos.start ) != DQUOTE )
+            {
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13792_SIMPLE_QUOTE_EXPECTED_AT_END, 
+                    pos.lineNumber, pos.start ) );
+            }
+            
+            pos.start++;
+        }
+        
+        return usage;
+    }
+
+    
+    /**
+     * <pre>
+     * extension    ::= xstring SP qdstrings
+     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
+     * qdstrings    ::= qdstring | ( LPAREN WSP qdstringlist WSP RPAREN )
+     * qdstringlist ::= qdstring *( SP qdstring )*
+     * qdstring     ::= SQUOTE dstring SQUOTE
+     * dstring      ::= 1*( QS / QQ / QUTF8 )   ; escaped UTF-8 string
+     * </pre>
+     * @throws IOException 
+     * @throws LdapSchemaException 
+     */
+    private static void processExtension( Reader reader, PosSchema pos, SchemaObject schemaObject ) 
+        throws LdapSchemaException, IOException
+    {
+        // The xstring first
+        String extensionKey = getXString( pos );
+        
+        skipWhites( reader, pos, true );
+        
+        List<String> extensionValues = getQDStrings( reader, pos );
+        
+        if ( schemaObject.hasExtension( extensionKey ) )
+        {
+            throw new LdapSchemaException( 
+                I18n.err( I18n.ERR_13780_SCHEMA_OBJECT_DESCRIPTION_HAS_ELEMENT_TWICE, extensionKey, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        schemaObject.addExtension( extensionKey, extensionValues );
+    }
+    
+    
+    /**
+     * <pre>
+     * xstring      ::= "X" HYPHEN ( ALPHA | HYPHEN | USCORE )+
+     * </pre>
+     */
+    private static String getXString( PosSchema pos ) throws LdapSchemaException
+    {
+        int start = pos.start;
+        
+        if ( startsWith( pos, EXTENSION_PREFIX ) )
+        {
+            pos.start += 2;
+            
+            // Now parse the remaining string
+            while ( !isEmpty( pos ) && ( isAlpha( pos ) || startsWith( pos, HYPHEN ) || startsWith( pos, UNDERSCORE ) ) )
+            {
+                pos.start++;
+            }
+            
+            return pos.line.substring( start, pos.start );
+        }
+        else
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13802_EXTENSION_SHOULD_START_WITH_X, 
+                pos.lineNumber, pos.start ) );
+        }
+    }
+    
+    
+    /**
+     * A FQCN
+     * <pre>
+     * FQCN ::= FQCN_IDENTIFIER ( '.' FQCN_IDENTIFIER )*
+     * FQCN_IDENTIFIER ::= ( JavaLetter ( JavaLetterOrDigit )*
+     */
+    private static String getFqcn( PosSchema pos ) throws LdapSchemaException
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return "";
+        }
+
+        int start = pos.start;
+        boolean isFirst = true;
+        boolean dotSeen = false;
+        
+        while ( true )
+        {
+            char c = pos.line.charAt( pos.start );
+            
+            if ( isFirst )
+            {
+                if ( !Character.isJavaIdentifierStart( c ) )
+                {
+                    throw new LdapSchemaException( I18n.err( I18n.ERR_13822_INVALID_FQCN_BAD_IDENTIFIER_START, 
+                        pos.lineNumber, pos.start ) );
+                }
+                
+                isFirst = false;
+                dotSeen = false;
+                pos.start++;
+            }
+            else
+            {
+                if ( c == DOT ) 
+                {
+                    if ( dotSeen )
+                    {
+                        throw new LdapSchemaException( I18n.err( I18n.ERR_13823_INVALID_FQCN_DOUBLE_DOT, 
+                            pos.lineNumber, pos.start ) );
+                    }
+                    else
+                    {
+                        isFirst = true;
+                        dotSeen = true;
+                        pos.start++;
+                    }
+                }
+                else
+                {
+                    if ( Character.isJavaIdentifierPart( c ) )
+                    {
+                        pos.start++;
+                        dotSeen = false;
+                    }
+                    else
+                    {
+                        return pos.line.substring( start, pos.start );
+                    }
+                }
+            }
+            
+            if ( pos.line.length() - pos.start < 1 )
+            {
+                return pos.line.substring( start, pos.start );
+            }
+        }
+    }
+
+    
+    /**
+     * A base64 string
+     * <pre>
+     * byteCode ::= ( [a-z] | [A-Z] | [0-9] | '+' | '/' | '=' )*
+     */
+    private static String getByteCode( PosSchema pos )
+    {
+        if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+        {
+            return "";
+        }
+
+        int start = pos.start;
+        
+        
+        while ( !isEmpty( pos ) && ( isAlpha( pos ) || isDigit( pos ) || startsWith( pos, PLUS ) 
+            || startsWith( pos, SLASH ) || startsWith( pos, EQUAL ) ) )
+        {
+            pos.start++;
+            
+            if ( ( pos.line == null ) || ( pos.line.length() - pos.start < 1 ) )
+            {
+                return pos.line.substring( start, pos.start );
+            }
+        }
+        
+        return pos.line.substring( start, pos.start );
+    }
+    
+    
+    private static int checkElement( int elementsSeen, SchemaObjectElements element, PosSchema pos ) throws LdapSchemaException
+    {
+        if ( ( elementsSeen & element.getValue() ) != 0 )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13780_SCHEMA_OBJECT_DESCRIPTION_HAS_ELEMENT_TWICE, 
+                element, pos.lineNumber, pos.start ) );
+        }
+        
+        elementsSeen |= element.getValue();
+        
+        return elementsSeen;
+    }
+
+    
+    /**
+     * Production for matching attribute type descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * AttributeTypeDescription = LPAREN WSP
+     *     numericoid                    ; object identifier
+     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
+     *     [ SP "DESC" SP qdstring ]     ; description
+     *     [ SP "OBSOLETE" ]             ; not active
+     *     [ SP "SUP" SP oid ]           ; supertype
+     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
+     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
+     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
+     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
+     *     [ SP "SINGLE-VALUE" ]         ; single-value
+     *     [ SP "COLLECTIVE" ]           ; collective
+     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
+     *     [ SP "USAGE" SP usage ]       ; usage
+     *     extensions WSP RPAREN         ; extensions
+     * 
+     * usage = "userApplications"     /  ; user
+     *         "directoryOperation"   /  ; directory operational
+     *         "distributedOperation" /  ; DSA-shared operational
+     *         "dSAOperation"            ; DSA-specific operational     
+     * 
+     * extensions = *( SP xstring SP qdstrings )
+     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
+     * </pre>
+     * 
+     * @param attributeTypeDescription The String containing the AttributeTypeDescription
+     * @return An instance of AttributeType
+     * @throws ParseException If the element was invalid
+     */
+    public AttributeType parseAttributeType( String attributeTypeDescription ) throws ParseException
+    {
+        if ( ( attributeTypeDescription == null ) || Strings.isEmpty( attributeTypeDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( attributeTypeDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseAttributeTypeRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseAttributeTypeStrict( reader, pos, objectIdentifierMacros );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for matching attribute type descriptions. It is fault-tolerant
+     * against element ordering. It's strict.
+     *
+     * <pre>
+     * AttributeTypeDescription = LPAREN WSP
+     *     numericoid                    ; object identifier
+     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
+     *     [ SP "DESC" SP qdstring ]     ; description
+     *     [ SP "OBSOLETE" ]             ; not active
+     *     [ SP "SUP" SP oid ]           ; supertype
+     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
+     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
+     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
+     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
+     *     [ SP "SINGLE-VALUE" ]         ; single-value
+     *     [ SP "COLLECTIVE" ]           ; collective
+     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
+     *     [ SP "USAGE" SP usage ]       ; usage
+     *     extensions WSP RPAREN         ; extensions
+     * 
+     * usage = "userApplications"     /  ; user
+     *         "directoryOperation"   /  ; directory operational
+     *         "distributedOperation" /  ; DSA-shared operational
+     *         "dSAOperation"            ; DSA-specific operational     
+     * 
+     * extensions = *( SP xstring SP qdstrings )
+     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
+     * </pre>
+     * @throws IOException 
+     * @throws LdapSchemaException 
+     */
+    private static AttributeType parseAttributeTypeStrict( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        // Check that the OID is valid
+        if ( !Oid.isOid( oid ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        MutableAttributeType attributeType = new MutableAttributeType( oid );
+        boolean hasSup = false;
+        boolean hasSyntax = false;
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NAME, pos );
+                
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setNames( getQDescrs( reader, pos, STRICT ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.OBSOLETE, pos );
+                
+                pos.start += OBSOLETE_STR.length();
+                
+                attributeType.setObsolete( true );
+            }
+            else if ( startsWith( pos, SUP_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUP, pos );
+                
+                pos.start += SUP_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String superiorOid = getOidStrict( pos );
+
+                attributeType.setSuperiorOid( superiorOid );
+                hasSup = true;
+            }
+            else if ( startsWith( pos, EQUALITY_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.EQUALITY, pos );
+                
+                pos.start += EQUALITY_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String equalityOid = getOidStrict( pos );
+
+                attributeType.setEqualityOid( equalityOid );
+            }
+            else if ( startsWith( pos, ORDERING_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.ORDERING, pos );
+                
+                pos.start += ORDERING_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String orderingOid = getOidStrict( pos );
+
+                attributeType.setOrderingOid( orderingOid );
+            }
+            else if ( startsWith( pos, SUBSTR_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUBSTR, pos );
+
+                pos.start += SUBSTR_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String substrOid = getOidStrict( pos );
+
+                attributeType.setSubstringOid( substrOid );
+            }
+            else if ( startsWith( pos, SYNTAX_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SYNTAX, pos );
+                
+                pos.start += SYNTAX_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                getNoidLenStrict( attributeType, pos );
+
+                hasSyntax = true;
+            }
+            else if ( startsWith( pos, SINGLE_VALUE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SINGLE_VALUE, pos );
+                
+                pos.start += SINGLE_VALUE_STR.length();
+                
+                attributeType.setSingleValued( true );
+            }
+            else if ( startsWith( pos, COLLECTIVE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.COLLECTIVE, pos );
+                
+                pos.start += COLLECTIVE_STR.length();
+                
+                attributeType.setCollective( true );
+            }
+            else if ( startsWith( pos, NO_USER_MODIFICATION_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NO_USER_MODIFICATION, pos );
+                
+                pos.start += NO_USER_MODIFICATION_STR.length();
+                
+                attributeType.setUserModifiable( false );
+            }
+            else if ( startsWith( pos, USAGE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.USAGE, pos );
+                
+                pos.start += USAGE_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                UsageEnum usage = getUsageStrict( pos );
+
+                attributeType.setUsage( usage );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, attributeType );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        // Semantic checks
+        if ( !hasSup && !hasSyntax )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13799_SYNTAX_OR_SUP_REQUIRED, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13800_COLLECTIVE_REQUIRES_USER_APPLICATION, 
+                pos.lineNumber, pos.start ) );
+        }
+    
+        // NO-USER-MODIFICATION requires an operational USAGE.
+        if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13801_NO_USER_MOD_REQUIRE_OPERATIONAL, 
+                pos.lineNumber, pos.start ) );
+        }
+        
+        return attributeType;
+    }
+    
+    
+    /**
+     * Production for matching attribute type descriptions. It is fault-tolerant
+     * against element ordering. It's relaxed.
+     *
+     * <pre>
+     * AttributeTypeDescription = LPAREN WSP
+     *     numericoid                    ; object identifier
+     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
+     *     [ SP "DESC" SP qdstring ]     ; description
+     *     [ SP "OBSOLETE" ]             ; not active
+     *     [ SP "SUP" SP oid ]           ; supertype
+     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
+     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
+     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
+     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
+     *     [ SP "SINGLE-VALUE" ]         ; single-value
+     *     [ SP "COLLECTIVE" ]           ; collective
+     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
+     *     [ SP "USAGE" SP usage ]       ; usage
+     *     extensions WSP RPAREN         ; extensions
+     * 
+     * usage = "userApplications"     /  ; user
+     *         "directoryOperation"   /  ; directory operational
+     *         "distributedOperation" /  ; DSA-shared operational
+     *         "dSAOperation"            ; DSA-specific operational     
+     * 
+     * extensions = *( SP xstring SP qdstrings )
+     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
+     * </pre>
+     * @throws IOException 
+     * @throws LdapSchemaException 
+     */
+    private static AttributeType parseAttributeTypeRelaxed( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        MutableAttributeType attributeType = new MutableAttributeType( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NAME, pos );
+                
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setNames( getQDescrs( reader, pos, RELAXED ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                attributeType.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.OBSOLETE, pos );
+                
+                pos.start += OBSOLETE_STR.length();
+                
+                attributeType.setObsolete( true );
+            }
+            else if ( startsWith( pos, SUP_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUP, pos );
+                
+                pos.start += SUP_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String superiorOid = getOidRelaxed( pos, false );
+
+                attributeType.setSuperiorOid( superiorOid );
+            }
+            else if ( startsWith( pos, EQUALITY_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.EQUALITY, pos );
+                
+                pos.start += EQUALITY_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String equalityOid = getOidRelaxed( pos, false );
+
+                attributeType.setEqualityOid( equalityOid );
+            }
+            else if ( startsWith( pos, ORDERING_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.ORDERING, pos );
+                
+                pos.start += ORDERING_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String orderingOid = getOidRelaxed( pos, false );
+
+                attributeType.setOrderingOid( orderingOid );
+            }
+            else if ( startsWith( pos, SUBSTR_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SUBSTR, pos );
+
+                pos.start += SUBSTR_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String substrOid = getOidRelaxed( pos, false );
+
+                attributeType.setSubstringOid( substrOid );
+            }
+            else if ( startsWith( pos, SYNTAX_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SYNTAX, pos );
+                
+                pos.start += SYNTAX_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                getNoidLenRelaxed( attributeType, pos );
+            }
+            else if ( startsWith( pos, SINGLE_VALUE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.SINGLE_VALUE, pos );
+                
+                pos.start += SINGLE_VALUE_STR.length();
+                
+                attributeType.setSingleValued( true );
+            }
+            else if ( startsWith( pos, COLLECTIVE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.COLLECTIVE, pos );
+                
+                pos.start += COLLECTIVE_STR.length();
+                
+                attributeType.setCollective( true );
+            }
+            else if ( startsWith( pos, NO_USER_MODIFICATION_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.NO_USER_MODIFICATION, pos );
+                
+                pos.start += NO_USER_MODIFICATION_STR.length();
+                
+                attributeType.setUserModifiable( false );
+            }
+            else if ( startsWith( pos, USAGE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, AttributeTypeElements.USAGE, pos );
+                
+                pos.start += USAGE_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                UsageEnum usage = getUsageRelaxed( pos );
+
+                attributeType.setUsage( usage );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, attributeType );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13798_AT_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return attributeType;
+    }
+
+    
+    /**
+     * Production for matching DitContentRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITContentRuleDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    [ SP "OBSOLETE" ]          ; not active
+     *    [ SP "AUX" SP oids ]       ; auxiliary object classes
+     *    [ SP "MUST" SP oids ]      ; attribute types
+     *    [ SP "MAY" SP oids ]       ; attribute types
+     *    [ SP "NOT" SP oids ]       ; attribute types
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     * 
+     * @param ditContentRuleDescription The String containing the DitContentRuleDescription
+     * @return An instance of ditContentRule
+     * @throws ParseException If the element was invalid
+     */
+    public DitContentRule parseDitContentRule( String ditContentRuleDescription ) throws ParseException
+    {
+        if ( ( ditContentRuleDescription == null ) || Strings.isEmpty( ditContentRuleDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( ditContentRuleDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseDitContentRuleRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseDitContentRuleStrict( reader, pos, objectIdentifierMacros );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for DitContentRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITContentRuleDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    [ SP "OBSOLETE" ]          ; not active
+     *    [ SP "AUX" SP oids ]       ; auxiliary object classes
+     *    [ SP "MUST" SP oids ]      ; attribute types
+     *    [ SP "MAY" SP oids ]       ; attribute types
+     *    [ SP "NOT" SP oids ]       ; attribute types
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     */
+    private static DitContentRule parseDitContentRuleStrict( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        // Check that the OID is valid
+        if ( !Oid.isOid( oid ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        DitContentRule ditContentRule = new DitContentRule( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.NAME, pos );
+
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditContentRule.setNames( getQDescrs( reader, pos, STRICT ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditContentRule.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.OBSOLETE, pos );
+
+                pos.start += OBSOLETE_STR.length();
+                
+                ditContentRule.setObsolete( true );
+            }
+            else if ( startsWith( pos, AUX_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.AUX, pos );
+
+                pos.start += AUX_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> aux = getOidsStrict( reader, pos );
+                
+                ditContentRule.setAuxObjectClassOids( aux );
+            }
+            else if ( startsWith( pos, MUST_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.MUST, pos );
+
+                pos.start += MUST_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> must = getOidsStrict( reader, pos );
+                
+                ditContentRule.setMustAttributeTypeOids( must );
+            }
+            else if ( startsWith( pos, MAY_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.MAY, pos );
+
+                pos.start += MAY_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> may = getOidsStrict( reader, pos );
+                
+                ditContentRule.setMayAttributeTypeOids( may );
+            }
+            else if ( startsWith( pos, NOT_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.NOT, pos );
+
+                pos.start += NOT_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> not = getOidsStrict( reader, pos );
+                
+                ditContentRule.setNotAttributeTypeOids( not );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ditContentRule );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13809_DCR_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return ditContentRule;
+    }
+
+    
+    /**
+     * Production for DitContentRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITContentRuleDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    [ SP "OBSOLETE" ]          ; not active
+     *    [ SP "AUX" SP oids ]       ; auxiliary object classes
+     *    [ SP "MUST" SP oids ]      ; attribute types
+     *    [ SP "MAY" SP oids ]       ; attribute types
+     *    [ SP "NOT" SP oids ]       ; attribute types
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     */
+    private static DitContentRule parseDitContentRuleRelaxed( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        // Now, the OID. 
+        
+        DitContentRule ditContentRule = new DitContentRule( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.NAME, pos );
+
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditContentRule.setNames( getQDescrs( reader, pos, RELAXED ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditContentRule.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.OBSOLETE, pos );
+
+                pos.start += OBSOLETE_STR.length();
+                
+                ditContentRule.setObsolete( true );
+            }
+            else if ( startsWith( pos, AUX_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.AUX, pos );
+
+                pos.start += AUX_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> aux = getOidsRelaxed( reader, pos );
+                
+                ditContentRule.setAuxObjectClassOids( aux );
+            }
+            else if ( startsWith( pos, MUST_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.MUST, pos );
+
+                pos.start += MUST_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> must = getOidsRelaxed( reader, pos );
+                
+                ditContentRule.setMustAttributeTypeOids( must );
+            }
+            else if ( startsWith( pos, MAY_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.MAY, pos );
+
+                pos.start += MAY_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> may = getOidsRelaxed( reader, pos );
+                
+                ditContentRule.setMayAttributeTypeOids( may );
+            }
+            else if ( startsWith( pos, NOT_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitContentRuleElements.NOT, pos );
+
+                pos.start += NOT_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<String> not = getOidsRelaxed( reader, pos );
+                
+                ditContentRule.setNotAttributeTypeOids( not );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ditContentRule );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13809_DCR_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return ditContentRule;
+    }
+
+    
+    /**
+     * Production for matching DitStructureRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITStructureRuleDescription = LPAREN WSP
+     *   ruleid                     ; rule identifier
+     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *   [ SP "DESC" SP qdstring ]  ; description
+     *   [ SP "OBSOLETE" ]          ; not active
+     *   SP "FORM" SP oid           ; NameForm
+     *   [ SP "SUP" ruleids ]       ; superior rules
+     *   extensions WSP RPAREN      ; extensions
+     *
+     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
+     * ruleidlist = ruleid *( SP ruleid )
+     * ruleid = number
+     * </pre>
+     * 
+     * @param ditStructureRuleDescription The String containing the DitStructureRuleDescription
+     * @return An instance of DitStructureRule
+     * @throws ParseException If the element was invalid
+     */
+    public DitStructureRule parseDitStructureRule( String ditStructureRuleDescription ) throws ParseException
+    {
+        if ( ( ditStructureRuleDescription == null ) || Strings.isEmpty( ditStructureRuleDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( ditStructureRuleDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseDitStructureRuleRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseDitStructureRuleStrict( reader, pos );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for DitStructureRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITStructureRuleDescription = LPAREN WSP
+     *   ruleid                     ; rule identifier
+     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *   [ SP "DESC" SP qdstring ]  ; description
+     *   [ SP "OBSOLETE" ]          ; not active
+     *   SP "FORM" SP oid           ; NameForm
+     *   [ SP "SUP" ruleids ]       ; superior rules
+     *   extensions WSP RPAREN      ; extensions
+     *
+     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
+     * ruleidlist = ruleid *( SP ruleid )
+     * ruleid = number
+     * </pre>
+     */
+    private static DitStructureRule parseDitStructureRuleStrict( Reader reader, PosSchema pos ) 
+        throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the ruleID. 
+        int ruleId = getRuleId( pos );
+        
+        DitStructureRule ditStructureRule = new DitStructureRule( ruleId );
+        int elementsSeen = 0;
+        boolean hasForm = false;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.NAME, pos );
+
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditStructureRule.setNames( getQDescrs( reader, pos, STRICT ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditStructureRule.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.OBSOLETE, pos );
+
+                pos.start += OBSOLETE_STR.length();
+                
+                ditStructureRule.setObsolete( true );
+            }
+            else if ( startsWith( pos, FORM_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.FORM, pos );
+
+                pos.start += FORM_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String form = getOidStrict( pos );
+                
+                ditStructureRule.setForm( form );
+                hasForm = true;
+            }
+            else if ( startsWith( pos, SUP_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.SUP, pos );
+
+                pos.start += SUP_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<Integer> superRules = getRuleIds( reader, pos );
+                
+                ditStructureRule.setSuperRules( superRules );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ditStructureRule );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13809_DCR_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        // Semantic checks
+        if ( !hasForm )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13812_FORM_REQUIRED, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        return ditStructureRule;
+    }
+
+    
+    /**
+     * Production for DitStructureRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * DITStructureRuleDescription = LPAREN WSP
+     *   ruleid                     ; rule identifier
+     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *   [ SP "DESC" SP qdstring ]  ; description
+     *   [ SP "OBSOLETE" ]          ; not active
+     *   SP "FORM" SP oid           ; NameForm
+     *   [ SP "SUP" ruleids ]       ; superior rules
+     *   extensions WSP RPAREN      ; extensions
+     *
+     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
+     * ruleidlist = ruleid *( SP ruleid )
+     * ruleid = number
+     * </pre>
+     */
+    private static DitStructureRule parseDitStructureRuleRelaxed( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) 
+            throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the ruleID. 
+        int ruleId = getRuleId( pos );
+        
+        DitStructureRule ditStructureRule = new DitStructureRule( ruleId );
+        int elementsSeen = 0;
+        boolean hasForm = false;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.NAME, pos );
+
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditStructureRule.setNames( getQDescrs( reader, pos, RELAXED ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ditStructureRule.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.OBSOLETE, pos );
+
+                pos.start += OBSOLETE_STR.length();
+                
+                ditStructureRule.setObsolete( true );
+            }
+            else if ( startsWith( pos, FORM_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.FORM, pos );
+
+                pos.start += FORM_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String form = getOidRelaxed( pos, UN_QUOTED );
+                
+                ditStructureRule.setForm( form );
+                hasForm = true;
+            }
+            else if ( startsWith( pos, SUP_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, DitStructureRuleElements.SUP, pos );
+
+                pos.start += SUP_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                List<Integer> superRules = getRuleIds( reader, pos );
+                
+                ditStructureRule.setSuperRules( superRules );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ditStructureRule );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13809_DCR_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+
+        if ( !hasForm )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13812_FORM_REQUIRED, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        return ditStructureRule;
+    }
+
+    
+    /**
+     * Production for LdapComparator descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * LdapComparatorDescription = LPAREN WSP
+     *       numericoid                           ; object identifier
+     *       [ SP "DESC" SP qdstring ]            ; description
+     *       SP "FQCN" SP fqcn                    ; fully qualified class name
+     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
+     *       extensions WSP RPAREN                ; extensions
+     * 
+     * base64          = *(4base64-char)
+     * base64-char     = ALPHA / DIGIT / "+" / "/"
+     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
+     * fqcnComponent = ???
+     * </pre>
+     * 
+     * @param ldapComparatorDescription The String containing the LdapComparatorDescription
+     * @return An instance of LdapComparatorDescription
+     * @throws ParseException If the element was invalid
+     */
+    public LdapComparatorDescription parseLdapComparator( String ldapComparatorDescription ) throws ParseException
+    {
+        if ( ( ldapComparatorDescription == null ) || Strings.isEmpty( ldapComparatorDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( ldapComparatorDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseLdapComparatorRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseLdapComparatorStrict( reader, pos, objectIdentifierMacros );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for LdapComparator descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * LdapComparatorDescription = LPAREN WSP
+     *       numericoid                           ; object identifier
+     *       [ SP "DESC" SP qdstring ]            ; description
+     *       SP "FQCN" SP fqcn                    ; fully qualified class name
+     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
+     *       extensions WSP RPAREN                ; extensions
+     * 
+     * base64          = *(4base64-char)
+     * base64-char     = ALPHA / DIGIT / "+" / "/"
+     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
+     * fqcnComponent = ???
+     * </pre>
+     */
+    private static LdapComparatorDescription parseLdapComparatorStrict( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        // Check that the OID is valid
+        if ( !Oid.isOid( oid ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        LdapComparatorDescription ldapComparator = new LdapComparatorDescription( oid );
+        int elementsSeen = 0;
+        boolean hasFqcn = false;
+        boolean hasByteCode = false;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ldapComparator.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, FQCN_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.FQCN, pos );
+
+                pos.start += FQCN_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                String fqcn = getFqcn( pos );
+                ldapComparator.setFqcn( fqcn );
+                hasFqcn = true;
+            }
+            else if ( startsWith( pos, BYTECODE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.BYTECODE, pos );
+
+                pos.start += BYTECODE_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String byteCode = getByteCode( pos );
+                ldapComparator.setBytecode( byteCode );
+                hasByteCode = true;
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ldapComparator );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13825_COMP_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        // Semantic checks
+        if ( !hasFqcn )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13819_FQCN_REQUIRED, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        if ( ( hasByteCode ) && ( ldapComparator.getBytecode().length() % 4 != 0 ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13820_BYTE_CODE_REQUIRED, 
+                pos.lineNumber, pos.start ) );
+        }
+
+        return ldapComparator;
+    }
+
+    
+    /**
+     * Production for LdapComparator descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * LdapComparatorDescription = LPAREN WSP
+     *       numericoid                           ; object identifier
+     *       [ SP "DESC" SP qdstring ]            ; description
+     *       SP "FQCN" SP fqcn                    ; fully qualified class name
+     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
+     *       extensions WSP RPAREN                ; extensions
+     * 
+     * base64          = *(4base64-char)
+     * base64-char     = ALPHA / DIGIT / "+" / "/"
+     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
+     * fqcnComponent = ???
+     * </pre>
+     */
+    private static LdapComparatorDescription parseLdapComparatorRelaxed( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) 
+            throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        LdapComparatorDescription ldapComparator = new LdapComparatorDescription( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ldapComparator.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, FQCN_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.FQCN, pos );
+
+                pos.start += FQCN_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                String fqcn = getFqcn( pos );
+                ldapComparator.setFqcn( fqcn );
+            }
+            else if ( startsWith( pos, BYTECODE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapComparatorElements.BYTECODE, pos );
+
+                pos.start += BYTECODE_STR.length();
+                
+                skipWhites( reader, pos, true );
+                
+                String byteCode = getByteCode( pos );
+                ldapComparator.setBytecode( byteCode );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ldapComparator );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13825_COMP_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+
+        return ldapComparator;
+    }
+
+    
+    /**
+     * Production for matching ldap syntax descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * SyntaxDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     * 
+     * @param ldapSyntaxDescription The String containing the Ldap Syntax description
+     * @return An instance of LdapSyntax
+     * @throws ParseException If the element was invalid
+     */
+    public LdapSyntax parseLdapSyntax( String ldapSyntaxDescription ) throws ParseException
+    {
+        if ( ( ldapSyntaxDescription == null ) || Strings.isEmpty( ldapSyntaxDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( ldapSyntaxDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseLdapSyntaxRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseLdapSyntaxStrict( reader, pos, objectIdentifierMacros );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for matching ldap syntax descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * SyntaxDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     */
+    private static LdapSyntax parseLdapSyntaxStrict( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        // Check that the OID is valid
+        if ( !Oid.isOid( oid ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        LdapSyntax ldapSyntax = new LdapSyntax( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapSyntaxElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ldapSyntax.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ldapSyntax );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13807_SYN_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return ldapSyntax;
+    }
+
+    
+    /**
+     * Production for matching ldap syntax descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * SyntaxDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     */
+    private static LdapSyntax parseLdapSyntaxRelaxed( Reader reader, PosSchema pos,
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        LdapSyntax ldapSyntax = new LdapSyntax( oid );
+        int elementsSeen = 0;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, LdapSyntaxElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                ldapSyntax.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, EXTENSION_PREFIX ) )
+            {
+                processExtension( reader, pos, ldapSyntax );
+            }
+            else if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            else
+            {
+                // This is an error
+                throw new LdapSchemaException( I18n.err( I18n.ERR_13807_SYN_DESCRIPTION_INVALID, 
+                    pos.lineNumber, pos.start ) );
+            }
+        }
+        
+        return ldapSyntax;
+    }
+    
+    
+    /**
+     * Production for matching MatchingRule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * MatchingRuleDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    [ SP "OBSOLETE" ]          ; not active
+     *    SP "SYNTAX" SP numericoid  ; assertion syntax
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     * 
+     * @param matchingRuleDescription The String containing the MatchingRuledescription
+     * @return An instance of MatchingRule
+     * @throws ParseException If the element was invalid
+     */
+    public MatchingRule parseMatchingRule( String matchingRuleDescription ) throws ParseException
+    {
+        if ( ( matchingRuleDescription == null ) || Strings.isEmpty( matchingRuleDescription.trim() ) )
+        {
+            throw new ParseException( I18n.err( I18n.ERR_13716_NULL_OR_EMPTY_STRING_SCHEMA_OBJECT ), 0 );
+        }
+        
+        try ( Reader reader = new BufferedReader( new StringReader( matchingRuleDescription ) ) )
+        {
+            PosSchema pos = new PosSchema();
+
+            if ( isQuirksModeEnabled )
+            {
+                return parseMatchingRuleRelaxed( reader, pos, objectIdentifierMacros );
+            }
+            else
+            {
+                return parseMatchingRuleStrict( reader, pos, objectIdentifierMacros );
+            }
+        }
+        catch ( IOException | LdapSchemaException e )
+        {
+            throw new ParseException( e.getMessage(), 0 );
+        }
+    }
+
+    
+    /**
+     * Production for matching rule descriptions. It is fault-tolerant
+     * against element ordering.
+     *
+     * <pre>
+     * MatchingRuleDescription = LPAREN WSP
+     *    numericoid                 ; object identifier
+     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
+     *    [ SP "DESC" SP qdstring ]  ; description
+     *    [ SP "OBSOLETE" ]          ; not active
+     *    SP "SYNTAX" SP numericoid  ; assertion syntax
+     *    extensions WSP RPAREN      ; extensions
+     * </pre>
+     */
+    private static MatchingRule parseMatchingRuleStrict( Reader reader, PosSchema pos, 
+        Map<String, OpenLdapObjectIdentifierMacro> objectIdentifierMacros ) throws IOException, LdapSchemaException
+    {
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // we must have a '('
+        if ( pos.line.charAt( pos.start ) != LPAREN )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13829_NO_OPENING_PAREN, 
+                pos.lineNumber, pos.start ) );
+        }
+        else
+        {
+            pos.start++;
+        }
+        
+        // Get rid of whites, comments end empty lines
+        skipWhites( reader, pos, false );
+        
+        // Now, the OID. 
+        String oid = getOidAndMacroRelaxed( pos, objectIdentifierMacros );
+        
+        // Check that the OID is valid
+        if ( !Oid.isOid( oid ) )
+        {
+            throw new LdapSchemaException( I18n.err( I18n.ERR_13787_OID_EXPECTED, pos.lineNumber, pos.start ) );
+        }
+        
+        MutableMatchingRule matchingRule = new MutableMatchingRule( oid );
+        int elementsSeen = 0;
+        boolean hasSyntax = false;
+        
+        while ( true )
+        {
+            if ( startsWith( reader, pos, RPAREN ) )
+            {
+                pos.start++;
+                break;
+            }
+            
+            skipWhites( reader, pos, true );
+            
+            if ( startsWith( pos, NAME_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, MatchingRuleElements.NAME, pos );
+
+                pos.start += NAME_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                matchingRule.setNames( getQDescrs( reader, pos, STRICT ) );
+            }
+            else if ( startsWith( pos, DESC_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, MatchingRuleElements.DESC, pos );
+
+                pos.start += DESC_STR.length();
+                
+                skipWhites( reader, pos, true );
+
+                matchingRule.setDescription( getQDString( reader, pos ) );
+            }
+            else if ( startsWith( pos, OBSOLETE_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, MatchingRuleElements.OBSOLETE, pos );
+
+                pos.start += OBSOLETE_STR.length();
+                
+                matchingRule.setObsolete( true );
+            }
+            else if ( startsWith( pos, SYNTAX_STR ) )
+            {
+                elementsSeen = checkElement( elementsSeen, MatchingRuleElements.SYNTAX, pos );
+
+                pos.start += SYNTAX_STR.length();
+                
... 9004 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
elecharny@apache.org.