From ec1e5e28c7897d2387841b17bcd8659c100d97b6 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Mon, 02 Oct 2006 16:32:07 +0000
Subject: [PATCH] Perform significant refactoring in the core and plugin code in order to help make it easier for external developers to extend OpenDS.  In particular, this is a big step towards eliminating the need for developers to reference anything in the core package, and it's also a signficant simplification to the plugin API because it helps expose which operation methods are safe to call at various points in the plugin processing.

---
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java                                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5EqualityMatchingRule.java                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationBindOperation.java                                           |  146 
 opendj-sdk/opends/src/server/org/opends/server/tools/ConfigureDS.java                                                                   |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java                                            |    6 
 opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordEqualityMatchingRule.java                                             |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java         |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/BackendConfigManager.java                                                           |    1 
 opendj-sdk/opends/src/server/org/opends/server/api/TrustManagerProvider.java                                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/EntryCacheConfigManager.java                                                        |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactSubstringMatchingRule.java                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/BackupBackend.java                                                              |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/changelog/ServerHandler.java                                                             |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/SearchFilter.java                                                                  |    1 
 opendj-sdk/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java                                                |    6 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationOperation.java                                               |  415 +
 opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java                                                                   |  836 ++
 opendj-sdk/opends/src/server/org/opends/server/schema/UTCTimeSyntax.java                                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java                                                       |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/CertificateMapperConfigManager.java                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/SASLConfigManager.java                                                              |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordSyntax.java                                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5SubstringMatchingRule.java                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/BackupDirectory.java                                                               |    1 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestAbsoluteSubtreeSpecification.java                       |    1 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java                                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/AccountStatusNotificationHandler.java                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java                                                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java                                                       |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/EqualityMatchingRuleTest.java                             |   20 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListEqualityMatchingRule.java                                           |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/OrderingMatchingRuleTest.java                             |   30 
 opendj-sdk/opends/src/server/org/opends/server/core/MonitorConfigManager.java                                                           |    1 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseDeleteOperation.java                                         |   73 
 opendj-sdk/opends/src/server/org/opends/server/types/RDN.java                                                                           |    3 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAddOperation.java                                                |  101 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SubjectEqualsDNCertificateMapper.java                                         |    6 
 opendj-sdk/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/Tag.java                                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationCompareOperation.java                                        |  111 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java                                                         |   10 
 opendj-sdk/opends/src/server/org/opends/server/types/Schema.java                                                                        | 2381 +++++++
 opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierEqualityMatchingRule.java                                         |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExactMatchIdentityMapperTestCase.java                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java                                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/BackUpDB.java                                                                      |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java                                                           |    6 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedKeyManagerProviderTestCase.java              |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/PasswordGenerator.java                                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/CancelledOperationException.java                                                   |   73 
 opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeEqualityMatchingRule.java                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleSyntax.java                                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyDNOperation.java                                       |  184 
 opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringEqualityMatchingRule.java                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/MonitorBackend.java                                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedKeyManagerProvider.java                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java                                                            |  125 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseBindOperation.java                                           |  173 
 opendj-sdk/opends/src/server/org/opends/server/api/AlertHandler.java                                                                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/SubstringMatchingRule.java                                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/BooleanSyntax.java                                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/MemoryBackend.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java                                                         |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/DirectoryServer.java                                                                |   34 
 opendj-sdk/opends/src/server/org/opends/server/tools/VerifyIndex.java                                                                   |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicy.java                                                                 |    1 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ServerStateTest.java                             |   24 
 opendj-sdk/opends/src/server/org/opends/server/extensions/ExactMatchIdentityMapper.java                                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java                                                  |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedTrustManagerProviderTestCase.java            |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/LdifFileWriter.java                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/CompareOperation.java                                                               |  182 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationUnbindOperation.java                                        |   41 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationSearchOperation.java                                        |  173 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/DirectoryExceptionTestCase.java                            |    6 
 opendj-sdk/opends/src/server/org/opends/server/schema/IntegerSyntax.java                                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/monitors/TraditionalWorkQueueMonitor.java                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerStartMessage.java                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java                                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/DoubleMetaphoneApproximateMatchingRule.java                                       |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/CryptoManager.java                                                                 |  448 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListSubstringMatchingRule.java                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringSubstringMatchingRule.java                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAddOperation.java                                           |  131 
 opendj-sdk/opends/src/server/org/opends/server/core/DeleteOperation.java                                                                |  163 
 opendj-sdk/opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java                                          |    6 
 opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperationConfigManager.java                                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/core/RelativeSubtreeSpecification.java                                                   |    1 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyOperation.java                                             |  105 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/package-info.java                                                        |   43 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/RandomPasswordGeneratorTestCase.java                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JebFormat.java                                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/BooleanEqualityMatchingRule.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/PresentationAddressEqualityMatchingRule.java                                      |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java                                                                      |    2 
 opendj-sdk/opends/src/server/org/opends/server/authorization/BasicAccessControlProvider.java                                            |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseOperation.java                                                   |  422 +
 opendj-sdk/opends/src/server/org/opends/server/schema/UniqueMemberEqualityMatchingRule.java                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringOrderingMatchingRule.java                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/Entry.java                                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/NullConnectionSecurityProvider.java                                           |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java          |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/RootDNConfigManager.java                                                            |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/UnbindOperation.java                                                                |  161 
 opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/MonitorProvider.java                                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordValidatorConfigManager.java                                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/api/AttributeValueDecoder.java                                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeOrderingMatchingRule.java                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyOperation.java                                         |  143 
 opendj-sdk/opends/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java                                                        |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExternalSASLMechanismHandlerTestCase.java             |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPISASLMechanismHandler.java                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationOperation.java                                              |  402 +
 opendj-sdk/opends/src/server/org/opends/server/messages/PluginMessages.java                                                             |   16 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseDeleteOperation.java                                             |   64 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseSearchOperation.java                                         |  173 
 opendj-sdk/opends/src/server/org/opends/server/changelog/ChangelogDB.java                                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java                                                  |  112 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java                                                            |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java                                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/backends/task/Task.java                                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/ConnectionHandler.java                                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/RFC3672SubtreeSpecificationSyntax.java                                            |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/MD5PasswordStorageScheme.java                                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/RootDSEBackend.java                                                             |   10 
 opendj-sdk/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java                                           |    1 
 opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java                                                 |    6 
 opendj-sdk/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ImportJob.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringSubstringMatchingRule.java                                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/RandomPasswordGenerator.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java                                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/BitStringEqualityMatchingRule.java                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/InternalConnectionSecurityProvider.java                                       |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/FilePermission.java                                                                |    1 
 opendj-sdk/opends/src/server/org/opends/server/changelog/DbHandler.java                                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/monitors/StackTraceMonitorProvider.java                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/ProtocolInformationEqualityMatchingRule.java                                      |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java                                             |    1 
 opendj-sdk/opends/src/server/org/opends/server/extensions/WhoAmIExtendedOperation.java                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordSyntax.java                                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseCompareOperation.java                                        |  101 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationSearchOperation.java                                         |  151 
 opendj-sdk/opends/src/server/org/opends/server/core/IdentityMapperConfigManager.java                                                    |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringSyntax.java                                                        |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java                                  |   41 
 opendj-sdk/opends/src/server/org/opends/server/api/MatchingRule.java                                                                    |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5SubstringMatchingRule.java                                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/IdentityMapper.java                                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/AbsoluteSubtreeSpecification.java                                                   |    1 
 opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java                                                   |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/AnonymousSASLMechanismHandler.java                                            |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationBindOperation.java                                          |  197 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java                                                       |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java                                                |    1 
 opendj-sdk/opends/src/server/org/opends/server/tasks/ShutdownTask.java                                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/AddOperation.java                                                                   |  294 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java                                                            |   14 
 opendj-sdk/opends/src/server/org/opends/server/core/AccessControlConfigManager.java                                                     |    1 
 opendj-sdk/opends/src/server/org/opends/server/types/InvokableMethod.java                                                               |    1 
 opendj-sdk/opends/src/server/org/opends/server/monitors/DatabaseEnvironmentMonitor.java                                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationCompareOperation.java                                       |  101 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java                                  |  132 
 opendj-sdk/opends/src/server/org/opends/server/schema/RelativeSubtreeSpecificationSyntax.java                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/JMXAlertHandler.java                                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java                                                                     |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/KeyManagerProvider.java                                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyOperation.java                                        |  143 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseUnbindOperation.java                                             |   41 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FileTag.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAbandonOperation.java                                       |   49 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameEqualityMatchingRule.java                                        |    4 
 opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java                                                                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyDNOperation.java                                           |  135 
 opendj-sdk/opends/src/server/org/opends/server/api/SynchronizationProvider.java                                                         |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java                                                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java                                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyOperation.java                                         |  164 
 opendj-sdk/opends/src/server/org/opends/server/extensions/NullTrustManagerProvider.java                                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/LDIFExportConfig.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/PasswordValidator.java                                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/VirtualAttribute.java                                                                |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java                      |   64 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationExtendedOperation.java                                      |  102 
 opendj-sdk/opends/src/server/org/opends/server/core/ModifyDNOperation.java                                                              |  243 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/SimpleSubtreeSpecification.java                                                     |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/DITContentRuleSyntax.java                                                         |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/DirectoryException.java                                                            |  125 
 opendj-sdk/opends/src/server/org/opends/server/schema/DITStructureRuleSyntax.java                                                       |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/Operation.java                                                                      |  221 
 opendj-sdk/opends/src/server/org/opends/server/core/RFC3672SubtreeSpecification.java                                                    |    1 
 opendj-sdk/opends/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java                                  |    1 
 opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperation.java                                                              |  176 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java                                        |    4 
 opendj-sdk/opends/src/server/org/opends/server/plugins/LastModPlugin.java                                                               |  189 
 opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordEqualityMatchingRule.java                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/DefaultAccessControlProvider.java                                                   |    1 
 opendj-sdk/opends/src/server/org/opends/server/extensions/NullKeyManagerProvider.java                                                   |    4 
 opendj-sdk/opends/src/server/org/opends/server/tasks/BackupTask.java                                                                    |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandlerTestCase.java            |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java                              |  275 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyDNOperation.java                                      |  184 
 opendj-sdk/opends/src/server/org/opends/server/synchronization/ChangelogStartMessage.java                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/ErrorLogger.java                                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/ObjectClassSyntax.java                                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/LDIFImportConfig.java                                                              |    1 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackupManager.java                                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/PersistentSearch.java                                                               |    1 
 opendj-sdk/opends/src/server/org/opends/server/api/AttributeSyntax.java                                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerState.java                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/CancelRequest.java                                                                 |  184 
 opendj-sdk/opends/src/server/org/opends/server/schema/BitStringSyntax.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchEntrySearchOperation.java                                          |  151 
 opendj-sdk/opends/src/server/org/opends/server/core/LoggerConfigManager.java                                                            |    1 
 opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java                                                               |  141 
 opendj-sdk/opends/src/server/org/opends/server/core/BindOperation.java                                                                  |  192 
 opendj-sdk/opends/src/server/org/opends/server/core/ModifyOperation.java                                                                |  208 
 opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/EncodePassword.java                                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeSyntax.java                                                        |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/LengthBasedPasswordValidatorTestCase.java             |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java                                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java                                                    |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringOrderingMatchingRule.java                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/ClearPasswordStorageScheme.java                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/WordEqualityMatchingRule.java                                                     |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberEqualityMatchingRule.java                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java                                                                    |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java                                                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/PasswordStorageScheme.java                                                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java                                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/PKCS11KeyManagerProvider.java                                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/ClientConnection.java                                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/Base64PasswordStorageScheme.java                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java                                                         |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationDeleteOperation.java                                        |   73 
 opendj-sdk/opends/src/server/org/opends/server/schema/UUIDOrderingMatchingRule.java                                                     |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/ExportLDIF.java                                                                    |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java                                        |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Config.java                                                                 |    2 
 opendj-sdk/opends/src/server/org/opends/server/tasks/RestoreTask.java                                                                   |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/tasks/TaskUtils.java                                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/InvokableComponent.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/AttributeType.java                                                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/api/DebugLogger.java                                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/AccessLogger.java                                                                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/ExternalSASLMechanismHandler.java                                             |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreOrderingMatchingRule.java                                               |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandlerTestCase.java              |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java                                                    |  427 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactEqualityMatchingRule.java                                                |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/BlindTrustManagerProvider.java                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/AttributeValue.java                                                                |    1 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/DNTag.java                                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAbandonOperation.java                                            |   49 
 opendj-sdk/opends/src/server/org/opends/server/api/ConfigHandler.java                                                                   |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java                                                            |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5EqualityMatchingRule.java                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseOperation.java                                               |  315 +
 opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java                                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/Backend.java                                                                         |    8 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyDNOperation.java                                       |  196 
 opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/NameFormSyntax.java                                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordExactEqualityMatchingRule.java                                        |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java                                                      |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SHA1PasswordStorageScheme.java                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/CancelResult.java                                                                  |   47 
 opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java                                            |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java                             |  150 
 opendj-sdk/opends/src/server/org/opends/server/api/SASLMechanismHandler.java                                                            |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/changelog/UpdateComparatorTest.java                              |    6 
 opendj-sdk/opends/src/server/org/opends/server/types/DN.java                                                                            |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordExactEqualityMatchingRule.java                                        |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/UpdateOperationTest.java                         |   58 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseCompareOperation.java                                            |  101 
 opendj-sdk/opends/src/server/org/opends/server/loggers/DirectoryFileHandler.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/IntegerOrderingMatchingRule.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyState.java                                                            |    1 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchReferenceSearchOperation.java                                      |  151 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestEntry.java                                             |    1 
 opendj-sdk/opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java                                                     |   95 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameSyntax.java                                                      |    2 
 opendj-sdk/opends/src/server/org/opends/server/core/CoreConfigManager.java                                                              |    1 
 opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringFirstComponentEqualityMatchingRule.java                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/InProgressOperation.java                                                 |  417 +
 opendj-sdk/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java                                              |    6 
 opendj-sdk/opends/src/server/org/opends/server/monitors/VersionMonitorProvider.java                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreSubstringMatchingRule.java                                              |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/InitializationException.java                                                       |   48 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationExtendedOperation.java                                       |   84 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseAddOperation.java                                            |  131 
 opendj-sdk/opends/src/server/org/opends/server/core/SchemaConfigManager.java                                                            |    3 
 opendj-sdk/opends/src/server/org/opends/server/schema/IntegerEqualityMatchingRule.java                                                  |    4 
 opendj-sdk/opends/src/server/org/opends/server/api/ConnectionSecurityProvider.java                                                      |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseExtendedOperation.java                                           |  106 
 opendj-sdk/opends/src/server/org/opends/server/config/JMXMBean.java                                                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/AbsoluteSubtreeSpecificationSyntax.java                                           |    2 
 opendj-sdk/opends/src/server/org/opends/server/config/ConfigFileHandler.java                                                            |    6 
 opendj-sdk/opends/src/server/org/opends/server/tasks/ExportTask.java                                                                    |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/UUIDEqualityMatchingRule.java                                                     |    4 
 opendj-sdk/opends/src/server/org/opends/server/backends/task/RecurringTask.java                                                         |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java                                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/SchemaBackend.java                                                              |    6 
 opendj-sdk/opends/src/server/org/opends/server/api/CertificateMapper.java                                                               |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java                                                  |    6 
 opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalConnectionHandler.java                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPIStateInfo.java                                                          |    4 
 opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java                                                              |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java                                        |    4 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/PasswordPolicyTestCase.java                                 |    1 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationAddOperation.java                                            |  189 
 opendj-sdk/opends/src/server/org/opends/server/extensions/TLSConnectionSecurityProvider.java                                            |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleUseSyntax.java                                                        |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationDeleteOperation.java                                         |   73 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseSearchOperation.java                                             |  209 
 opendj-sdk/opends/src/server/org/opends/server/api/AccessControlProvider.java                                                           |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java                                    |   43 
 opendj-sdk/opends/src/server/org/opends/server/tools/LDIFModify.java                                                                    |    2 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java                                |    2 
 opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java                                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java                                                  |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/IntegerFirstComponentEqualityMatchingRule.java                                    |    4 
 opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java                                                     |    6 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/InitializationExceptionTestCase.java                       |    4 
 opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierFirstComponentEqualityMatchingRule.java                           |    4 
 opendj-sdk/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java                                               |    2 
 opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberSubstringMatchingRule.java                                         |    4 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseBindOperation.java                                               |  157 
 opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactOrderingMatchingRule.java                                                |    4 
 opendj-sdk/opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java                                                             |  100 
 /dev/null                                                                                                                               | 2178 -------
 opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java                                                                       |    1 
 opendj-sdk/opends/src/server/org/opends/server/types/OperationType.java                                                                 |   15 
 opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseExtendedOperation.java                                       |   82 
 opendj-sdk/opends/src/server/org/opends/server/extensions/LengthBasedPasswordValidator.java                                             |    2 
 opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java                                         |    6 
 opendj-sdk/opends/src/server/org/opends/server/api/ExtendedOperationHandler.java                                                        |    2 
 opendj-sdk/opends/src/server/org/opends/server/api/WorkQueue.java                                                                       |    4 
 opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java                                                                |  265 
 361 files changed, 13,186 insertions(+), 4,902 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AccessControlProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/AccessControlProvider.java
index ea36c45..fbb4c4a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AccessControlProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AccessControlProvider.java
@@ -28,7 +28,7 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 /**
  * This class defines an interface for managing the life-cycle of an
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AccessLogger.java b/opendj-sdk/opends/src/server/org/opends/server/api/AccessLogger.java
index 5be6cb9..06a05d7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AccessLogger.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AccessLogger.java
@@ -36,12 +36,12 @@
 import org.opends.server.core.CompareOperation;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.core.UnbindOperation;
 import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchResultReference;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AccountStatusNotificationHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/AccountStatusNotificationHandler.java
index c221c07..3149ab2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AccountStatusNotificationHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AccountStatusNotificationHandler.java
@@ -30,10 +30,10 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AccountStatusNotification;
 import org.opends.server.types.AccountStatusNotificationType;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AlertHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/AlertHandler.java
index 1902d38..6908182 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AlertHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AlertHandler.java
@@ -30,7 +30,7 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AttributeSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/api/AttributeSyntax.java
index 032842c..c98668f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AttributeSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AttributeSyntax.java
@@ -30,8 +30,8 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/AttributeValueDecoder.java b/opendj-sdk/opends/src/server/org/opends/server/api/AttributeValueDecoder.java
index cb995a7..1a5bc9b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/AttributeValueDecoder.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/AttributeValueDecoder.java
@@ -26,8 +26,8 @@
  */
 package org.opends.server.api;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 
 /**
  * A factory interface for decoding attribute values into objects.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java b/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
index 6d34b8f..a97914c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
@@ -36,21 +36,21 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CancelledOperationException;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.RestoreConfig;
 import org.opends.server.types.WritabilityMode;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/CertificateMapper.java b/opendj-sdk/opends/src/server/org/opends/server/api/CertificateMapper.java
index 1cec5b7..c77cdeb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/CertificateMapper.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/CertificateMapper.java
@@ -32,9 +32,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ClientConnection.java b/opendj-sdk/opends/src/server/org/opends/server/api/ClientConnection.java
index a200851..7fec595 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ClientConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ClientConnection.java
@@ -34,14 +34,14 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.opends.server.api.plugin.IntermediateResponsePluginResult;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.Operation;
 import org.opends.server.core.PersistentSearch;
 import org.opends.server.core.PluginConfigManager;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.AuthenticationInfo;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.IntermediateResponse;
 import org.opends.server.types.SearchResultEntry;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ConfigHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/ConfigHandler.java
index 29cf789..c456c03 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ConfigHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ConfigHandler.java
@@ -30,9 +30,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionHandler.java
index 8ea6119..74a03e3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionHandler.java
@@ -31,7 +31,7 @@
 import java.util.Collection;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionSecurityProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionSecurityProvider.java
index 19f5318..7b053b8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionSecurityProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ConnectionSecurityProvider.java
@@ -32,8 +32,8 @@
 import java.nio.channels.SocketChannel;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/DebugLogger.java b/opendj-sdk/opends/src/server/org/opends/server/api/DebugLogger.java
index 4fafae0..fcf1dd0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/DebugLogger.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/DebugLogger.java
@@ -31,9 +31,9 @@
 import java.nio.ByteBuffer;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
index c06d4f9..8cea1da 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/EntryCache.java
@@ -33,9 +33,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LockType;
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ErrorLogger.java b/opendj-sdk/opends/src/server/org/opends/server/api/ErrorLogger.java
index 564c963..1d236a0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ErrorLogger.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ErrorLogger.java
@@ -30,9 +30,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/ExtendedOperationHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/ExtendedOperationHandler.java
index 3f91e4b..b9e2197 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/ExtendedOperationHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/ExtendedOperationHandler.java
@@ -31,7 +31,7 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/IdentityMapper.java b/opendj-sdk/opends/src/server/org/opends/server/api/IdentityMapper.java
index c52c257..b20e0cb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/IdentityMapper.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/IdentityMapper.java
@@ -30,9 +30,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/InvokableComponent.java b/opendj-sdk/opends/src/server/org/opends/server/api/InvokableComponent.java
index 0aaca2a..2476652 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/InvokableComponent.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/InvokableComponent.java
@@ -29,7 +29,7 @@
 
 
 import org.opends.server.config.ConfigAttribute;
-import org.opends.server.core.DirectoryException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.InvokableMethod;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/KeyManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/KeyManagerProvider.java
index 5e7422d..cc9881f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/KeyManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/KeyManagerProvider.java
@@ -32,8 +32,8 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/MatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/api/MatchingRule.java
index 116e997..8fbdea3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/MatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/MatchingRule.java
@@ -30,10 +30,10 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/MonitorProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/MonitorProvider.java
index 15739a8..bc80452 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/MonitorProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/MonitorProvider.java
@@ -32,8 +32,8 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.Attribute;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordGenerator.java b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordGenerator.java
index f838eae..0eda61b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordGenerator.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordGenerator.java
@@ -30,10 +30,10 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordStorageScheme.java
index a4ab549..d1aab74 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordStorageScheme.java
@@ -30,9 +30,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordValidator.java b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordValidator.java
index 86ecdb1..d9cdfbf 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/PasswordValidator.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/PasswordValidator.java
@@ -31,9 +31,9 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.Operation;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/SASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/api/SASLMechanismHandler.java
index 263a5a1..371fc0e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/SASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/SASLMechanismHandler.java
@@ -31,7 +31,7 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/SubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/api/SubstringMatchingRule.java
index 644c4de..024515e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/SubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/SubstringMatchingRule.java
@@ -30,9 +30,9 @@
 
 import java.util.List;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/SynchronizationProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/SynchronizationProvider.java
index dc15885..b2570f7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/SynchronizationProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/SynchronizationProvider.java
@@ -32,10 +32,10 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.SynchronizationProviderResult;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/TrustManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/api/TrustManagerProvider.java
index 61ec486..c827417 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/TrustManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/TrustManagerProvider.java
@@ -32,8 +32,8 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/VirtualAttribute.java b/opendj-sdk/opends/src/server/org/opends/server/api/VirtualAttribute.java
index 2720dee..36412c7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/VirtualAttribute.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/VirtualAttribute.java
@@ -30,11 +30,11 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.SearchResultEntry;
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/WorkQueue.java b/opendj-sdk/opends/src/server/org/opends/server/api/WorkQueue.java
index b7abafa..901057a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/WorkQueue.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/WorkQueue.java
@@ -30,9 +30,9 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.Operation;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java
index 5e32e45..6dc6a66 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java
@@ -33,28 +33,21 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AbandonOperation;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.BindOperation;
-import org.opends.server.core.CompareOperation;
-import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.SearchOperation;
-import org.opends.server.core.UnbindOperation;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.IntermediateResponse;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchResultReference;
+import org.opends.server.types.operation.*;
 
 import static org.opends.server.loggers.Debug.*;
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.messages.PluginMessages.*;
 
 
 
@@ -168,7 +161,7 @@
    *
    * @return  The DN of the configuration entry for this plugin.
    */
-  public DN getPluginEntryDN()
+  public final DN getPluginEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getPluginEntryDN");
 
@@ -183,7 +176,7 @@
    *
    * @return  The plugin types for which this plugin is registered.
    */
-  public Set<PluginType> getPluginTypes()
+  public final Set<PluginType> getPluginTypes()
   {
     assert debugEnter(CLASS_NAME, "getPluginTypes");
 
@@ -196,8 +189,7 @@
    * Performs any processing that should be done when the Directory
    * Server is in the process of starting.  This method will be called
    * after virtually all other initialization has been performed but
-   * before other plugins have before the connection handlers are
-   * started.
+   * before the connection handlers are started.
    *
    * @return  The result of the startup plugin processing.
    */
@@ -205,8 +197,10 @@
   {
     assert debugEnter(CLASS_NAME, "doStartup");
 
-    // No implementation is required by default.
-    return new StartupPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.STARTUP.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -222,7 +216,10 @@
   {
     assert debugEnter(CLASS_NAME, "doShutdown");
 
-    // No implementation is required by default.
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.SHUTDOWN.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -244,8 +241,10 @@
     assert debugEnter(CLASS_NAME, "doPostConnect",
                       String.valueOf(clientConnection));
 
-    // No implementation is required by default.
-    return new PostConnectPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.POST_CONNECT.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -278,8 +277,10 @@
                       String.valueOf(messageID),
                       String.valueOf(message));
 
-    // No implementation is required by default.
-    return new PostDisconnectPluginResult();
+    int    msgID = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String msg   = getMessage(msgID, String.valueOf(pluginDN),
+                              PluginType.POST_DISCONNECT.getName());
+    throw new UnsupportedOperationException(msg);
   }
 
 
@@ -303,8 +304,10 @@
                       String.valueOf(importConfig),
                       String.valueOf(entry));
 
-    // No implementation is required by default.
-    return new LDIFPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.LDIF_IMPORT.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -326,8 +329,10 @@
                       String.valueOf(exportConfig),
                       String.valueOf(entry));
 
-    // No implementation is required by default.
-    return new LDIFPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.LDIF_EXPORT.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -341,14 +346,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(AbandonOperation
-                                              abandonOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseAbandonOperation abandonOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(abandonOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_ABANDON.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -364,13 +371,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(AbandonOperation abandonOperation)
+       doPostOperation(PostOperationAbandonOperation abandonOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(abandonOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_OPERATION_ABANDON.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -383,13 +393,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(AddOperation addOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(addOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.PRE_PARSE_ADD.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -405,14 +418,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreOperationPluginResult doPreOperation(AddOperation
-                                                      addOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(addOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_ADD.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -428,14 +443,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostOperationPluginResult doPostOperation(AddOperation
-                                                        addOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(addOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_ADD.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -451,14 +468,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostResponsePluginResult doPostResponse(AddOperation
-                                                      addOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(addOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_ADD.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -472,13 +491,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(BindOperation bindOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseBindOperation bindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(bindOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                                PluginType.PRE_PARSE_BIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -492,14 +514,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreOperationPluginResult doPreOperation(BindOperation
-                                                      bindOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationBindOperation bindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(bindOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_BIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -515,14 +539,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostOperationPluginResult doPostOperation(BindOperation
-                                                        bindOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationBindOperation bindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(bindOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_BIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -538,14 +564,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostResponsePluginResult doPostResponse(BindOperation
-                                                      bindOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseBindOperation bindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(bindOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_BIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -559,14 +587,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(CompareOperation
-                                              compareOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseCompareOperation compareOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(compareOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_COMPARE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -581,13 +611,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PreOperationPluginResult
-              doPreOperation(CompareOperation compareOperation)
+       doPreOperation(PreOperationCompareOperation compareOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(compareOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_COMPARE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -604,13 +636,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(CompareOperation compareOperation)
+       doPostOperation(PostOperationCompareOperation compareOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(compareOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_OPERATION_COMPARE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -627,13 +662,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostResponsePluginResult
-              doPostResponse(CompareOperation compareOperation)
+       doPostResponse(PostResponseCompareOperation compareOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(compareOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_COMPARE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -647,14 +684,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(DeleteOperation
-                                              deleteOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseDeleteOperation deleteOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(deleteOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_DELETE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -670,14 +709,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreOperationPluginResult doPreOperation(DeleteOperation
-                                                      deleteOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationDeleteOperation deleteOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(deleteOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_DELETE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -694,13 +735,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(DeleteOperation deleteOperation)
+       doPostOperation(PostOperationDeleteOperation deleteOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(deleteOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_DELETE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -716,14 +759,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostResponsePluginResult doPostResponse(DeleteOperation
-                                                      deleteOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseDeleteOperation deleteOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(deleteOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_DELETE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -737,14 +782,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(ExtendedOperation
-                                              extendedOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseExtendedOperation extendedOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(extendedOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_EXTENDED.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -760,13 +807,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PreOperationPluginResult
-              doPreOperation(ExtendedOperation extendedOperation)
+       doPreOperation(PreOperationExtendedOperation extendedOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(extendedOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.PRE_OPERATION_EXTENDED.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -784,13 +834,17 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(ExtendedOperation extendedOperation)
+       doPostOperation(PostOperationExtendedOperation
+                            extendedOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(extendedOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_OPERATION_EXTENDED.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -807,13 +861,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostResponsePluginResult
-              doPostResponse(ExtendedOperation extendedOperation)
+       doPostResponse(PostResponseExtendedOperation extendedOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(extendedOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_RESPONSE_EXTENDED.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -827,14 +884,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(ModifyOperation
-                                              modifyOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyOperation modifyOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(modifyOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_MODIFY.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -850,14 +909,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(modifyOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_MODIFY.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -874,13 +935,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(ModifyOperation modifyOperation)
+       doPostOperation(PostOperationModifyOperation modifyOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(modifyOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_MODIFY.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -896,14 +959,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostResponsePluginResult doPostResponse(ModifyOperation
-                                                      modifyOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseModifyOperation modifyOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(modifyOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_MODIFY.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -917,14 +982,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(ModifyDNOperation
-                                              modifyDNOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyDNOperation modifyDNOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(modifyDNOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_MODIFY_DN.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -942,13 +1009,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PreOperationPluginResult
-              doPreOperation(ModifyDNOperation modifyDNOperation)
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(modifyDNOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.PRE_OPERATION_MODIFY_DN.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -965,13 +1035,17 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(ModifyDNOperation modifyDNOperation)
+       doPostOperation(PostOperationModifyDNOperation
+                            modifyDNOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(modifyDNOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_OPERATION_MODIFY_DN.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -988,13 +1062,16 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostResponsePluginResult
-              doPostResponse(ModifyDNOperation modifyDNOperation)
+       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(modifyDNOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.POST_RESPONSE_MODIFY_DN.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1008,14 +1085,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(SearchOperation
-                                              searchOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseSearchOperation searchOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(searchOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_SEARCH.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1029,14 +1108,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreOperationPluginResult doPreOperation(SearchOperation
-                                                      searchOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationSearchOperation searchOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(searchOperation));
 
-    // No implementation is required by default.
-    return new PreOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_OPERATION_SEARCH.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1057,16 +1138,18 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public SearchEntryPluginResult processSearchEntry(
-                                      SearchOperation searchOperation,
-                                      SearchResultEntry searchEntry)
+  public SearchEntryPluginResult
+       processSearchEntry(SearchEntrySearchOperation searchOperation,
+                          SearchResultEntry searchEntry)
   {
     assert debugEnter(CLASS_NAME, "processSearchEntry",
                       String.valueOf(searchOperation),
                       String.valueOf(searchEntry));
 
-    // No implementation is required by default.
-    return new SearchEntryPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.SEARCH_RESULT_ENTRY.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1084,15 +1167,19 @@
    * @return  Information about the result of the plugin processing.
    */
   public SearchReferencePluginResult
-              processSearchReference(SearchOperation searchOperation,
-                   SearchResultReference searchReference)
+       processSearchReference(SearchReferenceSearchOperation
+                                   searchOperation,
+                              SearchResultReference searchReference)
   {
     assert debugEnter(CLASS_NAME, "processSearchReference",
                       String.valueOf(searchOperation),
                       String.valueOf(searchReference));
 
-    // No implementation is required by default.
-    return new SearchReferencePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message =
+         getMessage(msgID, String.valueOf(pluginDN),
+                    PluginType.SEARCH_RESULT_REFERENCE.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1109,13 +1196,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(SearchOperation searchOperation)
+       doPostOperation(PostOperationSearchOperation searchOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(searchOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_SEARCH.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1131,14 +1220,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PostResponsePluginResult doPostResponse(SearchOperation
-                                                      searchOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseSearchOperation searchOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostResponse",
                       String.valueOf(searchOperation));
 
-    // No implementation is required by default.
-    return new PostResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_RESPONSE_SEARCH.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1152,14 +1243,16 @@
    *
    * @return  Information about the result of the plugin processing.
    */
-  public PreParsePluginResult doPreParse(UnbindOperation
-                                              unbindOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseUnbindOperation unbindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParse",
                       String.valueOf(unbindOperation));
 
-    // No implementation is required by default.
-    return new PreParsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.PRE_PARSE_UNBIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1175,13 +1268,15 @@
    * @return  Information about the result of the plugin processing.
    */
   public PostOperationPluginResult
-              doPostOperation(UnbindOperation unbindOperation)
+       doPostOperation(PostOperationUnbindOperation unbindOperation)
   {
     assert debugEnter(CLASS_NAME, "doPostOperation",
                       String.valueOf(unbindOperation));
 
-    // No implementation is required by default.
-    return new PostOperationPluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.POST_OPERATION_UNBIND.getName());
+    throw new UnsupportedOperationException(message);
   }
 
 
@@ -1202,8 +1297,10 @@
     assert debugEnter(CLASS_NAME, "processIntermediateResponse",
                       String.valueOf(intermediateResponse));
 
-    // No implementation is required by default.
-    return new IntermediateResponsePluginResult();
+    int    msgID   = MSGID_PLUGIN_TYPE_NOT_SUPPORTED;
+    String message = getMessage(msgID, String.valueOf(pluginDN),
+                          PluginType.INTERMEDIATE_RESPONSE.getName());
+    throw new UnsupportedOperationException(message);
   }
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/authorization/BasicAccessControlProvider.java b/opendj-sdk/opends/src/server/org/opends/server/authorization/BasicAccessControlProvider.java
index 0aeac1a..e811a4e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/authorization/BasicAccessControlProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/authorization/BasicAccessControlProvider.java
@@ -33,7 +33,7 @@
 import org.opends.server.api.AccessControlProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 /**
  * This class implements an access control handler for the Directory
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/BackupBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/BackupBackend.java
index 45b18eb..46b7195 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/BackupBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/BackupBackend.java
@@ -47,9 +47,7 @@
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -63,8 +61,10 @@
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/MemoryBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/MemoryBackend.java
index 8b7d080..25707d4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/MemoryBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/MemoryBackend.java
@@ -38,7 +38,6 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
@@ -46,6 +45,7 @@
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDIFExportConfig;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/MonitorBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/MonitorBackend.java
index 83fc08b..7e99db6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/MonitorBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/MonitorBackend.java
@@ -44,9 +44,7 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -57,8 +55,10 @@
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/RootDSEBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/RootDSEBackend.java
index 36fb224..ee96da1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/RootDSEBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/RootDSEBackend.java
@@ -48,13 +48,8 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CancelledOperationException;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -64,11 +59,16 @@
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/SchemaBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/SchemaBackend.java
index d3a6dd7..f70eda6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/SchemaBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/SchemaBackend.java
@@ -59,11 +59,8 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CryptoManager;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -74,10 +71,13 @@
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.CryptoManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index 9087e42..1de8247 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -40,11 +40,11 @@
 
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.api.OrderingMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 import org.opends.server.types.SearchFilter;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index a0b575e..f838746 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -58,23 +58,23 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CancelledOperationException;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.CancelledOperationException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
 import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.RestoreConfig;
@@ -1046,9 +1046,9 @@
    * @param modifyDNOperation The modify DN operation with which this action is
    *                          associated.  This may be <CODE>null</CODE> for
    *                          modify DN operations performed internally.
-   * @throws org.opends.server.core.DirectoryException
+   * @throws org.opends.server.types.DirectoryException
    *          If a problem occurs while trying to perform the rename.
-   * @throws org.opends.server.core.CancelledOperationException
+   * @throws org.opends.server.types.CancelledOperationException
    *          If this backend noticed and reacted to a request to cancel or
    *          abandon the modify DN operation.
    */
@@ -1104,7 +1104,7 @@
    * <CODE>SearchOperation.returnEntry</CODE> method.
    *
    * @param searchOperation The search operation to be processed.
-   * @throws org.opends.server.core.DirectoryException
+   * @throws org.opends.server.types.DirectoryException
    *          If a problem occurs while processing the search.
    */
   public void search(SearchOperation searchOperation)
@@ -1142,7 +1142,7 @@
    * @param configEntry  The configuration entry for this backend.
    * @param baseDNs      The set of base DNs configured for this backend.
    * @param exportConfig The configuration to use when performing the export.
-   * @throws org.opends.server.core.DirectoryException
+   * @throws org.opends.server.types.DirectoryException
    *          If a problem occurs while performing the LDIF export.
    */
   public void exportLDIF(ConfigEntry configEntry, DN[] baseDNs,
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackupManager.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackupManager.java
index f49d7a9..1eaf9e7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackupManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackupManager.java
@@ -28,13 +28,13 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.CryptoManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.util.DynamicConstants;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
+import org.opends.server.types.CryptoManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.RestoreConfig;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Config.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Config.java
index 1d3a209..d6d3a96 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Config.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Config.java
@@ -52,9 +52,9 @@
 import org.opends.server.config.IntegerWithUnitConfigAttribute;
 import org.opends.server.config.MultiChoiceConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
index bbec3e0..8f3c3c1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
@@ -37,13 +37,13 @@
 import com.sleepycat.je.OperationStatus;
 import com.sleepycat.je.Transaction;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDAPURL;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index 6563d81..050782e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -41,9 +41,7 @@
 import org.opends.server.api.Backend;
 import org.opends.server.api.EntryCache;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CancelledOperationException;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
@@ -55,7 +53,9 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.CancelledOperationException;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LockType;
@@ -504,7 +504,7 @@
    * <CODE>SearchOperation.returnEntry</CODE> method.
    *
    * @param searchOperation The search operation to be processed.
-   * @throws org.opends.server.core.DirectoryException
+   * @throws org.opends.server.types.DirectoryException
    *          If a problem occurs while processing the
    *          search.
    * @throws DatabaseException If an error occurs in the JE database.
@@ -2454,10 +2454,10 @@
    * @param modifyDNOperation The modify DN operation with which this action
    *                          is associated.  This may be <CODE>null</CODE>
    *                          for modify DN operations performed internally.
-   * @throws org.opends.server.core.DirectoryException
+   * @throws org.opends.server.types.DirectoryException
    *          If a problem occurs while trying to perform
    *          the rename.
-   * @throws org.opends.server.core.CancelledOperationException
+   * @throws org.opends.server.types.CancelledOperationException
    *          If this backend noticed and reacted
    *          to a request to cancel or abandon the
    *          modify DN operation.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
index 5af7e7b..e01051b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
@@ -31,11 +31,11 @@
 import com.sleepycat.je.Transaction;
 import com.sleepycat.je.DatabaseException;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ImportJob.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ImportJob.java
index 3abaabe..3c4074b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ImportJob.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ImportJob.java
@@ -34,12 +34,12 @@
 import com.sleepycat.je.Transaction;
 
 import org.opends.server.api.Backend;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.loggers.Debug;
 import org.opends.server.messages.JebMessages;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
index 38be22d..e32e99f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -41,9 +41,9 @@
 import com.sleepycat.je.OperationStatus;
 import com.sleepycat.je.Transaction;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JebFormat.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JebFormat.java
index bc4507e..2e7f420 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JebFormat.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/JebFormat.java
@@ -29,8 +29,6 @@
 
 import static org.opends.server.loggers.Debug.debugEnter;
 
-import org.opends.server.core.CryptoManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1Exception;
@@ -42,6 +40,8 @@
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.CryptoManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
index 6b73dbd..9209534 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
@@ -29,11 +29,11 @@
 import static org.opends.server.loggers.Debug.debugException;
 
 import org.opends.server.api.OrderingMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
index 249cfc2..ed494c1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -28,10 +28,10 @@
 
 import static org.opends.server.loggers.Debug.debugException;
 import com.sleepycat.je.Transaction;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
index 2514217..bd62750 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
@@ -42,7 +42,6 @@
 
 import org.opends.server.api.Backend;
 import org.opends.server.api.OrderingMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.loggers.Debug;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -53,6 +52,7 @@
 import org.opends.server.types.ConditionResult;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/RecurringTask.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/RecurringTask.java
index a539527..703c7d4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/RecurringTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/RecurringTask.java
@@ -32,13 +32,13 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/Task.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/Task.java
index e764a35..42c7b90 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/Task.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/Task.java
@@ -38,16 +38,16 @@
 import java.util.TimeZone;
 import java.util.UUID;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.TimeThread;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
index 6596c97..79e4181 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
@@ -43,11 +43,8 @@
 import org.opends.server.config.IntegerWithUnitConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CancelledOperationException;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -55,7 +52,10 @@
 import org.opends.server.types.Entry;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.CancelledOperationException;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.RestoreConfig;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
index d141cc6..edd9a3a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
@@ -41,18 +41,18 @@
 
 import org.opends.server.api.AlertGenerator;
 import org.opends.server.api.DirectoryThread;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ExistingFileBehavior;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/changelog/ChangelogDB.java b/opendj-sdk/opends/src/server/org/opends/server/changelog/ChangelogDB.java
index e03e7b6..45c6544 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/changelog/ChangelogDB.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/changelog/ChangelogDB.java
@@ -35,10 +35,10 @@
 import java.io.File;
 import java.io.UnsupportedEncodingException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.synchronization.ChangeNumber;
 import org.opends.server.synchronization.UpdateMessage;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/changelog/DbHandler.java b/opendj-sdk/opends/src/server/org/opends/server/changelog/DbHandler.java
index a27e614..45468b2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/changelog/DbHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/changelog/DbHandler.java
@@ -45,9 +45,9 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.TimeThread;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.synchronization.ChangeNumber;
 import org.opends.server.synchronization.UpdateMessage;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/changelog/ServerHandler.java b/opendj-sdk/opends/src/server/org/opends/server/changelog/ServerHandler.java
index 8df756c..fc482a8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/changelog/ServerHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/changelog/ServerHandler.java
@@ -49,8 +49,8 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.synchronization.AckMessage;
 import org.opends.server.synchronization.ChangeNumber;
 import org.opends.server.synchronization.ChangelogStartMessage;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/config/ConfigFileHandler.java b/opendj-sdk/opends/src/server/org/opends/server/config/ConfigFileHandler.java
index c23021b..a2dca3f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/config/ConfigFileHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/config/ConfigFileHandler.java
@@ -62,11 +62,8 @@
 import org.opends.server.api.ConfigHandler;
 import org.opends.server.api.ConfigurableComponent;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.CryptoManager;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.SearchOperation;
@@ -75,11 +72,14 @@
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.CryptoManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ExistingFileBehavior;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/config/JMXMBean.java b/opendj-sdk/opends/src/server/org/opends/server/config/JMXMBean.java
index 396c08a..8a649c3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/config/JMXMBean.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/config/JMXMBean.java
@@ -53,11 +53,11 @@
 import org.opends.server.api.DirectoryServerMBean;
 import org.opends.server.api.InvokableComponent;
 import org.opends.server.api.MonitorProvider;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.jmx.Credential;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java b/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
index a3a0947..27cfb52 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
@@ -31,9 +31,7 @@
 import java.util.ArrayList;
 import java.util.concurrent.locks.Lock;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -41,8 +39,10 @@
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java b/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
index 05def8a..34d8f06 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
@@ -31,17 +31,17 @@
 import java.util.concurrent.locks.Lock;
 
 import org.opends.server.api.IdentityMapper;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
index f090985..068fb60 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
@@ -32,8 +32,13 @@
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.plugin.PreParsePluginResult;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.PostOperationAbandonOperation;
+import org.opends.server.types.operation.PreParseAbandonOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Access.*;
@@ -50,6 +55,7 @@
  */
 public class AbandonOperation
        extends Operation
+       implements PreParseAbandonOperation, PostOperationAbandonOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -60,7 +66,7 @@
 
 
   // The message ID of the operation that should be abandoned.
-  private int idToAbandon;
+  private final int idToAbandon;
 
   // The time that processing started on this operation.
   private long processingStartTime;
@@ -104,7 +110,7 @@
    *
    * @return  The message ID of the operation that should be abandoned.
    */
-  public int getIDToAbandon()
+  public final int getIDToAbandon()
   {
     assert debugEnter(CLASS_NAME, "getIDToAbandon");
 
@@ -114,11 +120,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -128,12 +133,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the result was logged.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -143,14 +146,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -160,12 +159,13 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
+    assert debugEnter(CLASS_NAME, "getOperationType");
+
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
 
@@ -175,17 +175,13 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
+    assert debugEnter(CLASS_NAME, "getRequestLogElements");
+
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
 
@@ -198,16 +194,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -241,15 +231,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.  Note that abandon operations
-   * must never have an associated response, so this method will not be used for
-   * this type of operation.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -261,12 +246,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    // An abandon operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    // An abandon operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -365,16 +370,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.  Note
-   * that an abandon operation may not be canceled, so this should never do
-   * anything.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -385,14 +384,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.  Note that an abandon operation may not be canceled, so this
-   * will always return <CODE>null</CODE>.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -402,12 +397,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AbsoluteSubtreeSpecification.java b/opendj-sdk/opends/src/server/org/opends/server/core/AbsoluteSubtreeSpecification.java
index f2daaa8..53d8abd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AbsoluteSubtreeSpecification.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AbsoluteSubtreeSpecification.java
@@ -35,6 +35,7 @@
 import java.util.InputMismatchException;
 import java.util.NoSuchElementException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AccessControlConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/AccessControlConfigManager.java
index 4e0a415..a449933 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AccessControlConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AccessControlConfigManager.java
@@ -47,6 +47,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 /**
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
index d61c62d..c0b66e1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/AddOperation.java
index f9cd074..26510ee 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AddOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AddOperation.java
@@ -62,17 +62,27 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ObjectClass;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SynchronizationProviderResult;
+import org.opends.server.types.operation.PostOperationAddOperation;
+import org.opends.server.types.operation.PostResponseAddOperation;
+import org.opends.server.types.operation.PreOperationAddOperation;
+import org.opends.server.types.operation.PreParseAddOperation;
 import org.opends.server.util.TimeThread;
 
 import static org.opends.server.config.ConfigConstants.*;
@@ -94,6 +104,8 @@
  */
 public class AddOperation
        extends Operation
+       implements PreParseAddOperation, PreOperationAddOperation,
+                  PostOperationAddOperation, PostResponseAddOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -275,7 +287,7 @@
    *
    * @return  The DN of the entry in a raw, unparsed form.
    */
-  public ByteString getRawEntryDN()
+  public final ByteString getRawEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getRawEntryDN");
 
@@ -293,7 +305,7 @@
    *
    * @param  rawEntryDN  The raw entry DN for the entry to add.
    */
-  public void setRawEntryDN(ByteString rawEntryDN)
+  public final void setRawEntryDN(ByteString rawEntryDN)
   {
     assert debugEnter(CLASS_NAME, "setRawEntryDN", String.valueOf(rawEntryDN));
 
@@ -312,7 +324,7 @@
    * @return  The DN of the entry to add, or <CODE>null</CODE> if it has not yet
    *          been parsed from the raw DN.
    */
-  public DN getEntryDN()
+  public final DN getEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getEntryDN");
 
@@ -322,22 +334,6 @@
 
 
   /**
-   * Specifies the DN of the entry to add.  This method should not be called by
-   * pre-parse plugins, in which case the <CODE>setRawEntryDN</CODE> method
-   * should be used instead.
-   *
-   * @param  entryDN  The DN of the entry to add.
-   */
-  public void setEntryDN(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "setEntryDN", String.valueOf(entryDN));
-
-    this.entryDN = entryDN;
-  }
-
-
-
-  /**
    * Retrieves the set of attributes in their raw, unparsed form as read from
    * the client request.  Some of these attributes may be invalid as no
    * validation will have been performed on them.  The returned list must not be
@@ -346,7 +342,7 @@
    * @return  The set of attributes in their raw, unparsed form as read from the
    *          client request.
    */
-  public List<LDAPAttribute> getRawAttributes()
+  public final List<LDAPAttribute> getRawAttributes()
   {
     assert debugEnter(CLASS_NAME, "getRawAttributes");
 
@@ -362,7 +358,7 @@
    * @param  rawAttribute  The attribute to add to the set of raw attributes for
    *                       this add operation.
    */
-  public void addRawAttribute(LDAPAttribute rawAttribute)
+  public final void addRawAttribute(LDAPAttribute rawAttribute)
   {
     assert debugEnter(CLASS_NAME, "addRawAttribute",
                       String.valueOf(rawAttribute));
@@ -382,7 +378,7 @@
    *
    * @param  rawAttributes  The set of raw attributes for this add operation.
    */
-  public void setRawAttributes(List<LDAPAttribute> rawAttributes)
+  public final void setRawAttributes(List<LDAPAttribute> rawAttributes)
   {
     assert debugEnter(CLASS_NAME, "setRawAttributes",
                       String.valueOf(rawAttributes));
@@ -399,13 +395,13 @@
   /**
    * Retrieves the set of processed objectclasses for the entry to add.  This
    * should not be called by pre-parse plugins because this information will not
-   * yet be available.  The contents of the returned map may be altered by the
-   * caller.
+   * yet be available.  The contents of the returned map may not be altered by
+   * the caller.
    *
    * @return  The set of processed objectclasses for the entry to add, or
    *          <CODE>null</CODE> if that information is not yet available.
    */
-  public Map<ObjectClass,String> getObjectClasses()
+  public final Map<ObjectClass,String> getObjectClasses()
   {
     assert debugEnter(CLASS_NAME, "getObjectClasses");
 
@@ -415,6 +411,45 @@
 
 
   /**
+   * Adds the provided objectclass to the entry to add.  This should only be
+   * called from pre-operation plugins.  Note that pre-operation plugin
+   * processing is invoked after access control and schema validation, so
+   * plugins should be careful to only make changes that will not violate either
+   * schema or access control rules.
+   *
+   * @param  objectClass  The objectclass to add to the entry.
+   * @param  name         The name to use for the objectclass.
+   */
+  public final void addObjectClass(ObjectClass objectClass, String name)
+  {
+    assert debugEnter(CLASS_NAME, "addObjectClass", String.valueOf(objectClass),
+                      String.valueOf(name));
+
+    objectClasses.put(objectClass, name);
+  }
+
+
+
+  /**
+   * Removes the provided objectclass from the entry to add.  This should only
+   * be called from pre-operation plugins.  Note that pre-operation plugin
+   * processing is invoked after access control and schema validation, so
+   * plugins should be careful to only make changes that will not violate either
+   * schema or access control rules.
+   *
+   * @param  objectClass  The objectclass to remove from the entry.
+   */
+  public final void removeObjectClass(ObjectClass objectClass)
+  {
+    assert debugEnter(CLASS_NAME, "removeObjectClass",
+                      String.valueOf(objectClass));
+
+    objectClasses.remove(objectClass);
+  }
+
+
+
+  /**
    * Retrieves the set of processed user attributes for the entry to add.  This
    * should not be called by pre-parse plugins because this information will not
    * yet be available.  The contents of the returned map may be altered by the
@@ -423,7 +458,7 @@
    * @return  The set of processed user attributes for the entry to add, or
    *          <CODE>null</CODE> if that information is not yet available.
    */
-  public Map<AttributeType,List<Attribute>> getUserAttributes()
+  public final Map<AttributeType,List<Attribute>> getUserAttributes()
   {
     assert debugEnter(CLASS_NAME, "getUserAttributes");
 
@@ -441,7 +476,7 @@
    * @return  The set of processed operational attributes for the entry to add,
    *          or <CODE>null</CODE> if that information is not yet available.
    */
-  public Map<AttributeType,List<Attribute>> getOperationalAttributes()
+  public final Map<AttributeType,List<Attribute>> getOperationalAttributes()
   {
     assert debugEnter(CLASS_NAME, "getOperationalAttributes");
 
@@ -451,6 +486,75 @@
 
 
   /**
+   * Sets the specified attribute in the entry to add, overwriting any existing
+   * attribute of the specified type if necessary.  This should only be called
+   * from pre-operation plugins.  Note that pre-operation plugin processing is
+   * invoked after access control and schema validation, so plugins should be
+   * careful to only make changes that will not violate either schema or access
+   * control rules.
+   *
+   * @param  attributeType  The attribute type for the attribute.
+   * @param  attributeList  The attribute list for the provided attribute type.
+   */
+  public final void setAttribute(AttributeType attributeType,
+                                 List<Attribute> attributeList)
+  {
+    assert debugEnter(CLASS_NAME, "setAttribute", String.valueOf(attributeType),
+                      String.valueOf(attributeList));
+
+    if (attributeType.isOperational())
+    {
+      if ((attributeList == null) || (attributeList.isEmpty()))
+      {
+        operationalAttributes.remove(attributeType);
+      }
+      else
+      {
+        operationalAttributes.put(attributeType, attributeList);
+      }
+    }
+    else
+    {
+      if ((attributeList == null) || (attributeList.isEmpty()))
+      {
+        userAttributes.remove(attributeType);
+      }
+      else
+      {
+        userAttributes.put(attributeType, attributeList);
+      }
+    }
+  }
+
+
+
+  /**
+   * Removes the specified attribute from the entry to add. This should only be
+   * called from pre-operation plugins.  Note that pre-operation processing is
+   * invoked after access control and schema validation, so plugins should be
+   * careful to only make changes that will not violate either schema or access
+   * control rules.
+   *
+   * @param  attributeType  The attribute tyep for the attribute to remove.
+   */
+  public final void removeAttribute(AttributeType attributeType)
+  {
+    assert debugEnter(CLASS_NAME, "removeAttribute",
+                      String.valueOf(attributeType));
+
+    if (attributeType.isOperational())
+    {
+      operationalAttributes.remove(attributeType);
+    }
+    else
+    {
+      userAttributes.remove(attributeType);
+    }
+  }
+
+
+
+  /**
    * Retrieves the entry to be added to the server.  Note that this will not be
    * available to pre-parse plugins or during the conflict resolution portion of
    * the synchronization processing.
@@ -458,7 +562,7 @@
    * @return  The entry to be added to the server, or <CODE>null</CODE> if it is
    *          not yet available.
    */
-  public Entry getEntryToAdd()
+  public final Entry getEntryToAdd()
   {
     assert debugEnter(CLASS_NAME, "getEntryToAdd");
 
@@ -468,11 +572,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -482,13 +585,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -498,14 +598,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -521,7 +617,7 @@
    *          if none has been assigned yet or if there is no applicable
    *          synchronization mechanism in place that uses change numbers.
    */
-  public long getChangeNumber()
+  public final long getChangeNumber()
   {
     assert debugEnter(CLASS_NAME, "getChangeNumber");
 
@@ -537,7 +633,7 @@
    * @param  changeNumber  The change number that has been assigned to this
    *                       operation by the synchronization mechanism.
    */
-  public void setChangeNumber(long changeNumber)
+  public final void setChangeNumber(long changeNumber)
   {
     assert debugEnter(CLASS_NAME, "setChangeNumber",
                       String.valueOf(changeNumber));
@@ -548,11 +644,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -563,16 +658,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -586,16 +675,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -661,13 +744,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public ArrayList<Control> getResponseControls()
+  @Override()
+  public final ArrayList<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -677,12 +757,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -2062,7 +2162,7 @@
    *
    * @param  objectClass  The objectclass to add to the entry.
    */
-  private void addObjectClassChain(ObjectClass objectClass)
+  private final void addObjectClassChain(ObjectClass objectClass)
   {
     assert debugEnter(CLASS_NAME, "addObjectClassChain",
                       String.valueOf(objectClass));
@@ -2093,8 +2193,8 @@
    * @throws  DirectoryException  If a problem occurs while performing password
    *                              policy processing for the add operation.
    */
-  private void handlePasswordPolicy(PasswordPolicy passwordPolicy,
-                                    Entry userEntry)
+  private final void handlePasswordPolicy(PasswordPolicy passwordPolicy,
+                                          Entry userEntry)
          throws DirectoryException
   {
     assert debugEnter(CLASS_NAME, "handlePasswordPolicy",
@@ -2287,14 +2387,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -2332,13 +2428,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -2348,12 +2441,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
@@ -2365,6 +2456,5 @@
     buffer.append(rawEntryDN);
     buffer.append(")");
   }
-
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/BackendConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/BackendConfigManager.java
index 2ebed75..f5cb012 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/BackendConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/BackendConfigManager.java
@@ -51,6 +51,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.WritabilityMode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/BindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/BindOperation.java
index 60d5847..d8ca5b7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/BindOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/BindOperation.java
@@ -53,12 +53,21 @@
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.AuthenticationType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.LockManager;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.PostOperationBindOperation;
+import org.opends.server.types.operation.PostResponseBindOperation;
+import org.opends.server.types.operation.PreOperationBindOperation;
+import org.opends.server.types.operation.PreParseBindOperation;
 
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.core.CoreConstants.*;
@@ -86,6 +95,8 @@
  */
 public class BindOperation
              extends Operation
+             implements PreParseBindOperation, PreOperationBindOperation,
+                        PostOperationBindOperation, PostResponseBindOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -428,7 +439,7 @@
    *
    * @return  The authentication type for this bind operation.
    */
-  public AuthenticationType getAuthenticationType()
+  public final AuthenticationType getAuthenticationType()
   {
     assert debugEnter(CLASS_NAME, "getAuthenticationType");
 
@@ -445,7 +456,7 @@
    * @return  The raw, unprocessed bind DN for this bind operation as contained
    *          in the client request.
    */
-  public ByteString getRawBindDN()
+  public final ByteString getRawBindDN()
   {
     assert debugEnter(CLASS_NAME, "getRawBindDN");
 
@@ -456,13 +467,11 @@
 
   /**
    * Specifies the raw, unprocessed bind DN for this bind operation.  This
-   * should only be called by pre-parse plugins; all other code that wishes to
-   * alter the bind DN should use the <CODE>getBindDN</CODE> and
-   * <CODE>setBindDN</CODE> methods.
+   * should only be called by pre-parse plugins.
    *
    * @param  rawBindDN  The raw, unprocessed bind DN for this bind operation.
    */
-  public void setRawBindDN(ByteString rawBindDN)
+  public final void setRawBindDN(ByteString rawBindDN)
   {
     assert debugEnter(CLASS_NAME, "setRawBindDN", String.valueOf(rawBindDN));
 
@@ -489,7 +498,7 @@
    * @return  The bind DN for this bind operation, or <CODE>null</CODE> if the
    *          raw DN has not yet been processed.
    */
-  public DN getBindDN()
+  public final DN getBindDN()
   {
     assert debugEnter(CLASS_NAME, "getBindDN");
 
@@ -499,27 +508,11 @@
 
 
   /**
-   * Specifies the bind DN for this bind operation. This method should not be
-   * called by pre-parse plugins, which should use <CODE>setRawBindDN</CODE>
-   * instead.
-   *
-   * @param  bindDN  The bind DN for this bind operation.
-   */
-  public void setBindDN(DN bindDN)
-  {
-    assert debugEnter(CLASS_NAME, "setBindDN", String.valueOf(bindDN));
-
-    this.bindDN = bindDN;
-  }
-
-
-
-  /**
    * Retrieves the simple authentication password for this bind operation.
    *
    * @return  The simple authentication password for this bind operation.
    */
-  public ByteString getSimplePassword()
+  public final ByteString getSimplePassword()
   {
     assert debugEnter(CLASS_NAME, "getSimplePassword");
 
@@ -534,7 +527,7 @@
    * @param  simplePassword  The simple authentication password for this bind
    *                         operation.
    */
-  public void setSimplePassword(ByteString simplePassword)
+  public final void setSimplePassword(ByteString simplePassword)
   {
     assert debugEnter(CLASS_NAME, "setSimplePassword",
                       String.valueOf(simplePassword));
@@ -561,7 +554,7 @@
    * @return  The SASL mechanism for this bind operation, or <CODE>null</CODE>
    *          if the bind does not use SASL authentication.
    */
-  public String getSASLMechanism()
+  public final String getSASLMechanism()
   {
     assert debugEnter(CLASS_NAME, "getSASLMechanism");
 
@@ -576,7 +569,7 @@
    * @return  The SASL credentials for this bind operation, or <CODE>null</CODE>
    *          if there are none or if the bind does not use SASL authentication.
    */
-  public ASN1OctetString getSASLCredentials()
+  public final ASN1OctetString getSASLCredentials()
   {
     assert debugEnter(CLASS_NAME, "getSASLCredentials");
 
@@ -592,8 +585,8 @@
    * @param  saslCredentials  The SASL credentials for this bind operation, or
    *                          <CODE>null</CODE> if there are none.
    */
-  public void setSASLCredentials(String saslMechanism,
-                                 ASN1OctetString saslCredentials)
+  public final void setSASLCredentials(String saslMechanism,
+                                       ASN1OctetString saslCredentials)
   {
     assert debugEnter(CLASS_NAME, "setSASLCredentials",
                       String.valueOf(saslCredentials));
@@ -614,7 +607,7 @@
    * @return  The set of server SASL credentials to include in the bind
    *          response, or <CODE>null</CODE> if there are none.
    */
-  public ASN1OctetString getServerSASLCredentials()
+  public final ASN1OctetString getServerSASLCredentials()
   {
     assert debugEnter(CLASS_NAME, "getServerSASLCredentials");
 
@@ -630,7 +623,8 @@
    * @param  serverSASLCredentials  The set of server SASL credentials to
    *                                include in the bind response.
    */
-  public void setServerSASLCredentials(ASN1OctetString serverSASLCredentials)
+  public final void setServerSASLCredentials(ASN1OctetString
+                                                  serverSASLCredentials)
   {
     assert debugEnter(CLASS_NAME, "setServerSASLCredentials",
                       String.valueOf(serverSASLCredentials));
@@ -650,7 +644,7 @@
    *          <CODE>null</CODE> if it was not a SASL authentication or the SASL
    *          processing was not able to map the request to a user.
    */
-  public Entry getSASLAuthUserEntry()
+  public final Entry getSASLAuthUserEntry()
   {
     assert debugEnter(CLASS_NAME, "getSASLAuthUserEntry");
 
@@ -668,7 +662,7 @@
    * @param  saslAuthUserEntry  The user entry associated with the SASL
    *                            authentication attempt.
    */
-  public void setSASLAuthUserEntry(Entry saslAuthUserEntry)
+  public final void setSASLAuthUserEntry(Entry saslAuthUserEntry)
   {
     assert debugEnter(CLASS_NAME, "setSASLAuthUserEntry",
                       String.valueOf(saslAuthUserEntry));
@@ -685,7 +679,7 @@
    * @return  A human-readable message providing the reason that the
    *          authentication failed, or <CODE>null</CODE> if none is available.
    */
-  public String getAuthFailureReason()
+  public final String getAuthFailureReason()
   {
     assert debugEnter(CLASS_NAME, "getAuthFailureReason");
 
@@ -701,7 +695,7 @@
    * @return  The unique identifier for the authentication failure reason, or
    *          zero if none is available.
    */
-  public int getAuthFailureID()
+  public final int getAuthFailureID()
   {
     assert debugEnter(CLASS_NAME, "getAuthFailureID");
 
@@ -718,7 +712,7 @@
    * @param  reason  A human-readable message providing the reason that the
    *                 authentication failed.
    */
-  public void setAuthFailureReason(int id, String reason)
+  public final void setAuthFailureReason(int id, String reason)
   {
     assert debugEnter(CLASS_NAME, "setAuthFailureReason",
                       String.valueOf(id), String.valueOf(reason));
@@ -740,13 +734,13 @@
   /**
    * Retrieves the user entry DN for this bind operation.  It will only be
    * available if the bind processing has proceeded far enough to identify the
-   * user attempting to authenticate or if the user DN could not be determined.
+   * user attempting to authenticate.
    *
    * @return  The user entry DN for this bind operation, or <CODE>null</CODE> if
    *          the bind processing has not progressed far enough to identify the
    *          user or if the user DN could not be determined.
    */
-  public DN getUserEntryDN()
+  public final DN getUserEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getUserEntryDN");
 
@@ -756,11 +750,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -770,13 +763,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -786,14 +776,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -802,11 +788,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -817,16 +802,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -853,16 +832,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -927,13 +900,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -943,13 +913,10 @@
 
 
   /**
-   * Adds the provided control to the set of controls to include in the response
-   * to the client.
-   *
-   * @param  control  The control to add to the set of controls to include in
-   *                  the response to the client.
+   * {@inheritDoc}
    */
-  public void addResponseControl(Control control)
+  @Override()
+  public final void addResponseControl(Control control)
   {
     responseControls.add(control);
   }
@@ -957,13 +924,10 @@
 
 
   /**
-   * Removes the provided control from the set of controls to include in the
-   * response to the client.
-   *
-   * @param  control  The control to remove from the set of controls to include
-   *                  in the response to the client.
+   * {@inheritDoc}
    */
-  public void removeResponseControl(Control control)
+  @Override()
+  public final void removeResponseControl(Control control)
   {
     responseControls.remove(control);
   }
@@ -971,12 +935,10 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -2290,16 +2252,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.  Note
-   * that a bind operation may not be canceled, so this should never do
-   * anything.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -2310,14 +2266,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.  Note that a bind operation may not be canceled, so this will
-   * always return <CODE>null</CODE>.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -2327,12 +2279,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CancelRequest.java b/opendj-sdk/opends/src/server/org/opends/server/core/CancelRequest.java
deleted file mode 100644
index 3fd1b77..0000000
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CancelRequest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying * information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Portions Copyright 2006 Sun Microsystems, Inc.
- */
-package org.opends.server.core;
-
-
-
-import static org.opends.server.loggers.Debug.*;
-
-
-
-/**
- * This class defines a data structure that can be used to hold information
- * about a request to cancel or abandon an operation in progress.
- */
-public class CancelRequest
-{
-  /**
-   * The fully-qualified name of this class for debugging purposes.
-   */
-  private static final String CLASS_NAME =
-       "org.opends.server.core.CancelRequest";
-
-
-
-  // Indicates whether to send a response to the original request if the
-  // operation is canceled.
-  private boolean notifyOriginalRequestor;
-
-  // A message that explains the purpose for this cancellation (may be included
-  // in the response to the original requestor).
-  private String cancelReason;
-
-  // A buffer to hold a human-readable response that the server provided for the
-  // result of the cancellation.
-  private StringBuilder responseMessage;
-
-
-
-  /**
-   * Creates a new cancel request with the provided information.
-   *
-   * @param  notifyOriginalRequestor  Indicates whether the original requestor
-   *                                  should receive a response if the operation
-   *                                  is canceled.
-   * @param  cancelReason             A message that explains the purpose for
-   *                                  this cancellation.
-   */
-  public CancelRequest(boolean notifyOriginalRequestor, String cancelReason)
-  {
-    assert debugConstructor(CLASS_NAME, String.valueOf(notifyOriginalRequestor),
-                            String.valueOf(cancelReason));
-
-    this.notifyOriginalRequestor = notifyOriginalRequestor;
-    this.cancelReason            = cancelReason;
-    this.responseMessage         = new StringBuilder();
-  }
-
-
-
-  /**
-   * Creates a new cancel request with the provided information.
-   *
-   * @param  notifyOriginalRequestor  Indicates whether the original requestor
-   *                                  should receive a response if the operation
-   *                                  is canceled.
-   * @param  cancelReason             A message that explains the purpose for
-   *                                  this cancellation.
-   * @param  responseMessage          A buffer to hold a human-readable response
-   *                                  that the server provided for the result of
-   *                                  the cancellation.
-   */
-  public CancelRequest(boolean notifyOriginalRequestor, String cancelReason,
-                       StringBuilder responseMessage)
-  {
-    assert debugConstructor(CLASS_NAME, String.valueOf(notifyOriginalRequestor),
-                            String.valueOf(cancelReason),
-                            "java.lang.StringBuilder");
-
-    this.notifyOriginalRequestor = notifyOriginalRequestor;
-    this.cancelReason            = cancelReason;
-    this.responseMessage         = responseMessage;
-  }
-
-
-
-  /**
-   * Indicates whether the original requestor should receive a response to the
-   * request if the operation is canceled.
-   *
-   * @return  <CODE>true</CODE> if the original requestor should receive a
-   *          response if the operation is canceled, or <CODE>false</CODE> if
-   *          not.
-   */
-  public boolean notifyOriginalRequestor()
-  {
-    assert debugEnter(CLASS_NAME, "notifyOriginalRequestor");
-
-    return notifyOriginalRequestor;
-  }
-
-
-
-  /**
-   * Specifies whether the original requestor should receive a response to the
-   * request if the operation is canceled.
-   *
-   * @param  notifyOriginalRequestor  Specifies whether the original requestor
-   *                                  should receive a response to the request
-   *                                  if the operation is canceled.
-   */
-  public void setNotifyOriginalRequestor(boolean notifyOriginalRequestor)
-  {
-    assert debugEnter(CLASS_NAME, "notifyOriginalRequestor");
-
-    this.notifyOriginalRequestor = notifyOriginalRequestor;
-  }
-
-
-
-  /**
-   * Retrieves a message that explains the purpose for this cancellation.
-   *
-   * @return  A message that explains the purpose for this cancellation.
-   */
-  public String getCancelReason()
-  {
-    assert debugEnter(CLASS_NAME, "getCancelReason");
-
-    return cancelReason;
-  }
-
-
-
-  /**
-   * Specifies a message that explains the purpose for this cancellation.
-   *
-   * @param  cancelReason  A message that explains the purpose for this
-   *                       cancellation.
-   */
-  public void setCancelReason(String cancelReason)
-  {
-    assert debugEnter(CLASS_NAME, "setCancelReason",
-                      String.valueOf(cancelReason));
-
-    this.cancelReason = cancelReason;
-  }
-
-
-
-  /**
-   * Retrieves the buffer that is used to hold a human-readable response that
-   * the server provided for the result of the cancellation.  The caller may
-   * alter the contents of this buffer.
-   *
-   * @return  The buffer that is used to hold a human-readable response that
-   *          the server provided for the result of this cancellation.
-   */
-  public StringBuilder getResponseMessage()
-  {
-    assert debugEnter(CLASS_NAME, "getResponseMessage");
-
-    return responseMessage;
-  }
-
-
-
-  /**
-   * Appends the provided message to the buffer used to hold information about
-   * the result of the cancellation.
-   *
-   * @param  message  The message to append to the response message buffer.
-   */
-  public void addResponseMessage(String message)
-  {
-    assert debugEnter(CLASS_NAME, "addResponseMessage",
-                      String.valueOf(message));
-
-    responseMessage.append(message);
-  }
-}
-
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CertificateMapperConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/CertificateMapperConfigManager.java
index f00c93d..1ffe6f6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CertificateMapperConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/CertificateMapperConfigManager.java
@@ -39,9 +39,11 @@
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.extensions.SubjectEqualsDNCertificateMapper;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CompareOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/CompareOperation.java
index df6a53d..a7827ed 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CompareOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/CompareOperation.java
@@ -48,11 +48,20 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.LockManager;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
+import org.opends.server.types.operation.PostOperationCompareOperation;
+import org.opends.server.types.operation.PostResponseCompareOperation;
+import org.opends.server.types.operation.PreOperationCompareOperation;
+import org.opends.server.types.operation.PreParseCompareOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Access.*;
@@ -71,6 +80,8 @@
  */
 public class CompareOperation
        extends Operation
+       implements PreParseCompareOperation, PreOperationCompareOperation,
+                  PostOperationCompareOperation, PostResponseCompareOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -211,7 +222,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public ByteString getRawEntryDN()
+  public final ByteString getRawEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getRawEntryDN");
 
@@ -222,13 +233,12 @@
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
-   * This should only be called by pre-parse plugins.  All other code that needs
-   * to set the entry DN should use the <CODE>setEntryDN</CODE> method.
+   * This should only be called by pre-parse plugins.
    *
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public void setRawEntryDN(ByteString rawEntryDN)
+  public final void setRawEntryDN(ByteString rawEntryDN)
   {
     assert debugEnter(CLASS_NAME, "setRawEntryDN");
 
@@ -247,7 +257,7 @@
    * @return  The DN of the entry to compare, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public DN getEntryDN()
+  public final DN getEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getEntryDN");
 
@@ -257,27 +267,11 @@
 
 
   /**
-   * Specifies the DN of the entry to compare.  This should not be called by
-   * pre-parse plugins, since they should use <CODE>setRawEntryDN</CODE>
-   * instead.
-   *
-   * @param  entryDN  The DN of the entry to compare.
-   */
-  public void setEntryDN(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "setEntryDN", String.valueOf(entryDN));
-
-    this.entryDN = entryDN;
-  }
-
-
-
-  /**
    * Retrieves the raw attribute type for this compare operation.
    *
    * @return  The raw attribute type for this compare operation.
    */
-  public String getRawAttributeType()
+  public final String getRawAttributeType()
   {
     assert debugEnter(CLASS_NAME, "getRawAttributeType");
 
@@ -293,7 +287,7 @@
    * @param  rawAttributeType  The raw attribute type for this compare
    *                           operation.
    */
-  public void setRawAttributeType(String rawAttributeType)
+  public final void setRawAttributeType(String rawAttributeType)
   {
     assert debugEnter(CLASS_NAME, "setRawAttributeType",
                       String.valueOf(rawAttributeType));
@@ -306,11 +300,13 @@
 
 
   /**
-   * Retrieves the attribute type for this compare operation.
+   * Retrieves the attribute type for this compare operation.  This should not
+   * be called by pre-parse plugins because the processed attribute type will
+   * not be available yet.
    *
    * @return  The attribute type for this compare operation.
    */
-  public AttributeType getAttributeType()
+  public final AttributeType getAttributeType()
   {
     assert debugEnter(CLASS_NAME, "getAttributeType");
 
@@ -324,7 +320,7 @@
    *
    * @return  The assertion value for this compare operation.
    */
-  public ByteString getAssertionValue()
+  public final ByteString getAssertionValue()
   {
     assert debugEnter(CLASS_NAME, "getAssertionValue");
 
@@ -334,11 +330,12 @@
 
 
   /**
-   * Specifies the assertion value for this compare operation.
+   * Specifies the assertion value for this compare operation.  This should only
+   * be called by pre-parse and pre-operation plugins.
    *
    * @param  assertionValue  The assertion value for this compare operation.
    */
-  public void setAssertionValue(ByteString assertionValue)
+  public final void setAssertionValue(ByteString assertionValue)
   {
     assert debugEnter(CLASS_NAME, "setAssertionValue",
                       String.valueOf(assertionValue));
@@ -349,13 +346,13 @@
 
 
   /**
-   * Retrieves the entry to target with the compare operation.  It will not be
-   * available to pre-parse plugins.
+   * Retrieves the entry to target with the compare operation.  This should not
+   * be called by pre-parse plugins.
    *
    * @return  The entry to target with the compare operation, or
    *          <CODE>null</CODE> if the entry is not yet available.
    */
-  public Entry getEntryToCompare()
+  public final Entry getEntryToCompare()
   {
     assert debugEnter(CLASS_NAME, "getEntryToCompare");
 
@@ -365,11 +362,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -379,13 +375,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -395,14 +388,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -412,11 +401,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -427,16 +415,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -451,16 +433,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -526,13 +502,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -542,12 +515,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -1083,14 +1076,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -1128,13 +1117,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -1144,12 +1130,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
index e51f2a7..65ecb12 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
@@ -46,6 +46,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CoreConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/CoreConfigManager.java
index a19ffef..7d8765b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CoreConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/CoreConfigManager.java
@@ -49,6 +49,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.WritabilityMode;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/DefaultAccessControlProvider.java b/opendj-sdk/opends/src/server/org/opends/server/core/DefaultAccessControlProvider.java
index d0c6f64..8d73c6a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/DefaultAccessControlProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/DefaultAccessControlProvider.java
@@ -33,6 +33,7 @@
 import org.opends.server.api.AccessControlProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchResultReference;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/DeleteOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/DeleteOperation.java
index 9ee9afc..22147df 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/DeleteOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/DeleteOperation.java
@@ -49,15 +49,25 @@
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.LockManager;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SynchronizationProviderResult;
+import org.opends.server.types.operation.PostOperationDeleteOperation;
+import org.opends.server.types.operation.PostResponseDeleteOperation;
+import org.opends.server.types.operation.PreOperationDeleteOperation;
+import org.opends.server.types.operation.PreParseDeleteOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Access.*;
@@ -76,6 +86,8 @@
  */
 public class DeleteOperation
        extends Operation
+       implements PreParseDeleteOperation, PreOperationDeleteOperation,
+                  PostOperationDeleteOperation, PostResponseDeleteOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -187,7 +199,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public ByteString getRawEntryDN()
+  public final ByteString getRawEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getRawEntryDN");
 
@@ -204,7 +216,7 @@
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public void setRawEntryDN(ByteString rawEntryDN)
+  public final void setRawEntryDN(ByteString rawEntryDN)
   {
     assert debugEnter(CLASS_NAME, "setRawEntryDN");
 
@@ -223,7 +235,7 @@
    * @return  The DN of the entry to delete, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public DN getEntryDN()
+  public final DN getEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getEntryDN");
 
@@ -233,29 +245,13 @@
 
 
   /**
-   * Specifies the DN of the entry to delete.  This should not be called by
-   * pre-parse plugins, since they should use <CODE>setRawEntryDN</CODE>
-   * instead.
-   *
-   * @param  entryDN  The DN of the entry to delete.
-   */
-  public void setEntryDN(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "setEntryDN", String.valueOf(entryDN));
-
-    this.entryDN = entryDN;
-  }
-
-
-
-  /**
    * Retrieves the entry to be deleted.  This will not be available to pre-parse
    * plugins.
    *
    * @return  The entry to be deleted, or <CODE>null</CODE> if the entry is not
    *          yet available.
    */
-  public Entry getEntryToDelete()
+  public final Entry getEntryToDelete()
   {
     assert debugEnter(CLASS_NAME, "getEntryToDelete");
 
@@ -265,11 +261,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -279,13 +274,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -295,14 +287,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -318,7 +306,7 @@
    *          if none has been assigned yet or if there is no applicable
    *          synchronization mechanism in place that uses change numbers.
    */
-  public long getChangeNumber()
+  public final long getChangeNumber()
   {
     assert debugEnter(CLASS_NAME, "getChangeNumber");
 
@@ -334,7 +322,7 @@
    * @param  changeNumber  The change number that has been assigned to this
    *                       operation by the synchronization mechanism.
    */
-  public void setChangeNumber(long changeNumber)
+  public final void setChangeNumber(long changeNumber)
   {
     assert debugEnter(CLASS_NAME, "setChangeNumber",
                       String.valueOf(changeNumber));
@@ -345,11 +333,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -360,16 +347,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -383,16 +364,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -458,13 +433,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -474,12 +446,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -1249,14 +1241,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -1294,13 +1282,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -1310,12 +1295,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryServer.java b/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryServer.java
index de68210..1472dc5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -123,19 +123,24 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeUsage;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.CryptoManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DITContentRule;
 import org.opends.server.types.DITStructureRule;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.MatchingRuleUse;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ObjectClassType;
 import org.opends.server.types.OperatingSystem;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 import org.opends.server.types.WritabilityMode;
 import org.opends.server.util.TimeThread;
 import org.opends.server.util.args.ArgumentException;
@@ -996,6 +1001,10 @@
       synchronizationProviderConfigManager.initializeSynchronizationProviders();
 
 
+      // Create and initialize the work queue.
+      initializeWorkQueue();
+
+
       StartupPluginResult startupPluginResult =
            pluginConfigManager.invokeStartupPlugins();
       if (! startupPluginResult.continueStartup())
@@ -1008,10 +1017,6 @@
       }
 
 
-      // Create and initialize the work queue.
-      initializeWorkQueue();
-
-
       // At this point, we should be ready to go.  Start all the connection
       // handlers.
       for (ConnectionHandler c : connectionHandlers)
@@ -6683,6 +6688,17 @@
     }
     directoryServer.connectionHandlers.clear();
 
+
+
+    // Call the shutdown plugins, and then finalize all the plugins defined in
+    // the server.
+    if (directoryServer.pluginConfigManager != null)
+    {
+      directoryServer.pluginConfigManager.invokeShutdownPlugins();
+      directoryServer.pluginConfigManager.finalizePlugins();
+    }
+
+
     // shutdown the Synchronization Providers
     for (SynchronizationProvider provider :
          directoryServer.synchronizationProviders)
@@ -6720,16 +6736,6 @@
     }
 
 
-
-    // Call the shutdown plugins, and then finalize all the plugins defined in
-    // the server.
-    if (directoryServer.pluginConfigManager != null)
-    {
-      directoryServer.pluginConfigManager.invokeShutdownPlugins();
-      directoryServer.pluginConfigManager.finalizePlugins();
-    }
-
-
     // Shut down all of the alert handlers.
     for (AlertHandler alertHandler : directoryServer.alertHandlers)
     {
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/EntryCacheConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/EntryCacheConfigManager.java
index 4422f1a..fb85891 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/EntryCacheConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/EntryCacheConfigManager.java
@@ -42,6 +42,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperation.java
index 9084c17..b641e8e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperation.java
@@ -38,9 +38,16 @@
 import org.opends.server.api.plugin.PreOperationPluginResult;
 import org.opends.server.api.plugin.PreParsePluginResult;
 import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.PostOperationExtendedOperation;
+import org.opends.server.types.operation.PostResponseExtendedOperation;
+import org.opends.server.types.operation.PreOperationExtendedOperation;
+import org.opends.server.types.operation.PreParseExtendedOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Access.*;
@@ -57,6 +64,8 @@
  */
 public class ExtendedOperation
        extends Operation
+       implements PreParseExtendedOperation, PreOperationExtendedOperation,
+                  PostOperationExtendedOperation, PostResponseExtendedOperation
 {
   /*** The fully-qualified name of this class for debugging purposes.
    */
@@ -142,7 +151,7 @@
    *
    * @return  The OID for the request associated with this extended operation.
    */
-  public String getRequestOID()
+  public final String getRequestOID()
   {
     assert debugEnter(CLASS_NAME, "getRequestOID");
 
@@ -153,11 +162,12 @@
 
   /**
    * Specifies the OID for the request associated with this extended operation.
+   * This should only be called by pre-parse plugins.
    *
    * @param  requestOID  The OID for the request associated with this extended
    *                     operation.
    */
-  public void setRequestOID(String requestOID)
+  public final void setRequestOID(String requestOID)
   {
     assert debugEnter(CLASS_NAME, "setRequestOID", String.valueOf(requestOID));
 
@@ -172,7 +182,7 @@
    *
    * @return  The value for the request associated with this extended operation.
    */
-  public ASN1OctetString getRequestValue()
+  public final ASN1OctetString getRequestValue()
   {
     assert debugEnter(CLASS_NAME, "getRequestValue");
 
@@ -183,12 +193,12 @@
 
   /**
    * Specifies the value for the request associated with this extended
-   * operation.
+   * operation.  This should only be called by pre-parse plugins.
    *
    * @param  requestValue  The value for the request associated with this
    *                       extended operation.
    */
-  public void setRequestValue(ASN1OctetString requestValue)
+  public final void setRequestValue(ASN1OctetString requestValue)
   {
     assert debugEnter(CLASS_NAME, "setRequestValue",
                       String.valueOf(requestValue));
@@ -199,11 +209,12 @@
 
 
   /**
-   * Retrieves the OID to include in the response to the client.
+   * Retrieves the OID to include in the response to the client.  This should
+   * not be called by pre-parse or pre-operation plugins.
    *
    * @return  The OID to include in the response to the client.
    */
-  public String getResponseOID()
+  public final String getResponseOID()
   {
     assert debugEnter(CLASS_NAME, "getResponseOID");
 
@@ -213,11 +224,12 @@
 
 
   /**
-   * Specifies the OID to include in the response to the client.
+   * Specifies the OID to include in the response to the client.  This should
+   * not be called by post-response plugins.
    *
    * @param  responseOID  The OID to include in the response to the client.
    */
-  public void setResponseOID(String responseOID)
+  public final void setResponseOID(String responseOID)
   {
     assert debugEnter(CLASS_NAME, "setResponseOID",
                       String.valueOf(responseOID));
@@ -228,11 +240,12 @@
 
 
   /**
-   * Retrieves the value to include in the response to the client.
+   * Retrieves the value to include in the response to the client.  This should
+   * not be called by pre-parse or pre-operation plugins.
    *
    * @return  The value to include in the response to the client.
    */
-  public ASN1OctetString getResponseValue()
+  public final ASN1OctetString getResponseValue()
   {
     assert debugEnter(CLASS_NAME, "getResponseValue");
 
@@ -242,11 +255,12 @@
 
 
   /**
-   * Specifies the value to include in the response to the client.
+   * Specifies the value to include in the response to the client.  This should
+   * not be called by post-response plugins.
    *
    * @param  responseValue  The value to include in the response to the client.
    */
-  public void setResponseValue(ASN1OctetString responseValue)
+  public final void setResponseValue(ASN1OctetString responseValue)
   {
     assert debugEnter(CLASS_NAME, "setResponseValue",
                       String.valueOf(responseValue));
@@ -257,11 +271,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -271,13 +284,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -287,14 +297,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -304,11 +310,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -319,16 +324,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -342,16 +341,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -418,13 +411,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -434,12 +424,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -654,7 +664,7 @@
    * operation in which the response must be sent in the clear before actually
    * enabling TLS protection).
    */
-  public void sendExtendedResponse()
+  public final void sendExtendedResponse()
   {
     assert debugEnter(CLASS_NAME, "sendExtendedResponse");
 
@@ -668,13 +678,12 @@
 
 
   /**
-   * Indicates whether the response for this extended operation has been sent
-   * from somewhere outside of this class.  This should only be used by the
-   * StartTLS extended operation for the case in which it needs to send a
-   * response in the clear after TLS negotiation has already started on the
-   * connection.
+   * Indicates that the response for this extended operation has been sent from
+   * somewhere outside of this class.  This should only be used by the StartTLS
+   * extended operation for the case in which it needs to send a response in the
+   * clear after TLS negotiation has already started on the connection.
    */
-  public void setResponseSent()
+  public final void setResponseSent()
   {
     assert debugEnter(CLASS_NAME, "setResponseSent",
                       String.valueOf(responseSent));
@@ -685,14 +694,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -730,13 +735,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -746,12 +748,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperationConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
index 568e683..acfb58f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/IdentityMapperConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/IdentityMapperConfigManager.java
index 433f56b..23f548b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/IdentityMapperConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/IdentityMapperConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
index 4b48666..f36c5ce 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
@@ -39,9 +39,11 @@
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.extensions.NullKeyManagerProvider;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/LockManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/LockManager.java
deleted file mode 100644
index 422786b..0000000
--- a/opendj-sdk/opends/src/server/org/opends/server/core/LockManager.java
+++ /dev/null
@@ -1,783 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying * information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Portions Copyright 2006 Sun Microsystems, Inc.
- */
-package org.opends.server.core;
-
-
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.opends.server.types.DebugLogCategory;
-import org.opends.server.types.DebugLogSeverity;
-import org.opends.server.types.DN;
-
-import static org.opends.server.loggers.Debug.*;
-import static org.opends.server.util.StaticUtils.*;
-
-
-
-/**
- * This class defines a Directory Server component that can keep track of all
- * locks needed throughout the Directory Server.  It is intended primarily for
- * entry locking but support for other types of objects might be added in the
- * future.
- */
-public class LockManager
-{
-  /**
-   * The fully-qualified name of this class for debugging purposes.
-   */
-  private static final String CLASS_NAME =
-       "org.opends.server.core.LockManager";
-
-
-
-  /**
-   * The number of buckets into which the set of global DN locks will be
-   * broken.
-   */
-  public static final int NUM_GLOBAL_DN_LOCKS =
-       (10 * Runtime.getRuntime().availableProcessors());
-
-
-
-  /**
-   * The initial capacity to use for the DN lock hashtable.
-   */
-  public static final int DN_TABLE_INITIAL_SIZE = 50;
-
-
-
-  /**
-   * The load factor to use for the DN lock hashtable.
-   */
-  public static final float DN_TABLE_LOAD_FACTOR = 0.75F;
-
-
-
-  /**
-   * The default length of time in milliseconds to wait while attempting to
-   * acquire a read or write lock.
-   */
-  public static final long DEFAULT_TIMEOUT = 3000;
-
-
-
-  // The set of global DN locks that we need to ensure thread safety for all of
-  // the other operations.
-  private static ReentrantLock[] globalDNLocks;
-
-  // The set of entry locks that the server knows about.
-  private static ConcurrentHashMap<DN,ReentrantReadWriteLock> entryLocks;
-
-
-
-  // Initialize all of the lock variables.
-  static
-  {
-    // Create the set of global DN locks.
-    globalDNLocks = new ReentrantLock[NUM_GLOBAL_DN_LOCKS];
-    for (int i=0; i < NUM_GLOBAL_DN_LOCKS; i++)
-    {
-      globalDNLocks[i] = new ReentrantLock();
-    }
-
-
-    // Create an empty table for holding the entry locks.
-    entryLocks = new ConcurrentHashMap<DN,ReentrantReadWriteLock>(
-         DN_TABLE_INITIAL_SIZE, DN_TABLE_LOAD_FACTOR, NUM_GLOBAL_DN_LOCKS);
-  }
-
-
-
-  /**
-   * Attempts to acquire a read lock on the specified entry.  It will succeed
-   * only if the lock is not already held.  If any blocking is required, then
-   * this call will fail rather than block.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the read lock.
-   *
-   * @return  The read lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a read lock for some reason.
-   */
-  public static Lock tryLockRead(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "tryLockRead", String.valueOf(entryDN));
-
-
-    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
-
-
-    // Get the hash code for the provided entry DN and determine which global
-    // lock to acquire.  This will ensure that no two threads will be allowed to
-    // lock or unlock the same entry at any given time, but should allow other
-    // entries with different hash codes to be processed.
-    ReentrantLock globalLock;
-    try
-    {
-      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
-      if (! globalLock.tryLock())
-      {
-        return null;
-      }
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockRead", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                          "Unexpected exception while trying to obtain the " +
-                          "global lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-
-
-
-    // At this point we have the global lock for this bucket.  We must use a
-    // try/catch/finally block to ensure that the global lock is always released
-    // no matter what.
-    try
-    {
-      // Now check to see if the entry is already in the lock table.
-      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
-      if (entryLock == null)
-      {
-        // No lock exists for the entry.  Create one and put it in the table.
-        entryLock = new ReentrantReadWriteLock();
-        if (entryLock.readLock().tryLock())
-        {
-          entryLocks.put(entryDN, entryLock);
-          return entryLock.readLock();
-        }
-        else
-        {
-          // This should never happen since we just created the lock.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                              "Unable to acquire read lock on newly-created " +
-                              "lock for entry " + entryDN.toString());
-          return null;
-        }
-      }
-      else
-      {
-        // There is already a lock for the entry.  Try to get its read lock.
-        if (entryLock.readLock().tryLock())
-        {
-          // We got the read lock.  We don't need to do anything else.
-          return entryLock.readLock();
-        }
-        else
-        {
-          // We couldn't get the read lock.  Write a debug message.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.WARNING, CLASS_NAME, "lockRead",
-                              "Unable to acquire a read lock for entry " +
-                              entryDN.toString() + " that was already " +
-                              "present in the lock table.");
-          return null;
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockRead", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                          "Unexpected exception while trying to obtain a " +
-                          "read lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-    finally
-    {
-      // This will always be called even after a return.
-      globalLock.unlock();
-    }
-  }
-
-
-
-  /**
-   * Attempts to acquire a read lock for the specified entry.  Multiple threads
-   * can hold the read lock concurrently for an entry as long as the write lock
-   * is held.  If the write lock is held, then no other read or write locks will
-   * be allowed for that entry until the write lock is released.  A default
-   * timeout will be used for the lock.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the read lock.
-   *
-   * @return  The read lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a read lock for some reason.
-   */
-  public static Lock lockRead(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "lockRead", String.valueOf(entryDN));
-
-    return lockRead(entryDN, DEFAULT_TIMEOUT);
-  }
-
-
-
-  /**
-   * Attempts to acquire a read lock for the specified entry.  Multiple threads
-   * can hold the read lock concurrently for an entry as long as the write lock
-   * is held.  If the write lock is held, then no other read or write locks will
-   * be allowed for that entry until the write lock is released.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the read lock.
-   * @param  timeout  The maximum length of time in milliseconds to wait for the
-   *                  lock before timing out.
-   *
-   * @return  The read lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a read lock for some reason.
-   */
-  public static Lock lockRead(DN entryDN, long timeout)
-  {
-    assert debugEnter(CLASS_NAME, "lockRead", String.valueOf(entryDN),
-                      String.valueOf(timeout));
-
-
-    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
-
-
-    // Get the hash code for the provided entry DN and determine which global
-    // lock to acquire.  This will ensure that no two threads will be allowed to
-    // lock or unlock the same entry at any given time, but should allow other
-    // entries with different hash codes to be processed.
-    ReentrantLock globalLock;
-    try
-    {
-      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
-      if (! globalLock.tryLock(timeout, TimeUnit.MILLISECONDS))
-      {
-        return null;
-      }
-    }
-    catch (InterruptedException ie)
-    {
-      assert debugException(CLASS_NAME, "lockRead", ie);
-
-      // This is fine.  The thread trying to acquire the lock was interrupted.
-      return null;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockRead", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                          "Unexpected exception while trying to obtain the " +
-                          "global lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-
-
-
-    // At this point we have the global lock for this bucket.  We must use a
-    // try/catch/finally block to ensure that the global lock is always released
-    // no matter what.
-    try
-    {
-      // Now check to see if the entry is already in the lock table.
-      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
-      if (entryLock == null)
-      {
-        // No lock exists for the entry.  Create one and put it in the table.
-        entryLock = new ReentrantReadWriteLock();
-        if (entryLock.readLock().tryLock(timeout, TimeUnit.MILLISECONDS))
-        {
-          entryLocks.put(entryDN, entryLock);
-          return entryLock.readLock();
-        }
-        else
-        {
-          // This should never happen since we just created the lock.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                              "Unable to acquire read lock on newly-created " +
-                              "lock for entry " + entryDN.toString());
-          return null;
-        }
-      }
-      else
-      {
-        // There is already a lock for the entry.  Try to get its read lock.
-        if (entryLock.readLock().tryLock(timeout, TimeUnit.MILLISECONDS))
-        {
-          // We got the read lock.  We don't need to do anything else.
-          return entryLock.readLock();
-        }
-        else
-        {
-          // We couldn't get the read lock.  Write a debug message.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.WARNING, CLASS_NAME, "lockRead",
-                              "Unable to acquire a read lock for entry " +
-                              entryDN.toString() + " that was already " +
-                              "present in the lock table.");
-          return null;
-        }
-      }
-    }
-    catch (InterruptedException ie)
-    {
-      assert debugException(CLASS_NAME, "lockRead", ie);
-
-      // This is fine.  The thread trying to acquire the lock was interrupted.
-      return null;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockRead", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
-                          "Unexpected exception while trying to obtain a " +
-                          "read lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-    finally
-    {
-      // This will always be called even after a return.
-      globalLock.unlock();
-    }
-  }
-
-
-
-  /**
-   * Attempts to acquire a write lock on the specified entry.  It will succeed
-   * only if the lock is not already held.  If any blocking is required, then
-   * this call will fail rather than block.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the write lock.
-   *
-   * @return  The write lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a write lock for some reason.
-   */
-  public static Lock tryLockWrite(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "lockWrite", String.valueOf(entryDN));
-
-
-    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
-
-
-    // Get the hash code for the provided entry DN and determine which global
-    // lock to acquire.  This will ensure that no two threads will be allowed to
-    // lock or unlock the same entry at any given time, but should allow other
-    // entries with different hash codes to be processed.
-    ReentrantLock globalLock;
-    try
-    {
-      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
-      if (! globalLock.tryLock())
-      {
-        return null;
-      }
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                          "Unexpected exception while trying to obtain the " +
-                          "global lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-
-
-
-    // At this point we have the global lock for this bucket.  We must use a
-    // try/catch/finally block to ensure that the global lock is always released
-    // no matter what.
-    try
-    {
-      // Now check to see if the entry is already in the lock table.
-      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
-      if (entryLock == null)
-      {
-        // No lock exists for the entry.  Create one and put it in the table.
-        entryLock = new ReentrantReadWriteLock();
-        if (entryLock.writeLock().tryLock())
-        {
-          entryLocks.put(entryDN, entryLock);
-          return entryLock.writeLock();
-        }
-        else
-        {
-          // This should never happen since we just created the lock.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                              "Unable to acquire write lock on newly-created " +
-                              "lock for entry " + entryDN.toString());
-          return null;
-        }
-      }
-      else
-      {
-        // There is already a lock for the entry.  Try to get its write lock.
-        if (entryLock.writeLock().tryLock())
-        {
-          // We got the write lock.  We don't need to do anything else.
-          return entryLock.writeLock();
-        }
-        else
-        {
-          // We couldn't get the write lock.  Write a debug message.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.WARNING, CLASS_NAME, "lockWrite",
-                              "Unable to acquire the write lock for entry " +
-                              entryDN.toString() + " that was already " +
-                              "present in the lock table.");
-          return null;
-        }
-      }
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                          "Unexpected exception while trying to obtain the " +
-                          "write lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-    finally
-    {
-      // This will always be called even after a return.
-      globalLock.unlock();
-    }
-  }
-
-
-
-  /**
-   * Attempts to acquire the write lock for the specified entry.  Only a single
-   * thread may hold the write lock for an entry at any given time, and during
-   * that time no read locks may be held for it.  A default timeout will be used
-   * for the lock.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the write lock.
-   *
-   * @return  The write lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a read lock for some reason.
-   */
-  public static Lock lockWrite(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "lockRead", String.valueOf(entryDN));
-
-    return lockWrite(entryDN, DEFAULT_TIMEOUT);
-  }
-
-
-
-  /**
-   * Attempts to acquire the write lock for the specified entry.  Only a single
-   * thread may hold the write lock for an entry at any given time, and during
-   * that time no read locks may be held for it.
-   *
-   * @param  entryDN  The DN of the entry for which to obtain the write lock.
-   * @param  timeout  The maximum length of time in milliseconds to wait for the
-   *                  lock before timing out.
-   *
-   * @return  The write lock that was acquired, or <CODE>null</CODE> if it was
-   *          not possible to obtain a read lock for some reason.
-   */
-  public static Lock lockWrite(DN entryDN, long timeout)
-  {
-    assert debugEnter(CLASS_NAME, "lockWrite", String.valueOf(entryDN),
-                      String.valueOf(timeout));
-
-
-    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
-
-
-    // Get the hash code for the provided entry DN and determine which global
-    // lock to acquire.  This will ensure that no two threads will be allowed to
-    // lock or unlock the same entry at any given time, but should allow other
-    // entries with different hash codes to be processed.
-    ReentrantLock globalLock;
-    try
-    {
-      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
-      if (! globalLock.tryLock(timeout, TimeUnit.MILLISECONDS))
-      {
-        return null;
-      }
-    }
-    catch (InterruptedException ie)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", ie);
-
-      // This is fine.  The thread trying to acquire the lock was interrupted.
-      return null;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                          "Unexpected exception while trying to obtain the " +
-                          "global lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-
-
-
-    // At this point we have the global lock for this bucket.  We must use a
-    // try/catch/finally block to ensure that the global lock is always released
-    // no matter what.
-    try
-    {
-      // Now check to see if the entry is already in the lock table.
-      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
-      if (entryLock == null)
-      {
-        // No lock exists for the entry.  Create one and put it in the table.
-        entryLock = new ReentrantReadWriteLock();
-        if (entryLock.writeLock().tryLock(timeout, TimeUnit.MILLISECONDS))
-        {
-          entryLocks.put(entryDN, entryLock);
-          return entryLock.writeLock();
-        }
-        else
-        {
-          // This should never happen since we just created the lock.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                              "Unable to acquire write lock on newly-created " +
-                              "lock for entry " + entryDN.toString());
-          return null;
-        }
-      }
-      else
-      {
-        // There is already a lock for the entry.  Try to get its write lock.
-        if (entryLock.writeLock().tryLock(timeout, TimeUnit.MILLISECONDS))
-        {
-          // We got the write lock.  We don't need to do anything else.
-          return entryLock.writeLock();
-        }
-        else
-        {
-          // We couldn't get the write lock.  Write a debug message.
-          assert debugMessage(DebugLogCategory.CORE_SERVER,
-                              DebugLogSeverity.WARNING, CLASS_NAME, "lockWrite",
-                              "Unable to acquire the write lock for entry " +
-                              entryDN.toString() + " that was already " +
-                              "present in the lock table.");
-          return null;
-        }
-      }
-    }
-    catch (InterruptedException ie)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", ie);
-
-      // This is fine.  The thread trying to acquire the lock was interrupted.
-      return null;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "lockWrite", e);
-
-      // This is not fine.  Some unexpected error occurred.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
-                          "Unexpected exception while trying to obtain the " +
-                          "write lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return null;
-    }
-    finally
-    {
-      // This will always be called even after a return.
-      globalLock.unlock();
-    }
-  }
-
-
-
-  /**
-   * Releases a read or write lock held on the specified entry.
-   *
-   * @param  entryDN  The DN of the entry for which to release the lock.
-   * @param  lock     The read or write lock held for the entry.
-   */
-  public static void unlock(DN entryDN, Lock lock)
-  {
-    assert debugEnter(CLASS_NAME, "unlock", String.valueOf(entryDN));
-
-
-    // Unlock the entry without grabbing any additional locks.
-    try
-    {
-      lock.unlock();
-    }
-    catch (Exception e)
-    {
-      // This should never happen.  However, if it does, then just capture the
-      // exception and continue because it may still be necessary to remove the
-      // lock for the entry from the table.
-      assert debugException(CLASS_NAME, "unlock", e);
-    }
-
-
-    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
-
-
-    // Now grab the global lock for the entry and check to see if we can remove
-    // it from the table.
-    ReentrantLock globalLock;
-    try
-    {
-      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
-
-      // This will block until it acquires the lock or until it is interrupted.
-      globalLock.lockInterruptibly();
-    }
-    catch (InterruptedException ie)
-    {
-      assert debugException(CLASS_NAME, "unlock", ie);
-
-      // The lock trying to acquire the lock was interrupted.  In this case,
-      // we'll just return.  The worst that could happen here is that a lock
-      // that isn't held by anything is still in the table which will just
-      // consume a little memory.
-      return;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "unlock", e);
-
-      // This is not fine.  Some unexpected error occurred.  But again, the
-      // worst that could happen is that we may not clean up an unheld lock,
-      // which isn't really that big a deal unless it happens too often.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "unlock",
-                          "Unexpected exception while trying to obtain the " +
-                          "global lock for entry " + entryDN.toString() +
-                          ":  " + stackTraceToSingleLineString(e));
-      return;
-    }
-
-
-    // At this point we have the global lock for this bucket.  We must use a
-    // try/catch/finally block to ensure that the global lock is always released
-    // no matter what.
-    try
-    {
-      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
-      if ((entryLock != null) && (entryLock.getReadLockCount() == 0) &&
-          (! entryLock.isWriteLocked()))
-      {
-        // This lock isn't held so we can remove it from the table.
-        entryLocks.remove(entryDN);
-      }
-
-      return;
-    }
-    catch (Exception e)
-    {
-      assert debugException(CLASS_NAME, "unlock", e);
-
-      // This should never happen.
-      assert debugMessage(DebugLogCategory.CORE_SERVER,
-                          DebugLogSeverity.ERROR, CLASS_NAME, "unlock",
-                          "Unexpected exception while trying to determine " +
-                          "whether the lock for entry " + entryDN.toString() +
-                          " can be removed:  " +
-                          stackTraceToSingleLineString(e));
-      return;
-    }
-    finally
-    {
-      globalLock.unlock();
-    }
-  }
-
-
-
-  /**
-   * Removes any reference to the specified entry from the lock table.  This may
-   * be helpful if there is a case where a lock has been orphaned somehow and
-   * must be removed before other threads may acquire it.
-   *
-   * @param  entryDN  The DN of the entry for which to remove the lock from the
-   *                  table.
-   *
-   * @return  The read write lock that was removed from the table, or
-   *          <CODE>null</CODE> if nothing was in the table for the specified
-   *          entry.  If a lock object is returned, it may be possible to get
-   *          information about who was holding it.
-   */
-  public static ReentrantReadWriteLock destroyLock(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "destroyLock", String.valueOf(entryDN));
-
-    return entryLocks.remove(entryDN);
-  }
-
-
-
-  /**
-   * Retrieves the number of entries currently held in the lock table.  Note
-   * that this may be an expensive operation.
-   *
-   * @return  The number of entries currently held in the lock table.
-   */
-  public static int lockTableSize()
-  {
-    assert debugEnter(CLASS_NAME, "lockTableSize");
-
-    return entryLocks.size();
-  }
-}
-
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/LoggerConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/LoggerConfigManager.java
index c01bd76..c234738 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/LoggerConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/LoggerConfigManager.java
@@ -52,6 +52,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/ModifyDNOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/ModifyDNOperation.java
index 5f1d6a5..37c105b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/ModifyDNOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/ModifyDNOperation.java
@@ -55,18 +55,28 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SynchronizationProviderResult;
+import org.opends.server.types.operation.PostOperationModifyDNOperation;
+import org.opends.server.types.operation.PostResponseModifyDNOperation;
+import org.opends.server.types.operation.PreOperationModifyDNOperation;
+import org.opends.server.types.operation.PreParseModifyDNOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Access.*;
@@ -85,6 +95,8 @@
  */
 public class ModifyDNOperation
        extends Operation
+       implements PreParseModifyDNOperation, PreOperationModifyDNOperation,
+                  PostOperationModifyDNOperation, PostResponseModifyDNOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -270,7 +282,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public ByteString getRawEntryDN()
+  public final ByteString getRawEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getRawEntryDN");
 
@@ -281,13 +293,12 @@
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
-   * This should only be called by pre-parse plugins.  All other code that needs
-   * to set the entry DN should use the <CODE>setEntryDN</CODE> method.
+   * This should only be called by pre-parse plugins.
    *
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public void setRawEntryDN(ByteString rawEntryDN)
+  public final void setRawEntryDN(ByteString rawEntryDN)
   {
     assert debugEnter(CLASS_NAME, "setRawEntryDN");
 
@@ -306,7 +317,7 @@
    * @return  The DN of the entry to rename, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public DN getEntryDN()
+  public final DN getEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getEntryDN");
 
@@ -316,22 +327,6 @@
 
 
   /**
-   * Specifies the DN of the entry to rename.  This should not be called by
-   * pre-parse plugins, since they should use <CODE>setRawEntryDN</CODE>
-   * instead.
-   *
-   * @param  entryDN  The DN of the entry to compare.
-   */
-  public void setEntryDN(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "setEntryDN", String.valueOf(entryDN));
-
-    this.entryDN = entryDN;
-  }
-
-
-
-  /**
    * Retrieves the raw, unprocessed newRDN as included in the request from the
    * client.  This may or may not contain a valid RDN, as no validation will
    * have been performed on it.
@@ -339,7 +334,7 @@
    * @return  The raw, unprocessed newRDN as included in the request from the
    *          client.
    */
-  public ByteString getRawNewRDN()
+  public final ByteString getRawNewRDN()
   {
     assert debugEnter(CLASS_NAME, "getRawNewRDN");
 
@@ -351,13 +346,12 @@
   /**
    * Specifies the raw, unprocessed newRDN as included in the request from the
    * client.  This should only be called by pre-parse plugins and should not be
-   * used in later stages of processing where the <CODE>getNewRDN</CODE> and
-   * <CODE>setNewRDN</CODE> methods should be used instead.
+   * used in later stages of processing.
    *
    * @param  rawNewRDN  The raw, unprocessed newRDN as included in the request
    *                    from the client.
    */
-  public void setRawNewRDN(ByteString rawNewRDN)
+  public final void setRawNewRDN(ByteString rawNewRDN)
   {
     assert debugEnter(CLASS_NAME, "setRawNewRDN", String.valueOf(rawNewRDN));
 
@@ -376,7 +370,7 @@
    * @return  The new RDN to use for the entry, or <CODE>null</CODE> if the raw
    *          newRDN has not yet been processed.
    */
-  public RDN getNewRDN()
+  public final RDN getNewRDN()
   {
     assert debugEnter(CLASS_NAME, "getNewRDN");
 
@@ -386,28 +380,12 @@
 
 
   /**
-   * Specifies the new RDN to use for the entry.  This should not be called by
-   * pre-parse plugins, which should use the <CODE>getRawNewRDN</CODE> and
-   * <CODE>setRawNewRDN</CODE> methods instead.
-   *
-   * @param  newRDN  The new RDN to use for the entry.
-   */
-  public void setNewRDN(RDN newRDN)
-  {
-    assert debugEnter(CLASS_NAME, "setNewRDN", String.valueOf(newRDN));
-
-    this.newRDN = newRDN;
-  }
-
-
-
-  /**
    * Indicates whether the current RDN value should be removed from the entry.
    *
    * @return  <CODE>true</CODE> if the current RDN value should be removed from
    *          the entry, or <CODE>false</CODE> if not.
    */
-  public boolean deleteOldRDN()
+  public final boolean deleteOldRDN()
   {
     assert debugEnter(CLASS_NAME, "deleteOldRDN");
 
@@ -422,7 +400,7 @@
    * @param  deleteOldRDN  Specifies whether the current RDN value should be
    *                       removed from the entry.
    */
-  public void setDeleteOldRDN(boolean deleteOldRDN)
+  public final void setDeleteOldRDN(boolean deleteOldRDN)
   {
     assert debugEnter(CLASS_NAME, "setDeleteOldRDN",
                       String.valueOf(deleteOldRDN));
@@ -440,7 +418,7 @@
    * @return  The raw, unprocessed newSuperior from the client request, or
    *          <CODE>null</CODE> if there is none.
    */
-  public ByteString getRawNewSuperior()
+  public final ByteString getRawNewSuperior()
   {
     assert debugEnter(CLASS_NAME, "getRawNewSuperior");
 
@@ -452,13 +430,12 @@
   /**
    * Specifies the raw, unprocessed newSuperior for this modify DN operation, as
    * provided in the request from the client.  This method should only be called
-   * by pre-parse plugins.  Later processing that needs to set the newSuperior
-   * should use the <CODE>setNewSuperior</CODE> method.
+   * by pre-parse plugins.
    *
    * @param  rawNewSuperior  The raw, unprocessed newSuperior as provided in the
    *                         request from the client.
    */
-  public void setRawNewSuperior(ByteString rawNewSuperior)
+  public final void setRawNewSuperior(ByteString rawNewSuperior)
   {
     assert debugEnter(CLASS_NAME, "setRawNewSuperior",
                       String.valueOf(rawNewSuperior));
@@ -480,7 +457,7 @@
    *          no newSuperior DN for this request or if the raw newSuperior has
    *          not yet been processed.
    */
-  public DN getNewSuperior()
+  public final DN getNewSuperior()
   {
     assert debugEnter(CLASS_NAME, "getNewSuperior");
 
@@ -490,23 +467,6 @@
 
 
   /**
-   * Specifies the new parent DN for the entry.  This should not be called by
-   * pre-parse plugins, which should use the <CODE>setRawNewSuperior</CODE>
-   * method instead.
-   *
-   * @param  newSuperior  The new parent DN for the entry.
-   */
-  public void setNewSuperior(DN newSuperior)
-  {
-    assert debugEnter(CLASS_NAME, "setNewSuperior",
-                      String.valueOf(newSuperior));
-
-    this.newSuperior = newSuperior;
-  }
-
-
-
-  /**
    * Retrieves the set of modifications applied to attributes of the target
    * entry in the course of processing this modify DN operation.  This will
    * include attribute-level changes from the modify DN itself (e.g., removing
@@ -523,7 +483,7 @@
    *          of the modify DN processing, or <CODE>null</CODE> if that
    *          information is not yet available (e.g., during pre-parse plugins).
    */
-  public List<Modification> getModifications()
+  public final List<Modification> getModifications()
   {
     assert debugEnter(CLASS_NAME, "getModifications");
 
@@ -533,6 +493,24 @@
 
 
   /**
+   * Adds the provided modification to the set of modifications to be applied
+   * as part of the update.  This should only be called by pre-operation
+   * plugins.
+   *
+   * @param  modification  The modification to add to the set of modifications
+   *                       to apply to the entry.
+   */
+  public final void addModification(Modification modification)
+  {
+    assert debugEnter(CLASS_NAME, "addModification",
+                      String.valueOf(modification));
+
+    modifications.add(modification);
+  }
+
+
+
+  /**
    * Retrieves the current entry, before it is renamed.  This will not be
    * available to pre-parse plugins or during the conflict resolution portion of
    * the synchronization processing.
@@ -540,7 +518,7 @@
    * @return  The current entry, or <CODE>null</CODE> if it is not yet
    *           available.
    */
-  public Entry getOriginalEntry()
+  public final Entry getOriginalEntry()
   {
     assert debugEnter(CLASS_NAME, "getOriginalEntry");
 
@@ -557,7 +535,7 @@
    * @return  The updated entry, or <CODE>null</CODE> if it is not yet
    *           available.
    */
-  public Entry getUpdatedEntry()
+  public final Entry getUpdatedEntry()
   {
     assert debugEnter(CLASS_NAME, "getUpdatedEntry");
 
@@ -567,11 +545,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -581,13 +558,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -597,14 +571,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -620,7 +590,7 @@
    *          if none has been assigned yet or if there is no applicable
    *          synchronization mechanism in place that uses change numbers.
    */
-  public long getChangeNumber()
+  public final long getChangeNumber()
   {
     assert debugEnter(CLASS_NAME, "getChangeNumber");
 
@@ -636,7 +606,7 @@
    * @param  changeNumber  The change number that has been assigned to this
    *                       operation by the synchronization mechanism.
    */
-  public void setChangeNumber(long changeNumber)
+  public final void setChangeNumber(long changeNumber)
   {
     assert debugEnter(CLASS_NAME, "setChangeNumber",
                       String.valueOf(changeNumber));
@@ -647,11 +617,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -662,16 +631,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -698,16 +661,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -773,13 +730,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -789,12 +743,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -2065,14 +2039,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -2110,13 +2080,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -2126,12 +2093,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/ModifyOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/ModifyOperation.java
index e2ff8a8..79f8743 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/ModifyOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/ModifyOperation.java
@@ -65,18 +65,28 @@
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SynchronizationProviderResult;
+import org.opends.server.types.operation.PreParseModifyOperation;
+import org.opends.server.types.operation.PreOperationModifyOperation;
+import org.opends.server.types.operation.PostOperationModifyOperation;
+import org.opends.server.types.operation.PostResponseModifyOperation;
 
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.core.CoreConstants.*;
@@ -96,6 +106,8 @@
  */
 public class ModifyOperation
        extends Operation
+       implements PreParseModifyOperation, PreOperationModifyOperation,
+                  PostOperationModifyOperation, PostResponseModifyOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -258,7 +270,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public ByteString getRawEntryDN()
+  public final ByteString getRawEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getRawEntryDN");
 
@@ -269,13 +281,12 @@
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
-   * This should only be called by pre-parse plugins.  All other code that needs
-   * to set the entry DN should use the <CODE>setEntryDN</CODE> method.
+   * This should only be called by pre-parse plugins.
    *
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public void setRawEntryDN(ByteString rawEntryDN)
+  public final void setRawEntryDN(ByteString rawEntryDN)
   {
     assert debugEnter(CLASS_NAME, "setRawEntryDN");
 
@@ -294,7 +305,7 @@
    * @return  The DN of the entry to modify, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public DN getEntryDN()
+  public final DN getEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getEntryDN");
 
@@ -304,22 +315,6 @@
 
 
   /**
-   * Specifies the DN of the entry to modify.  This should not be called by
-   * pre-parse plugins, since they should use <CODE>setRawEntryDN</CODE>
-   * instead.
-   *
-   * @param  entryDN  The DN of the entry to modify.
-   */
-  public void setEntryDN(DN entryDN)
-  {
-    assert debugEnter(CLASS_NAME, "setEntryDN", String.valueOf(entryDN));
-
-    this.entryDN = entryDN;
-  }
-
-
-
-  /**
    * Retrieves the set of raw, unprocessed modifications as included in the
    * client request.  Note that this may contain one or more invalid
    * modifications, as no validation will have been performed on this
@@ -328,7 +323,7 @@
    * @return  The set of raw, unprocessed modifications as included in the
    *          client request.
    */
-  public List<LDAPModification> getRawModifications()
+  public final List<LDAPModification> getRawModifications()
   {
     assert debugEnter(CLASS_NAME, "getRawModifications");
 
@@ -344,7 +339,7 @@
    * @param  rawModification  The modification to add to the set of raw
    *                          modifications for this modify operation.
    */
-  public void addRawModification(LDAPModification rawModification)
+  public final void addRawModification(LDAPModification rawModification)
   {
     assert debugEnter(CLASS_NAME, "addRawModification",
                       String.valueOf(rawModification));
@@ -361,7 +356,7 @@
    *
    * @param  rawModifications  The raw modifications for this modify operation.
    */
-  public void setRawModifications(List<LDAPModification> rawModifications)
+  public final void setRawModifications(List<LDAPModification> rawModifications)
   {
     assert debugEnter(CLASS_NAME, "setRawModifications",
                       String.valueOf(rawModifications));
@@ -374,16 +369,14 @@
 
 
   /**
-   * Retrieves the set of modifications for this modify operation.  Its
-   * contents may be altered in pre-operation plugins.  It must not be accessed
-   * by pre-parse plugins, which should use the <CODE>getRawModifications</CODE>
-   * method instead.
+   * Retrieves the set of modifications for this modify operation.  Its contents
+   * should not be altered.  It will not be available to pre-parse plugins.
    *
    * @return  The set of modifications for this modify operation, or
    *          <CODE>null</CODE> if the modifications have not yet been
    *          processed.
    */
-  public List<Modification> getModifications()
+  public final List<Modification> getModifications()
   {
     assert debugEnter(CLASS_NAME, "getModifications");
 
@@ -393,13 +386,35 @@
 
 
   /**
+   * Adds the provided modification to the set of modifications to this modify
+   * operation.  This may only be called by pre-operation plugins.
+   *
+   * @param  modification  The modification to add to the set of changes for
+   *                       this modify operation.
+   *
+   * @throws  DirectoryException  If an unexpected problem occurs while applying
+   *                              the modification to the entry.
+   */
+  public final void addModification(Modification modification)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "addModification",
+                      String.valueOf(modification));
+
+    modifiedEntry.applyModification(modification);
+    modifications.add(modification);
+  }
+
+
+
+  /**
    * Retrieves the current entry before any modifications are applied.  This
    * will not be available to pre-parse plugins.
    *
    * @return  The current entry, or <CODE>null</CODE> if it is not yet
    *          available.
    */
-  public Entry getCurrentEntry()
+  public final Entry getCurrentEntry()
   {
     assert debugEnter(CLASS_NAME, "getCurrentEntry");
 
@@ -417,7 +432,7 @@
    * @return  The modified entry that is to be written to the backend, or
    *          <CODE>null</CODE> if it is not yet available.
    */
-  public Entry getModifiedEntry()
+  public final Entry getModifiedEntry()
   {
     assert debugEnter(CLASS_NAME, "getModifiedEntry");
 
@@ -437,7 +452,7 @@
    *          modify request, or <CODE>null</CODE> if there were none or this
    *          information is not yet available.
    */
-  public List<AttributeValue> getCurrentPasswords()
+  public final List<AttributeValue> getCurrentPasswords()
   {
     assert debugEnter(CLASS_NAME, "getCurrentPasswords");
 
@@ -456,7 +471,7 @@
    *          request, or <CODE>null</CODE> if there were none or this
    *          information is not yet available.
    */
-  public List<AttributeValue> getNewPasswords()
+  public final List<AttributeValue> getNewPasswords()
   {
     assert debugEnter(CLASS_NAME, "getNewPasswords");
 
@@ -466,11 +481,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -480,13 +494,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -496,14 +507,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -519,7 +526,7 @@
    *          if none has been assigned yet or if there is no applicable
    *          synchronization mechanism in place that uses change numbers.
    */
-  public long getChangeNumber()
+  public final long getChangeNumber()
   {
     assert debugEnter(CLASS_NAME, "getChangeNumber");
 
@@ -535,7 +542,7 @@
    * @param  changeNumber  The change number that has been assigned to this
    *                       operation by the synchronization mechanism.
    */
-  public void setChangeNumber(long changeNumber)
+  public final void setChangeNumber(long changeNumber)
   {
     assert debugEnter(CLASS_NAME, "setChangeNumber",
                       String.valueOf(changeNumber));
@@ -546,11 +553,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -561,16 +567,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -584,16 +584,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -659,13 +653,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -675,12 +666,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -2666,14 +2677,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -2711,13 +2718,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -2727,12 +2731,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/MonitorConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/MonitorConfigManager.java
index e9ade0f..8816476 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/MonitorConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/MonitorConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/Operation.java b/opendj-sdk/opends/src/server/org/opends/server/core/Operation.java
index 1f5c35d..443c48d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/Operation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/Operation.java
@@ -35,10 +35,18 @@
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.types.AuthenticationInfo;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.PostOperationOperation;
+import org.opends.server.types.operation.PostResponseOperation;
+import org.opends.server.types.operation.PreOperationOperation;
+import org.opends.server.types.operation.PreParseOperation;
 
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.Debug.*;
@@ -52,7 +60,8 @@
  * appropriate for the type of operation.
  */
 public abstract class Operation
-       implements Runnable
+       implements PreParseOperation, PreOperationOperation,
+                  PostOperationOperation, PostResponseOperation, Runnable
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -73,21 +82,21 @@
   /**
    * The client connection with which this operation is associated.
    */
-  protected ClientConnection clientConnection;
+  protected final ClientConnection clientConnection;
 
 
 
   /**
    * The message ID for this operation.
    */
-  protected int messageID;
+  protected final int messageID;
 
 
 
   /**
    * The operation ID for this operation.
    */
-  protected long operationID;
+  protected final long operationID;
 
 
 
@@ -196,7 +205,7 @@
    * @return  A standard set of elements that should be logged in requests and
    *          responses for all types of operations.
    */
-  public String[][] getCommonLogElements()
+  public final String[][] getCommonLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -301,12 +310,11 @@
 
   /**
    * Retrieves the set of controls included in the request from the client.
-   * Note that it is only acceptable for the caller to alter the contents of the
-   * returned list in pre-parse plugins.
+   * The returned list must not be altered.
    *
    * @return  The set of controls included in the request from the client.
    */
-  public List<Control> getRequestControls()
+  public final List<Control> getRequestControls()
   {
     assert debugEnter(CLASS_NAME, "getRequestControls");
 
@@ -316,9 +324,41 @@
 
 
   /**
+   * Adds the provided control to the set of request controls for this
+   * operation.  This method may only be called by pre-parse plugins.
+   *
+   * @param  control  The control to add to the set of request controls for this
+   *                  operation.
+   */
+  public final void addRequestControl(Control control)
+  {
+    assert debugEnter(CLASS_NAME, "addRequestControl", String.valueOf(control));
+
+    requestControls.add(control);
+  }
+
+
+
+  /**
+   * Removes the provided control from the set of request controls for this
+   * operation.  This method may only be called by pre-parse plugins.
+   *
+   * @param  control  The control to remove from the set of request controls for
+   *                  this operation.
+   */
+  public final void removeRequestControl(Control control)
+  {
+    assert debugEnter(CLASS_NAME, "removeRequestControl",
+                      String.valueOf(control));
+
+    requestControls.remove(control);
+  }
+
+
+
+  /**
    * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
+   * The contents of this list must not be altered.
    *
    * @return  The set of controls to include in the response to the client.
    */
@@ -327,12 +367,35 @@
 
 
   /**
+   * Adds the provided control to the set of controls to include in the response
+   * to the client.  This method may not be called by post-response plugins.
+   *
+   * @param  control  The control to add to the set of controls to include in
+   *                  the response to the client.
+   */
+  public abstract void addResponseControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of controls to include in the
+   * response to the client.  This method may not be called by post-response
+   * plugins.
+   *
+   * @param  control  The control to remove from the set of controls to include
+   *                  in the response to the client.
+   */
+  public abstract void removeResponseControl(Control control);
+
+
+
+  /**
    * Retrieves the result code for this operation.
    *
    * @return  The result code associated for this operation, or
-   *          <CODE>null</CODE> if the operation has not yet completed.
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet completed.
    */
-  public ResultCode getResultCode()
+  public final ResultCode getResultCode()
   {
     assert debugEnter(CLASS_NAME, "getResultCode");
 
@@ -342,11 +405,12 @@
 
 
   /**
-   * Specifies the result code for this operation.
+   * Specifies the result code for this operation.  This method may not be
+   * called by post-response plugins.
    *
    * @param  resultCode  The result code for this operation.
    */
-  public void setResultCode(ResultCode resultCode)
+  public final void setResultCode(ResultCode resultCode)
   {
     assert debugEnter(CLASS_NAME, "setResultCode", String.valueOf(resultCode));
 
@@ -357,11 +421,12 @@
 
   /**
    * Retrieves the error message for this operation.  Its contents may be
-   * altered by the caller.
+   * altered by pre-parse, pre-operation, and post-operation plugins, but not
+   * by post-response plugins.
    *
    * @return  The error message for this operation.
    */
-  public StringBuilder getErrorMessage()
+  public final StringBuilder getErrorMessage()
   {
     assert debugEnter(CLASS_NAME, "getErrorMessage");
 
@@ -371,11 +436,12 @@
 
 
   /**
-   * Specifies the error message for this operation.
+   * Specifies the error message for this operation.  This method may not be
+   * called by post-response plugins.
    *
    * @param  errorMessage  The error message for this operation.
    */
-  public void setErrorMessage(StringBuilder errorMessage)
+  public final void setErrorMessage(StringBuilder errorMessage)
   {
     assert debugEnter(CLASS_NAME, "setErrorMessage",
                       String.valueOf(errorMessage));
@@ -395,11 +461,11 @@
   /**
    * Appends the provided message to the error message buffer.  If the buffer
    * has not yet been created, then this will create it first and then add the
-   * provided message.
+   * provided message.  This method may not be called by post-response plugins.
    *
    * @param  message  The message to append to the error message buffer.
    */
-  public void appendErrorMessage(String message)
+  public final void appendErrorMessage(String message)
   {
     assert debugEnter(CLASS_NAME, "appendErrorMessage",
                       String.valueOf(message));
@@ -424,11 +490,12 @@
   /**
    * Retrieves the additional log message for this operation, which should be
    * written to the log but not included in the response to the client.  The
-   * contents of this buffer may be altered by the caller.
+   * contents of this buffer may be altered by pre-parse, pre-operation, and
+   * post-operation plugins, but not by post-response plugins.
    *
    * @return  The additional log message for this operation.
    */
-  public StringBuilder getAdditionalLogMessage()
+  public final StringBuilder getAdditionalLogMessage()
   {
     assert debugEnter(CLASS_NAME, "getAdditionalLogMessage");
 
@@ -439,12 +506,13 @@
 
   /**
    * Specifies the additional log message for this operation, which should be
-   * written to the log but not included in the response to the client.
+   * written to the log but not included in the response to the client.  This
+   * method may not be called by post-response plugins.
    *
    * @param  additionalLogMessage  The additional log message for this
    *                               operation.
    */
-  public void setAdditionalLogMessage(StringBuilder additionalLogMessage)
+  public final void setAdditionalLogMessage(StringBuilder additionalLogMessage)
   {
     assert debugEnter(CLASS_NAME, "setAdditionalLogMessage",
                       String.valueOf(additionalLogMessage));
@@ -463,12 +531,12 @@
 
   /**
    * Appends the provided message to the additional log information for this
-   * operation.
+   * operation.  This method may not be called by post-response plugins.
    *
    * @param  message  The message that should be appended to the additional log
    *                  information for this operation.
    */
-  public void appendAdditionalLogMessage(String message)
+  public final void appendAdditionalLogMessage(String message)
   {
     assert debugEnter(CLASS_NAME, "appendAdditionalLogMessage",
                       String.valueOf(message));
@@ -491,7 +559,7 @@
    * @return  The matched DN for this operation, or <CODE>null</CODE> if the
    *          operation has not yet completed or does not have a matched DN.
    */
-  public DN getMatchedDN()
+  public final DN getMatchedDN()
   {
     assert debugEnter(CLASS_NAME, "getMatchedDN");
 
@@ -501,11 +569,12 @@
 
 
   /**
-   * Specifies the matched DN for this operation.
+   * Specifies the matched DN for this operation.  This may not be called by
+   * post-response plugins.
    *
    * @param  matchedDN  The matched DN for this operation.
    */
-  public void setMatchedDN(DN matchedDN)
+  public final void setMatchedDN(DN matchedDN)
   {
     assert debugEnter(CLASS_NAME, "setMatchedDN", String.valueOf(matchedDN));
 
@@ -515,14 +584,14 @@
 
 
   /**
-   * Retrieves the set of referral URLs for this operation.  If it is non-null
-   * then its contents may be altered by the caller.
+   * Retrieves the set of referral URLs for this operation.  Its contents must
+   * not be altered by the caller.
    *
    * @return  The set of referral URLs for this operation, or <CODE>null</CODE>
    *          if the operation is not yet complete or does not have a set of
    *          referral URLs.
    */
-  public List<String> getReferralURLs()
+  public final List<String> getReferralURLs()
   {
     assert debugEnter(CLASS_NAME, "getReferralURLs");
 
@@ -532,11 +601,12 @@
 
 
   /**
-   * Specifies the set of referral URLs for this operation.
+   * Specifies the set of referral URLs for this operation.  This may not be
+   * called by post-response plugins.
    *
    * @param  referralURLs  The set of referral URLs for this operation.
    */
-  public void setReferralURLs(List<String> referralURLs)
+  public final void setReferralURLs(List<String> referralURLs)
   {
     assert debugEnter(CLASS_NAME, "setReferralURLs",
                       String.valueOf(referralURLs));
@@ -548,12 +618,13 @@
 
   /**
    * Sets the response elements for this operation based on the information
-   * contained in the provided <CODE>DirectoryException</CODE> object.
+   * contained in the provided <CODE>DirectoryException</CODE> object.  This
+   * method may not be called by post-response plugins.
    *
    * @param  directoryException  The exception containing the information to use
    *                             for the response elements.
    */
-  public void setResponseData(DirectoryException directoryException)
+  public final void setResponseData(DirectoryException directoryException)
   {
     assert debugEnter(CLASS_NAME, "setResponseData");
 
@@ -573,7 +644,7 @@
    * @return  <CODE>true</CODE> if this is an internal operation, or
    *          <CODE>false</CODE> if it is not.
    */
-  public boolean isInternalOperation()
+  public final boolean isInternalOperation()
   {
     assert debugEnter(CLASS_NAME, "isInternalOperation");
 
@@ -584,13 +655,14 @@
 
   /**
    * Specifies whether this is an internal operation rather than one that was
-   * requested by an external client.
+   * requested by an external client.  This may not be called from within a
+   * plugin.
    *
    * @param  isInternalOperation  Specifies whether this is an internal
    *                              operation rather than one that was requested
    *                              by an external client.
    */
-  public void setInternalOperation(boolean isInternalOperation)
+  public final void setInternalOperation(boolean isInternalOperation)
   {
     assert debugEnter(CLASS_NAME, "setInternalOperation",
                       String.valueOf(isInternalOperation));
@@ -607,7 +679,7 @@
    * @return  <CODE>true</CODE> if this is a data synchronization operation, or
    *          <CODE>false</CODE> if it is not.
    */
-  public boolean isSynchronizationOperation()
+  public final boolean isSynchronizationOperation()
   {
     assert debugEnter(CLASS_NAME, "isSynchronizationOperation");
 
@@ -618,14 +690,16 @@
 
   /**
    * Specifies whether this is a synchronization operation rather than one that
-   * was requested by an external client.
+   * was requested by an external client.  This method may not be called from
+   * within a plugin.
    *
    * @param  isSynchronizationOperation  Specifies whether this is a
    *                                     synchronization operation rather than
    *                                     one that was requested by an external
    *                                     client.
    */
-  public void setSynchronizationOperation(boolean isSynchronizationOperation)
+  public final void setSynchronizationOperation(
+                         boolean isSynchronizationOperation)
   {
     assert debugEnter(CLASS_NAME, "setSynchronizationOperation",
                       String.valueOf(isSynchronizationOperation));
@@ -641,11 +715,12 @@
    * connection, or the null DN if no authentication has been performed on that
    * connection.  However, it may be some other value if special processing has
    * been requested (e.g., the operation included a proxied authorization
-   * control).
+   * control).  This method should not be called by pre-parse plugins because
+   * the correct value may not have yet been determined.
    *
    * @return  The authorization DN for this operation.
    */
-  public DN getAuthorizationDN()
+  public final DN getAuthorizationDN()
   {
     assert debugEnter(CLASS_NAME, "getAuthorizationDN");
 
@@ -670,13 +745,14 @@
 
 
   /**
-   * Specifies the authorization DN for this operation.
+   * Specifies the authorization DN for this operation.  This method may not be
+   * called from within a plugin.
    *
    * @param  authorizationDN  The authorization DN for this operation, or
    *                          <CODE>null</CODE> if it should use the DN of the
    *                          authenticated user.
    */
-  public void setAuthorizationDN(DN authorizationDN)
+  public final void setAuthorizationDN(DN authorizationDN)
   {
     assert debugEnter(CLASS_NAME, "setAuthorizationDN",
                       String.valueOf(authorizationDN));
@@ -692,7 +768,7 @@
    *
    * @return  The set of attachments defined for this operation.
    */
-  public Map<String,Object> getAttachments()
+  public final Map<String,Object> getAttachments()
   {
     assert debugEnter(CLASS_NAME, "getAttachments");
 
@@ -710,7 +786,7 @@
    * @return  The requested attachment object, or <CODE>null</CODE> if it does
    *          not exist.
    */
-  public Object getAttachment(String name)
+  public final Object getAttachment(String name)
   {
     assert debugEnter(CLASS_NAME, "getAttachment", String.valueOf(name));
 
@@ -728,7 +804,7 @@
    * @return  The attachment that was removed, or <CODE>null</CODE> if it does
    *          not exist.
    */
-  public Object removeAttachment(String name)
+  public final Object removeAttachment(String name)
   {
     assert debugEnter(CLASS_NAME, "removeAttachment", String.valueOf(name));
 
@@ -748,7 +824,7 @@
    * @return  The former value held by the attachment with the given name, or
    *          <CODE>null</CODE> if there was previously no such attachment.
    */
-  public Object setAttachment(String name, Object value)
+  public final Object setAttachment(String name, Object value)
   {
     assert debugEnter(CLASS_NAME, "putAttachment", String.valueOf(name),
                       String.valueOf(value));
@@ -759,6 +835,38 @@
 
 
   /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public abstract long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves the time that processing stopped for this operation.  This will
+   * actually hold a time immediately before the response was sent to the
+   * client.
+   *
+   * @return  The time that processing stopped for this operation.
+   */
+  public abstract long getProcessingStopTime();
+
+
+
+  /**
+   * Retrieves the length of time in milliseconds that the server spent
+   * processing this operation.  This should not be called until after the
+   * server has sent the response to the client.
+   *
+   * @return  The length of time in milliseconds that the server spent
+   *          processing this operation.
+   */
+  public abstract long getProcessingTime();
+
+
+
+  /**
    * Performs the work of actually processing this operation.  This should
    * include all processing for the operation, including invoking plugins,
    * logging messages, performing access control, managing synchronization, and
@@ -772,7 +880,7 @@
    * Indicates that processing on this operation has completed successfully and
    * that the client should perform any associated cleanup work.
    */
-  public void operationCompleted()
+  public final void operationCompleted()
   {
     assert debugEnter(CLASS_NAME, "operationCompleted");
 
@@ -798,7 +906,8 @@
 
   /**
    * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
+   * there is one.  This method should not be called by post-operation or
+   * post-response plugins.
    *
    * @return  The cancel request that has been issued for this operation, or
    *          <CODE>null</CODE> if there has not been any request to cancel.
@@ -814,7 +923,7 @@
    *          <CODE>null</CODE> if the operation has not seen and reacted to a
    *          cancel request.
    */
-  public CancelResult getCancelResult()
+  public final CancelResult getCancelResult()
   {
     assert debugEnter(CLASS_NAME, "getCancelResult");
 
@@ -828,7 +937,7 @@
    *
    * @param  cancelResult  The cancel result for this operation.
    */
-  public void setCancelResult(CancelResult cancelResult)
+  public final void setCancelResult(CancelResult cancelResult)
   {
     assert debugEnter(CLASS_NAME, "setCancelResult",
                       String.valueOf(cancelResult));
@@ -847,7 +956,7 @@
    *
    * @param  cancelRequest  The request to cancel this operation.
    */
-  protected void indicateCancelled(CancelRequest cancelRequest)
+  protected final void indicateCancelled(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "indicateCancelled",
                       String.valueOf(cancelRequest));
@@ -876,7 +985,7 @@
    *
    * @return  A string representation of this operation.
    */
-  public String toString()
+  public final String toString()
   {
     assert debugEnter(CLASS_NAME, "toString");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
index 2c7d47f..ce7cc3e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicy.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicy.java
index f043a2c..b7ed7e4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicy.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicy.java
@@ -59,6 +59,7 @@
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
index f78317d..f890bf0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
@@ -36,6 +36,7 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyState.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyState.java
index 59d414b..4307311 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyState.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordPolicyState.java
@@ -55,6 +55,7 @@
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
index 17c753f..a067549 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordValidatorConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
index 9f67cf4..16fcfe3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PersistentSearch.java b/opendj-sdk/opends/src/server/org/opends/server/core/PersistentSearch.java
index 9833dde..63c343a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PersistentSearch.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PersistentSearch.java
@@ -34,6 +34,7 @@
 import org.opends.server.controls.EntryChangeNotificationControl;
 import org.opends.server.controls.PersistentSearchChangeType;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.SearchFilter;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
index b556613..023c748 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
@@ -63,6 +63,7 @@
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.IntermediateResponse;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/RFC3672SubtreeSpecification.java b/opendj-sdk/opends/src/server/org/opends/server/core/RFC3672SubtreeSpecification.java
index d3957f7..a964219 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/RFC3672SubtreeSpecification.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/RFC3672SubtreeSpecification.java
@@ -38,6 +38,7 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ObjectClass;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/RelativeSubtreeSpecification.java b/opendj-sdk/opends/src/server/org/opends/server/core/RelativeSubtreeSpecification.java
index 7363610..5f58344 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/RelativeSubtreeSpecification.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/RelativeSubtreeSpecification.java
@@ -35,6 +35,7 @@
 import java.util.InputMismatchException;
 import java.util.NoSuchElementException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/RootDNConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/RootDNConfigManager.java
index 9d9ae0d..d4c9d95 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/RootDNConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/RootDNConfigManager.java
@@ -41,9 +41,11 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SASLConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/SASLConfigManager.java
index c9135a2..ea63ada 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SASLConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SASLConfigManager.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/Schema.java b/opendj-sdk/opends/src/server/org/opends/server/core/Schema.java
deleted file mode 100644
index 106366b..0000000
--- a/opendj-sdk/opends/src/server/org/opends/server/core/Schema.java
+++ /dev/null
@@ -1,2178 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying * information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Portions Copyright 2006 Sun Microsystems, Inc.
- */
-package org.opends.server.core;
-
-
-
-import java.util.LinkedHashSet;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.opends.server.api.ApproximateMatchingRule;
-import org.opends.server.api.AttributeSyntax;
-import org.opends.server.api.EqualityMatchingRule;
-import org.opends.server.api.MatchingRule;
-import org.opends.server.api.OrderingMatchingRule;
-import org.opends.server.api.SubstringMatchingRule;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
-import org.opends.server.types.DITContentRule;
-import org.opends.server.types.DITStructureRule;
-import org.opends.server.types.MatchingRuleUse;
-import org.opends.server.types.NameForm;
-import org.opends.server.types.ObjectClass;
-import org.opends.server.types.ResultCode;
-
-import static org.opends.server.loggers.Debug.*;
-import static org.opends.server.messages.CoreMessages.*;
-import static org.opends.server.messages.MessageHandler.*;
-import static org.opends.server.util.StaticUtils.*;
-
-
-
-/**
- * This class defines a data structure that holds information about the
- * components of the Directory Server schema.  It includes the following kinds
- * of elements:
- *
- * <UL>
- *   <LI>Attribute type definitions</LI>
- *   <LI>Objectclass definitions</LI>
- *   <LI>Attribute syntax definitions</LI>
- *   <LI>Matching rule definitions</LI>
- *   <LI>Matching rule use definitions</LI>
- *   <LI>DIT content rule definitions</LI>
- *   <LI>DIT structure rule definitions</LI>
- *   <LI>Name form definitions</LI>
- * </UL>
- */
-public class Schema
-{
-  /**
-   * The fully-qualified name of this class for debugging purposes.
-   */
-  private static final String CLASS_NAME = "org.opends.server.core.Schema";
-
-
-
-  // The set of attribute type definitions for this schema, mapped between the
-  // lowercase names and OID for the definition and the attribute type itself.
-  private ConcurrentHashMap<String,AttributeType> attributeTypes;
-
-  // The set of objectclass definitions for this schema, mapped between the
-  // lowercase names and OID for the definition and the objectclass itself.
-  private ConcurrentHashMap<String,ObjectClass> objectClasses;
-
-  // The set of attribute syntaxes for this schema, mapped between the OID for
-  // the syntax and the syntax itself.
-  private ConcurrentHashMap<String,AttributeSyntax> syntaxes;
-
-  // The entire set of matching rules for this schema, mapped between the
-  // lowercase names and OID for the definition and the matching rule itself.
-  private ConcurrentHashMap<String,MatchingRule> matchingRules;
-
-  // The set of approximate matching rules for this schema, mapped between the
-  // lowercase names and OID for the definition and the matching rule itself.
-  private ConcurrentHashMap<String,ApproximateMatchingRule>
-               approximateMatchingRules;
-
-  // The set of equality matching rules for this schema, mapped between the
-  // lowercase names and OID for the definition and the matching rule itself.
-  private ConcurrentHashMap<String,EqualityMatchingRule> equalityMatchingRules;
-
-  // The set of ordering matching rules for this schema, mapped between the
-  // lowercase names and OID for the definition and the matching rule itself.
-  private ConcurrentHashMap<String,OrderingMatchingRule> orderingMatchingRules;
-
-  // The set of substring matching rules for this schema, mapped between the
-  // lowercase names and OID for the definition and the matching rule itself.
-  private ConcurrentHashMap<String,SubstringMatchingRule>
-               substringMatchingRules;
-
-  // The set of matching rule uses for this schema, mapped between the matching
-  // rule for the definition and the matching rule use itself.
-  private ConcurrentHashMap<MatchingRule,MatchingRuleUse> matchingRuleUses;
-
-  // The set of DIT content rules for this schema, mapped between the structural
-  // objectclass for the definition and the DIT content rule itself.
-  private ConcurrentHashMap<ObjectClass,DITContentRule> ditContentRules;
-
-  // The set of DIT structure rules for this schema, mapped between the name
-  // form for the definition and the DIT structure rule itself.
-  private ConcurrentHashMap<Integer,DITStructureRule>
-               ditStructureRulesByID;
-
-  // The set of DIT structure rules for this schema, mapped between the name
-  // form for the definition and the DIT structure rule itself.
-  private ConcurrentHashMap<NameForm,DITStructureRule>
-               ditStructureRulesByNameForm;
-
-  // The set of name forms for this schema, mapped between the structural
-  // objectclass for the definition and the name form itself.
-  private ConcurrentHashMap<ObjectClass,NameForm> nameFormsByOC;
-
-  // The set of name forms for this schema, mapped between the names/OID and the
-  // name form itself.
-  private ConcurrentHashMap<String,NameForm> nameFormsByName;
-
-  // The set of pre-encoded attribute syntax representations.
-  private LinkedHashSet<AttributeValue> syntaxSet;
-
-  // The set of pre-encoded attribute type representations.
-  private LinkedHashSet<AttributeValue> attributeTypeSet;
-
-  // The set of pre-encoded DIT content rule representations.
-  private LinkedHashSet<AttributeValue> ditContentRuleSet;
-
-  // The set of pre-encoded DIT structure rule representations.
-  private LinkedHashSet<AttributeValue> ditStructureRuleSet;
-
-  // The set of pre-encoded matching rule representations.
-  private LinkedHashSet<AttributeValue> matchingRuleSet;
-
-  // The set of pre-encoded matching rule use representations.
-  private LinkedHashSet<AttributeValue> matchingRuleUseSet;
-
-  // The set of pre-encoded name form representations.
-  private LinkedHashSet<AttributeValue> nameFormSet;
-
-  // The set of pre-encoded objectclass representations.
-  private LinkedHashSet<AttributeValue> objectClassSet;
-
-
-
-  /**
-   * Creates a new schema structure with all elements initialized but empty.
-   */
-  public Schema()
-  {
-    assert debugConstructor(CLASS_NAME);
-
-    attributeTypes           = new ConcurrentHashMap<String,AttributeType>();
-    objectClasses            = new ConcurrentHashMap<String,ObjectClass>();
-    syntaxes                 = new ConcurrentHashMap<String,AttributeSyntax>();
-    matchingRules            = new ConcurrentHashMap<String,MatchingRule>();
-    approximateMatchingRules = new ConcurrentHashMap<String,
-                                                     ApproximateMatchingRule>();
-    equalityMatchingRules    = new ConcurrentHashMap<String,
-                                                     EqualityMatchingRule>();
-    orderingMatchingRules    = new ConcurrentHashMap<String,
-                                                     OrderingMatchingRule>();
-    substringMatchingRules   = new ConcurrentHashMap<String,
-                                                     SubstringMatchingRule>();
-    matchingRuleUses         = new ConcurrentHashMap<MatchingRule,
-                                                     MatchingRuleUse>();
-    ditContentRules          = new ConcurrentHashMap<ObjectClass,
-                                                     DITContentRule>();
-    ditStructureRulesByID    = new ConcurrentHashMap<Integer,
-                                                     DITStructureRule>();
-    ditStructureRulesByNameForm =
-         new ConcurrentHashMap<NameForm,DITStructureRule>();
-    nameFormsByOC            = new ConcurrentHashMap<ObjectClass,NameForm>();
-    nameFormsByName          = new ConcurrentHashMap<String,NameForm>();
-
-
-    syntaxSet                = new LinkedHashSet<AttributeValue>();
-    attributeTypeSet         = new LinkedHashSet<AttributeValue>();
-    ditContentRuleSet        = new LinkedHashSet<AttributeValue>();
-    ditStructureRuleSet      = new LinkedHashSet<AttributeValue>();
-    matchingRuleSet          = new LinkedHashSet<AttributeValue>();
-    matchingRuleUseSet       = new LinkedHashSet<AttributeValue>();
-    nameFormSet              = new LinkedHashSet<AttributeValue>();
-    objectClassSet           = new LinkedHashSet<AttributeValue>();
-  }
-
-
-
-  /**
-   * Retrieves the attribute type definitions for this schema, as a mapping
-   * between the lowercase names and OIDs for the attribute type and the
-   * attribute type itself.  Each attribute type may be associated with multiple
-   * keys (once for the OID and again for each name).  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The attribute type definitions for this schema.
-   */
-  public ConcurrentHashMap<String,AttributeType> getAttributeTypes()
-  {
-    assert debugEnter(CLASS_NAME, "getAttributeTypes");
-
-    return attributeTypes;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined attribute types for this schema.
-   *
-   * @return  The set of defined attribute types for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getAttributeTypeSet()
-  {
-    assert debugEnter(CLASS_NAME, "getAttributeTypeSet");
-
-    return attributeTypeSet;
-  }
-
-
-
-  /**
-   * Retrieves the attribute type definition with the specified name or OID.
-   *
-   * @param  lowerName  The name or OID of the attribute type to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested attribute type, or <CODE>null</CODE> if no type is
-   *          registered with the provided name or OID.
-   */
-  public AttributeType getAttributeType(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getAttributeType",
-                      String.valueOf(lowerName));
-
-    return attributeTypes.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided attribute type definition with this schema.
-   *
-   * @param  attributeType      The attribute type to register with this schema.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another attribute type with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerAttributeType(AttributeType attributeType,
-                                    boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerAttributeType",
-                      String.valueOf(attributeType),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (attributeTypes)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(attributeType.getOID());
-        if (attributeTypes.containsKey(oid))
-        {
-          AttributeType conflictingType = attributeTypes.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_ATTRIBUTE_OID;
-          String message = getMessage(msgID, attributeType.getNameOrOID(),
-                                      oid, conflictingType.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        for (String name : attributeType.getNormalizedNames())
-        {
-          if (attributeTypes.containsKey(name))
-          {
-            AttributeType conflictingType = attributeTypes.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_ATTRIBUTE_NAME;
-            String message = getMessage(msgID, attributeType.getNameOrOID(),
-                                        name, conflictingType.getNameOrOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      attributeTypes.put(toLowerCase(attributeType.getOID()), attributeType);
-
-      for (String name : attributeType.getNormalizedNames())
-      {
-        attributeTypes.put(name, attributeType);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = attributeType.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      attributeTypeSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided attribute type definition with this schema.
-   *
-   * @param  attributeType  The attribute type to deregister with this schema.
-   */
-  public void deregisterAttributeType(AttributeType attributeType)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterAttributeType",
-                      String.valueOf(attributeType));
-
-    synchronized (attributeTypes)
-    {
-      attributeTypes.remove(toLowerCase(attributeType.getOID()), attributeType);
-
-      for (String name : attributeType.getNormalizedNames())
-      {
-        attributeTypes.remove(name, attributeType);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = attributeType.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      attributeTypeSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the objectclass definitions for this schema, as a mapping between
-   * the lowercase names and OIDs for the objectclass and the objectclass
-   * itself.  Each objectclass may be associated with multiple keys (once for
-   * the OID and again for each name).  The contents of the returned mapping
-   * must not be altered.
-   *
-   * @return  The objectclass definitions for this schema.
-   */
-  public ConcurrentHashMap<String,ObjectClass> getObjectClasses()
-  {
-    assert debugEnter(CLASS_NAME, "getObjectClasses");
-
-    return objectClasses;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined objectclasses for this schema.
-   *
-   * @return  The set of defined objectclasses for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getObjectClassSet()
-  {
-    assert debugEnter(CLASS_NAME, "getObjectClassSet");
-
-    return objectClassSet;
-  }
-
-
-
-  /**
-   * Retrieves the objectclass definition with the specified name or OID.
-   *
-   * @param  lowerName  The name or OID of the objectclass to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested objectclass, or <CODE>null</CODE> if no class is
-   *          registered with the provided name or OID.
-   */
-  public ObjectClass getObjectClass(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getObjectClass",
-                      String.valueOf(lowerName));
-
-    return objectClasses.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided objectclass definition with this schema.
-   *
-   * @param  objectClass        The objectclass to register with this schema.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another objectclass with the same OID or name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerObjectClass(ObjectClass objectClass,
-                                  boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerObjectClass",
-                      String.valueOf(objectClass),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (objectClasses)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(objectClass.getOID());
-        if (objectClasses.containsKey(oid))
-        {
-          ObjectClass conflictingClass = objectClasses.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_OBJECTCLASS_OID;
-          String message = getMessage(msgID, objectClass.getNameOrOID(),
-                                      oid, conflictingClass.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        for (String name : objectClass.getNormalizedNames())
-        {
-          if (objectClasses.containsKey(name))
-          {
-            ObjectClass conflictingClass = objectClasses.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_OBJECTCLASS_NAME;
-            String message = getMessage(msgID, objectClass.getNameOrOID(),
-                                        name, conflictingClass.getNameOrOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      objectClasses.put(toLowerCase(objectClass.getOID()), objectClass);
-
-      for (String name : objectClass.getNormalizedNames())
-      {
-        objectClasses.put(name, objectClass);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = objectClass.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      objectClassSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided objectclass definition with this schema.
-   *
-   * @param  objectClass  The objectclass to deregister with this schema.
-   */
-  public void deregisterObjectClass(ObjectClass objectClass)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterObjectClass",
-                      String.valueOf(objectClass));
-
-    synchronized (objectClasses)
-    {
-      objectClasses.remove(toLowerCase(objectClass.getOID()), objectClass);
-
-      for (String name : objectClass.getNormalizedNames())
-      {
-        objectClasses.remove(name, objectClass);
-      }
-
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = objectClass.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      objectClassSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the attribute syntax definitions for this schema, as a mapping
-   * between the OID for the syntax and the syntax itself.  Each syntax should
-   * only be present once, since its only key is its OID.  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The attribute syntax definitions for this schema.
-   */
-  public ConcurrentHashMap<String,AttributeSyntax> getSyntaxes()
-  {
-    assert debugEnter(CLASS_NAME, "getSyntaxes");
-
-    return syntaxes;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined attribute syntaxes for this schema.
-   *
-   * @return  The set of defined attribute syntaxes for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getSyntaxSet()
-  {
-    assert debugEnter(CLASS_NAME, "getSyntaxSet");
-
-    return syntaxSet;
-  }
-
-
-
-  /**
-   * Retrieves the attribute syntax definition with the OID.
-   *
-   * @param  lowerName  The OID of the attribute syntax to retrieve, formatted
-   *                    in all lowercase characters.
-   *
-   * @return  The requested attribute syntax, or <CODE>null</CODE> if no syntax
-   *          is registered with the provided OID.
-   */
-  public AttributeSyntax getSyntax(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getSyntax", String.valueOf(lowerName));
-
-    return syntaxes.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided attribute syntax definition with this schema.
-   *
-   * @param  syntax             The attribute syntax to register with this
-   *                            schema.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another attribute syntax with the same OID).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerSyntax(AttributeSyntax syntax, boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerSyntax", String.valueOf(syntax),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (syntaxes)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(syntax.getOID());
-        if (syntaxes.containsKey(oid))
-        {
-          AttributeSyntax conflictingSyntax = syntaxes.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_SYNTAX_OID;
-          String message = getMessage(msgID, syntax.getSyntaxName(),
-                                      oid, conflictingSyntax.getSyntaxName());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-      }
-
-      syntaxes.put(toLowerCase(syntax.getOID()), syntax);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = syntax.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      syntaxSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided attribute syntax definition with this schema.
-   *
-   * @param  syntax  The attribute syntax to deregister with this schema.
-   */
-  public void deregisterSyntax(AttributeSyntax syntax)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterSyntax", String.valueOf(syntax));
-
-    synchronized (syntaxes)
-    {
-      syntaxes.remove(toLowerCase(syntax.getOID()), syntax);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = syntax.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue = new ASN1OctetString(toLowerCase(valueString));
-      syntaxSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the entire set of matching rule definitions for this schema, as a
-   * mapping between the lowercase names and OIDs for the matching rule and the
-   * matching rule itself.  Each matching rule may be associated with multiple
-   * keys (once for the OID and again for each name).  This should be a superset
-   * of the sets of approximate, equality, ordering, and substring matching
-   * rules.  The contents of the returned mapping must not be altered.
-   *
-   * @return  The matching rule definitions for this schema.
-   */
-  public ConcurrentHashMap<String,MatchingRule> getMatchingRules()
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRules");
-
-    return matchingRules;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined matching rules for this schema.
-   *
-   * @return  The set of defined matching rules for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getMatchingRuleSet()
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRuleSet");
-
-    return matchingRuleSet;
-  }
-
-
-
-  /**
-   * Retrieves the matching rule definition with the specified name or OID.
-   *
-   * @param  lowerName  The name or OID of the matching rule to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested matching rule, or <CODE>null</CODE> if no rule is
-   *          registered with the provided name or OID.
-   */
-  public MatchingRule getMatchingRule(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRule", String.valueOf(lowerName));
-
-    return matchingRules.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided matching rule definition with this schema.
-   *
-   * @param  matchingRule       The matching rule to register with this schema.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerMatchingRule(MatchingRule matchingRule,
-                                   boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerMatchingRule",
-                      String.valueOf(matchingRule),
-                      String.valueOf(overwriteExisting));
-
-    if (matchingRule instanceof ApproximateMatchingRule)
-    {
-      registerApproximateMatchingRule((ApproximateMatchingRule) matchingRule,
-                                      overwriteExisting);
-    }
-    else if (matchingRule instanceof EqualityMatchingRule)
-    {
-      registerEqualityMatchingRule((EqualityMatchingRule) matchingRule,
-                                   overwriteExisting);
-    }
-    else if (matchingRule instanceof OrderingMatchingRule)
-    {
-      registerOrderingMatchingRule((OrderingMatchingRule) matchingRule,
-                                   overwriteExisting);
-    }
-    else if (matchingRule instanceof SubstringMatchingRule)
-    {
-      registerSubstringMatchingRule((SubstringMatchingRule) matchingRule,
-                                    overwriteExisting);
-    }
-    else
-    {
-      synchronized (matchingRules)
-      {
-        if (! overwriteExisting)
-        {
-          String oid = toLowerCase(matchingRule.getOID());
-          if (matchingRules.containsKey(oid))
-          {
-            MatchingRule conflictingRule = matchingRules.get(oid);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
-            String message = getMessage(msgID, matchingRule.getNameOrOID(),
-                                        oid, conflictingRule.getNameOrOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-
-          String name = matchingRule.getName();
-          if (name != null)
-          {
-            name = toLowerCase(name);
-            if (matchingRules.containsKey(name))
-            {
-              MatchingRule conflictingRule = matchingRules.get(name);
-
-              int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
-              String message = getMessage(msgID, matchingRule.getOID(),
-                                          name, conflictingRule.getOID());
-              throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                           message, msgID);
-            }
-          }
-        }
-
-        matchingRules.put(toLowerCase(matchingRule.getOID()), matchingRule);
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          matchingRules.put(toLowerCase(name), matchingRule);
-        }
-
-        // We'll use an attribute value including the normalized value rather
-        // than the attribute type because otherwise it would use a very
-        // expensive matching rule (OID first component match) that would kill
-        // performance.
-        String valueString = matchingRule.toString();
-        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-        ASN1OctetString normValue =
-             new ASN1OctetString(toLowerCase(valueString));
-        matchingRuleSet.add(new AttributeValue(rawValue, normValue));
-      }
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided matching rule definition with this schema.
-   *
-   * @param  matchingRule  The matching rule to deregister with this schema.
-   */
-  public void deregisterMatchingRule(MatchingRule matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterMatchingRule",
-                      String.valueOf(matchingRule));
-
-    if (matchingRule instanceof ApproximateMatchingRule)
-    {
-      deregisterApproximateMatchingRule((ApproximateMatchingRule) matchingRule);
-    }
-    else if (matchingRule instanceof EqualityMatchingRule)
-    {
-      deregisterEqualityMatchingRule((EqualityMatchingRule) matchingRule);
-    }
-    else if (matchingRule instanceof OrderingMatchingRule)
-    {
-      deregisterOrderingMatchingRule((OrderingMatchingRule) matchingRule);
-    }
-    else if (matchingRule instanceof SubstringMatchingRule)
-    {
-      deregisterSubstringMatchingRule((SubstringMatchingRule) matchingRule);
-    }
-    else
-    {
-      synchronized (matchingRules)
-      {
-        matchingRules.remove(toLowerCase(matchingRule.getOID()), matchingRule);
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          matchingRules.remove(toLowerCase(name), matchingRule);
-        }
-
-
-        // We'll use an attribute value including the normalized value rather
-        // than the attribute type because otherwise it would use a very
-        // expensive matching rule (OID first component match) that would kill
-        // performance.
-        String valueString = matchingRule.toString();
-        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-        ASN1OctetString normValue =
-             new ASN1OctetString(toLowerCase(valueString));
-        matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
-      }
-    }
-  }
-
-
-
-  /**
-   * Retrieves the approximate matching rule definitions for this schema, as a
-   * mapping between the lowercase names and OIDs for the matching rule and the
-   * matching rule itself.  Each matching rule may be associated with multiple
-   * keys (once for the OID and again for each name).  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The approximate matching rule definitions for this schema.
-   */
-  public ConcurrentHashMap<String,ApproximateMatchingRule>
-              getApproximateMatchingRules()
-  {
-    assert debugEnter(CLASS_NAME, "getApproximateMatchingRules");
-
-    return approximateMatchingRules;
-  }
-
-
-
-  /**
-   * Retrieves the approximate matching rule definition with the specified name
-   * or OID.
-   *
-   * @param  lowerName  The name or OID of the matching rule to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested matching rule, or <CODE>null</CODE> if no
-   *          approximate matching rule is registered with the provided name or
-   *          OID.
-   */
-  public ApproximateMatchingRule getApproximateMatchingRule(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getApproximateMatchingRule",
-                      String.valueOf(lowerName));
-
-    return approximateMatchingRules.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided approximate matching rule with this schema.
-   *
-   * @param  matchingRule       The approximate matching rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerApproximateMatchingRule(
-                   ApproximateMatchingRule matchingRule,
-                   boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerApproximateMatchingRule",
-                      String.valueOf(matchingRule),
-                      String.valueOf(overwriteExisting));
-
-
-    synchronized (matchingRules)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(matchingRule.getOID());
-        if (matchingRules.containsKey(oid))
-        {
-          MatchingRule conflictingRule = matchingRules.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
-          String message = getMessage(msgID, matchingRule.getNameOrOID(),
-                                      oid, conflictingRule.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          name = toLowerCase(name);
-          if (matchingRules.containsKey(name))
-          {
-            MatchingRule conflictingRule = matchingRules.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
-            String message = getMessage(msgID, matchingRule.getOID(),
-                                        name, conflictingRule.getOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      String oid = toLowerCase(matchingRule.getOID());
-      approximateMatchingRules.put(oid, matchingRule);
-      matchingRules.put(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        approximateMatchingRules.put(name, matchingRule);
-        matchingRules.put(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided approximate matching rule definition with this
-   * schema.
-   *
-   * @param  matchingRule  The approximate matching rule to deregister with this
-   *                       schema.
-   */
-  public void deregisterApproximateMatchingRule(ApproximateMatchingRule
-                                                     matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterApproximateMatchingRule",
-                      String.valueOf(matchingRule));
-
-    synchronized (matchingRules)
-    {
-      String oid = matchingRule.getOID();
-      approximateMatchingRules.remove(oid, matchingRule);
-      matchingRules.remove(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        approximateMatchingRules.remove(name, matchingRule);
-        matchingRules.remove(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the equality matching rule definitions for this schema, as a
-   * mapping between the lowercase names and OIDs for the matching rule and the
-   * matching rule itself.  Each matching rule may be associated with multiple
-   * keys (once for the OID and again for each name).  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The equality matching rule definitions for this schema.
-   */
-  public ConcurrentHashMap<String,EqualityMatchingRule>
-              getEqualityMatchingRules()
-  {
-    assert debugEnter(CLASS_NAME, "getEqualityMatchingRules");
-
-    return equalityMatchingRules;
-  }
-
-
-
-  /**
-   * Retrieves the equality matching rule definition with the specified name
-   * or OID.
-   *
-   * @param  lowerName  The name or OID of the matching rule to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested matching rule, or <CODE>null</CODE> if no equality
-   *          matching rule is registered with the provided name or OID.
-   */
-  public EqualityMatchingRule getEqualityMatchingRule(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getEqualityMatchingRule",
-                      String.valueOf(lowerName));
-
-    return equalityMatchingRules.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided equality matching rule with this schema.
-   *
-   * @param  matchingRule       The equality matching rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerEqualityMatchingRule(EqualityMatchingRule matchingRule,
-                                           boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerEqualityMatchingRule",
-                      String.valueOf(matchingRule),
-                      String.valueOf(overwriteExisting));
-
-
-    synchronized (matchingRules)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(matchingRule.getOID());
-        if (matchingRules.containsKey(oid))
-        {
-          MatchingRule conflictingRule = matchingRules.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
-          String message = getMessage(msgID, matchingRule.getNameOrOID(),
-                                      oid, conflictingRule.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          name = toLowerCase(name);
-          if (matchingRules.containsKey(name))
-          {
-            MatchingRule conflictingRule = matchingRules.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
-            String message = getMessage(msgID, matchingRule.getOID(),
-                                        name, conflictingRule.getOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      String oid = toLowerCase(matchingRule.getOID());
-      equalityMatchingRules.put(oid, matchingRule);
-      matchingRules.put(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        equalityMatchingRules.put(name, matchingRule);
-        matchingRules.put(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided equality matching rule definition with this
-   * schema.
-   *
-   * @param  matchingRule  The equality matching rule to deregister with this
-   *                       schema.
-   */
-  public void deregisterEqualityMatchingRule(EqualityMatchingRule
-                                                  matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterEqualityMatchingRule",
-                      String.valueOf(matchingRule));
-
-    synchronized (matchingRules)
-    {
-      String oid = matchingRule.getOID();
-      equalityMatchingRules.remove(oid, matchingRule);
-      matchingRules.remove(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        equalityMatchingRules.remove(name, matchingRule);
-        matchingRules.remove(name, matchingRule);
-      }
-
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the ordering matching rule definitions for this schema, as a
-   * mapping between the lowercase names and OIDs for the matching rule and the
-   * matching rule itself.  Each matching rule may be associated with multiple
-   * keys (once for the OID and again for each name).  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The ordering matching rule definitions for this schema.
-   */
-  public ConcurrentHashMap<String,OrderingMatchingRule>
-              getOrderingMatchingRules()
-  {
-    assert debugEnter(CLASS_NAME, "getOrderingMatchingRules");
-
-    return orderingMatchingRules;
-  }
-
-
-
-  /**
-   * Retrieves the ordering matching rule definition with the specified name
-   * or OID.
-   *
-   * @param  lowerName  The name or OID of the matching rule to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested matching rule, or <CODE>null</CODE> if no ordering
-   *          matching rule is registered with the provided name or OID.
-   */
-  public OrderingMatchingRule getOrderingMatchingRule(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getOrderingMatchingRule",
-                      String.valueOf(lowerName));
-
-    return orderingMatchingRules.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided ordering matching rule with this schema.
-   *
-   * @param  matchingRule       The ordering matching rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerOrderingMatchingRule(OrderingMatchingRule matchingRule,
-                                           boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerOrderingMatchingRule",
-                      String.valueOf(matchingRule),
-                      String.valueOf(overwriteExisting));
-
-
-    synchronized (matchingRules)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(matchingRule.getOID());
-        if (matchingRules.containsKey(oid))
-        {
-          MatchingRule conflictingRule = matchingRules.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
-          String message = getMessage(msgID, matchingRule.getNameOrOID(),
-                                      oid, conflictingRule.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          name = toLowerCase(name);
-          if (matchingRules.containsKey(name))
-          {
-            MatchingRule conflictingRule = matchingRules.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
-            String message = getMessage(msgID, matchingRule.getOID(),
-                                        name, conflictingRule.getOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      String oid = toLowerCase(matchingRule.getOID());
-      orderingMatchingRules.put(oid, matchingRule);
-      matchingRules.put(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        orderingMatchingRules.put(name, matchingRule);
-        matchingRules.put(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided ordering matching rule definition with this
-   * schema.
-   *
-   * @param  matchingRule  The ordering matching rule to deregister with this
-   *                       schema.
-   */
-  public void deregisterOrderingMatchingRule(OrderingMatchingRule
-                                                  matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterOrderingMatchingRule",
-                      String.valueOf(matchingRule));
-
-    synchronized (matchingRules)
-    {
-      String oid = matchingRule.getOID();
-      orderingMatchingRules.remove(oid, matchingRule);
-      matchingRules.remove(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        orderingMatchingRules.remove(name, matchingRule);
-        matchingRules.remove(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the substring matching rule definitions for this schema, as a
-   * mapping between the lowercase names and OIDs for the matching rule and the
-   * matching rule itself.  Each matching rule may be associated with multiple
-   * keys (once for the OID and again for each name).  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The substring matching rule definitions for this schema.
-   */
-  public ConcurrentHashMap<String,SubstringMatchingRule>
-              getSubstringMatchingRules()
-  {
-    assert debugEnter(CLASS_NAME, "getSubstringMatchingRules");
-
-    return substringMatchingRules;
-  }
-
-
-
-  /**
-   * Retrieves the substring matching rule definition with the specified name
-   * or OID.
-   *
-   * @param  lowerName  The name or OID of the matching rule to retrieve,
-   *                    formatted in all lowercase characters.
-   *
-   * @return  The requested matching rule, or <CODE>null</CODE> if no substring
-   *          matching rule is registered with the provided name or OID.
-   */
-  public SubstringMatchingRule getSubstringMatchingRule(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getSubstringMatchingRule",
-                      String.valueOf(lowerName));
-
-    return substringMatchingRules.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided substring matching rule with this schema.
-   *
-   * @param  matchingRule       The substring matching rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule with the same OID or
-   *                            name).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerSubstringMatchingRule(SubstringMatchingRule matchingRule,
-                                            boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerSubstringMatchingRule",
-                      String.valueOf(matchingRule),
-                      String.valueOf(overwriteExisting));
-
-
-    synchronized (matchingRules)
-    {
-      if (! overwriteExisting)
-      {
-        String oid = toLowerCase(matchingRule.getOID());
-        if (matchingRules.containsKey(oid))
-        {
-          MatchingRule conflictingRule = matchingRules.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
-          String message = getMessage(msgID, matchingRule.getNameOrOID(),
-                                      oid, conflictingRule.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        String name = matchingRule.getName();
-        if (name != null)
-        {
-          name = toLowerCase(name);
-          if (matchingRules.containsKey(name))
-          {
-            MatchingRule conflictingRule = matchingRules.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
-            String message = getMessage(msgID, matchingRule.getOID(),
-                                        name, conflictingRule.getOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      String oid = toLowerCase(matchingRule.getOID());
-      substringMatchingRules.put(oid, matchingRule);
-      matchingRules.put(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        substringMatchingRules.put(name, matchingRule);
-        matchingRules.put(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided substring matching rule definition with this
-   * schema.
-   *
-   * @param  matchingRule  The substring matching rule to deregister with this
-   *                       schema.
-   */
-  public void deregisterSubstringMatchingRule(SubstringMatchingRule
-                                                   matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterSubstringMatchingRule",
-                      String.valueOf(matchingRule));
-
-    synchronized (matchingRules)
-    {
-      String oid = matchingRule.getOID();
-      substringMatchingRules.remove(oid, matchingRule);
-      matchingRules.remove(oid, matchingRule);
-
-      String name = matchingRule.getName();
-      if (name != null)
-      {
-        name = toLowerCase(name);
-        substringMatchingRules.remove(name, matchingRule);
-        matchingRules.remove(name, matchingRule);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the matching rule use definitions for this schema, as a mapping
-   * between the matching rule for the matching rule use definition and the
-   * matching rule use itself.  Each matching rule use should only be present
-   * once, since its only key is its matching rule.  The contents of the
-   * returned mapping must not be altered.
-   *
-   * @return  The matching rule use definitions for this schema.
-   */
-  public ConcurrentHashMap<MatchingRule,MatchingRuleUse> getMatchingRuleUses()
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRuleUses");
-
-    return matchingRuleUses;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined matching rule uses for this schema.
-   *
-   * @return  The set of defined matching rule uses for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getMatchingRuleUseSet()
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRuleUseSet");
-
-    return matchingRuleUseSet;
-  }
-
-
-
-  /**
-   * Retrieves the matching rule use definition for the specified matching rule.
-   *
-   * @param  matchingRule  The matching rule for which to retrieve the matching
-   *                       rule use definition.
-   *
-   * @return  The matching rule use definition, or <CODE>null</CODE> if none
-   *          exists for the specified matching rule.
-   */
-  public MatchingRuleUse getMatchingRuleUse(MatchingRule matchingRule)
-  {
-    assert debugEnter(CLASS_NAME, "getMatchingRuleUse",
-                      String.valueOf(matchingRule));
-
-    return matchingRuleUses.get(matchingRule);
-  }
-
-
-
-  /**
-   * Registers the provided matching rule use definition with this schema.
-   *
-   * @param  matchingRuleUse    The matching rule use definition to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another matching rule use with the same matching
-   *                            rule).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerMatchingRuleUse(MatchingRuleUse matchingRuleUse,
-                                      boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerMatchingRuleUse",
-                      String.valueOf(matchingRuleUse),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (matchingRuleUses)
-    {
-      MatchingRule matchingRule = matchingRuleUse.getMatchingRule();
-
-      if (! overwriteExisting)
-      {
-        if (matchingRuleUses.containsKey(matchingRule))
-        {
-          MatchingRuleUse conflictingUse = matchingRuleUses.get(matchingRule);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_MATCHING_RULE_USE;
-          String message = getMessage(msgID, matchingRuleUse.getName(),
-                                      matchingRule.getNameOrOID(),
-                                      conflictingUse.getName());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-      }
-
-      matchingRuleUses.put(matchingRule, matchingRuleUse);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRuleUse.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleUseSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided matching rule use definition with this schema.
-   *
-   * @param  matchingRuleUse  The matching rule use to deregister with this
-   *                          schema.
-   */
-  public void deregisterMatchingRuleUse(MatchingRuleUse matchingRuleUse)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterMatchingRuleUse",
-                      String.valueOf(matchingRuleUse));
-
-    synchronized (matchingRuleUses)
-    {
-      matchingRuleUses.remove(matchingRuleUse.getMatchingRule(),
-                              matchingRuleUse);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = matchingRuleUse.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      matchingRuleUseSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the DIT content rule definitions for this schema, as a mapping
-   * between the objectclass for the rule and the DIT content rule itself.  Each
-   * DIT content rule should only be present once, since its only key is its
-   * objectclass.  The contents of the returned mapping must not be altered.
-   *
-   * @return  The DIT content rule definitions for this schema.
-   */
-  public ConcurrentHashMap<ObjectClass,DITContentRule> getDITContentRules()
-  {
-    assert debugEnter(CLASS_NAME, "getDITContentRules");
-
-    return ditContentRules;
-  }
-
-
-
-  /**
-   * Retrieves the set of defined DIT content rules for this schema.
-   *
-   * @return  The set of defined DIT content rules for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getDITContentRuleSet()
-  {
-    assert debugEnter(CLASS_NAME, "getDITContentRuleSet");
-
-    return ditContentRuleSet;
-  }
-
-
-
-  /**
-   * Retrieves the DIT content rule definition for the specified objectclass.
-   *
-   * @param  objectClass  The objectclass for the DIT content rule to retrieve.
-   *
-   * @return  The requested DIT content rule, or <CODE>null</CODE> if no DIT
-   *          content rule is registered with the provided objectclass.
-   */
-  public DITContentRule getDITContentRule(ObjectClass objectClass)
-  {
-    assert debugEnter(CLASS_NAME, "getDITContentRule",
-                      String.valueOf(objectClass));
-
-    return ditContentRules.get(objectClass);
-  }
-
-
-
-  /**
-   * Registers the provided DIT content rule definition with this schema.
-   *
-   * @param  ditContentRule     The DIT content rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another DIT content rule with the same
-   *                            objectclass).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerDITContentRule(DITContentRule ditContentRule,
-                                     boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerDITContentRule",
-                      String.valueOf(ditContentRule),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (ditContentRules)
-    {
-      ObjectClass objectClass = ditContentRule.getStructuralClass();
-
-      if (! overwriteExisting)
-      {
-        if (ditContentRules.containsKey(objectClass))
-        {
-          DITContentRule conflictingRule = ditContentRules.get(objectClass);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_DIT_CONTENT_RULE;
-          String message = getMessage(msgID, ditContentRule.getName(),
-                                      objectClass.getNameOrOID(),
-                                      conflictingRule.getName());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-      }
-
-      ditContentRules.put(objectClass, ditContentRule);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = ditContentRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      ditContentRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided DIT content rule definition with this schema.
-   *
-   * @param  ditContentRule  The DIT content rule to deregister with this
-   *                         schema.
-   */
-  public void deregisterDITContentRule(DITContentRule ditContentRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterDITContentRule",
-                      String.valueOf(ditContentRule));
-
-    synchronized (ditContentRules)
-    {
-      ditContentRules.remove(ditContentRule.getStructuralClass(),
-                             ditContentRule);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = ditContentRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      ditContentRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the set of defined DIT structure rules for this schema.
-   *
-   * @return  The set of defined DIT structure rules for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getDITStructureRuleSet()
-  {
-    assert debugEnter(CLASS_NAME, "getDITStructureRuleSet");
-
-    return ditStructureRuleSet;
-  }
-
-
-
-  /**
-   * Retrieves the DIT structure rule definitions for this schema, as a mapping
-   * between the rule ID for the rule and the DIT structure rule itself.  Each
-   * DIT structure rule should only be present once, since its only key is its
-   * rule ID.  The contents of the returned mapping must not be altered.
-   *
-   * @return  The DIT structure rule definitions for this schema.
-   */
-  public ConcurrentHashMap<Integer,DITStructureRule>
-              getDITStructureRulesByID()
-  {
-    assert debugEnter(CLASS_NAME, "getDITStructureRulesByID");
-
-    return ditStructureRulesByID;
-  }
-
-
-
-  /**
-   * Retrieves the DIT structure rule definitions for this schema, as a mapping
-   * between the name form for the rule and the DIT structure rule itself.  Each
-   * DIT structure rule should only be present once, since its only key is its
-   * name form.  The contents of the returned mapping must not be altered.
-   *
-   * @return  The DIT structure rule definitions for this schema.
-   */
-  public ConcurrentHashMap<NameForm,DITStructureRule>
-              getDITStructureRulesByNameForm()
-  {
-    assert debugEnter(CLASS_NAME, "getDITStructureRulesByNameForm");
-
-    return ditStructureRulesByNameForm;
-  }
-
-
-
-  /**
-   * Retrieves the DIT structure rule definition with the provided rule ID.
-   *
-   * @param  ruleID  The rule ID for the DIT structure rule to retrieve.
-   *
-   * @return  The requested DIT structure rule, or <CODE>null</CODE> if no DIT
-   *          structure rule is registered with the provided rule ID.
-   */
-  public DITStructureRule getDITStructureRule(int ruleID)
-  {
-    assert debugEnter(CLASS_NAME, "getDITStructureRule",
-                      String.valueOf(ruleID));
-
-    return ditStructureRulesByID.get(ruleID);
-  }
-
-
-
-  /**
-   * Retrieves the DIT structure rule definition for the provided name form.
-   *
-   * @param  nameForm  The name form for the DIT structure rule to retrieve.
-   *
-   * @return  The requested DIT structure rule, or <CODE>null</CODE> if no DIT
-   *          structure rule is registered with the provided name form.
-   */
-  public DITStructureRule getDITStructureRule(NameForm nameForm)
-  {
-    assert debugEnter(CLASS_NAME, "getDITStructureRule",
-                      String.valueOf(nameForm));
-
-    return ditStructureRulesByNameForm.get(nameForm);
-  }
-
-
-
-  /**
-   * Registers the provided DIT structure rule definition with this schema.
-   *
-   * @param  ditStructureRule   The DIT structure rule to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another DIT structure rule with the same name
-   *                            form).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerDITStructureRule(DITStructureRule ditStructureRule,
-                                       boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "ditStructureRule",
-                      String.valueOf(ditStructureRule),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (ditStructureRulesByNameForm)
-    {
-      NameForm nameForm = ditStructureRule.getNameForm();
-      int      ruleID   = ditStructureRule.getRuleID();
-
-      if (! overwriteExisting)
-      {
-        if (ditStructureRulesByNameForm.containsKey(nameForm))
-        {
-          DITStructureRule conflictingRule =
-               ditStructureRulesByNameForm.get(nameForm);
-
-          int msgID = MSGID_SCHEMA_CONFLICTING_DIT_STRUCTURE_RULE_NAME_FORM;
-          String message = getMessage(msgID, ditStructureRule.getNameOrRuleID(),
-                                      nameForm.getNameOrOID(),
-                                      conflictingRule.getNameOrRuleID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        if (ditStructureRulesByID.containsKey(ruleID))
-        {
-          DITStructureRule conflictingRule = ditStructureRulesByID.get(ruleID);
-
-          int msgID = MSGID_SCHEMA_CONFLICTING_DIT_STRUCTURE_RULE_ID;
-          String message = getMessage(msgID, ditStructureRule.getNameOrRuleID(),
-                                      ruleID,
-                                      conflictingRule.getNameOrRuleID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-      }
-
-      ditStructureRulesByNameForm.put(nameForm, ditStructureRule);
-      ditStructureRulesByID.put(ruleID, ditStructureRule);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = ditStructureRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      ditStructureRuleSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided DIT structure rule definition with this schema.
-   *
-   * @param  ditStructureRule  The DIT structure rule to deregister with this
-   *                           schema.
-   */
-  public void deregisterDITStructureRule(DITStructureRule ditStructureRule)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterDITStructureRule",
-                      String.valueOf(ditStructureRule));
-
-    synchronized (ditStructureRulesByNameForm)
-    {
-      ditStructureRulesByNameForm.remove(ditStructureRule.getNameForm(),
-                               ditStructureRule);
-      ditStructureRulesByID.remove(ditStructureRule.getRuleID(),
-                                   ditStructureRule);
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = ditStructureRule.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      ditStructureRuleSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Retrieves the set of defined name forms for this schema.
-   *
-   * @return  The set of defined name forms for this schema.
-   */
-  public LinkedHashSet<AttributeValue> getNameFormSet()
-  {
-    assert debugEnter(CLASS_NAME, "getNameFormSet");
-
-    return nameFormSet;
-  }
-
-
-
-  /**
-   * Retrieves the name form definitions for this schema, as a mapping between
-   * the objectclass for the name form and the name form itself.  Each name form
-   * should only be present once, since its only key is its objectclass.  The
-   * contents of the returned mapping must not be altered.
-   *
-   * @return  The name form definitions for this schema.
-   */
-  public ConcurrentHashMap<ObjectClass,NameForm> getNameFormsByObjectClass()
-  {
-    assert debugEnter(CLASS_NAME, "getNameForms");
-
-    return nameFormsByOC;
-  }
-
-
-
-  /**
-   * Retrieves the name form definitions for this schema, as a mapping between
-   * the names/OID for the name form and the name form itself.  Each name form
-   * may be present multiple times with different names and its OID.  The
-   * contents of the returned mapping must not be altered.
-   *
-   * @return  The name form definitions for this schema.
-   */
-  public ConcurrentHashMap<String,NameForm> getNameFormsByNameOrOID()
-  {
-    assert debugEnter(CLASS_NAME, "getNameForms");
-
-    return nameFormsByName;
-  }
-
-
-
-  /**
-   * Retrieves the name form definition for the specified objectclass.
-   *
-   * @param  objectClass  The objectclass for the name form to retrieve.
-   *
-   * @return  The requested name form, or <CODE>null</CODE> if no name form is
-   *          registered with the provided objectClass.
-   */
-  public NameForm getNameForm(ObjectClass objectClass)
-  {
-    assert debugEnter(CLASS_NAME, "getNameForm", String.valueOf(objectClass));
-
-    return nameFormsByOC.get(objectClass);
-  }
-
-
-
-  /**
-   * Retrieves the name form definition with the provided name or OID.
-   *
-   * @param  lowerName  The name or OID of the name form to retrieve, formatted
-   *                    in all lowercase characters.
-   *
-   * @return  The requested name form, or <CODE>null</CODE> if no name form is
-   *          registered with the provided name or OID.
-   */
-  public NameForm getNameForm(String lowerName)
-  {
-    assert debugEnter(CLASS_NAME, "getNameForm", String.valueOf(lowerName));
-
-    return nameFormsByName.get(lowerName);
-  }
-
-
-
-  /**
-   * Registers the provided name form definition with this schema.
-   *
-   * @param  nameForm           The name form definition to register.
-   * @param  overwriteExisting  Indicates whether to overwrite an existing
-   *                            mapping if there are any conflicts (i.e.,
-   *                            another name form with the same objectclass).
-   *
-   * @throws  DirectoryException  If a conflict is encountered and the
-   *                              <CODE>overwriteExisting</CODE> flag is set to
-   *                              <CODE>false</CODE>
-   */
-  public void registerNameForm(NameForm nameForm, boolean overwriteExisting)
-         throws DirectoryException
-  {
-    assert debugEnter(CLASS_NAME, "registerNameForm", String.valueOf(nameForm),
-                      String.valueOf(overwriteExisting));
-
-    synchronized (nameFormsByOC)
-    {
-      ObjectClass objectClass = nameForm.getStructuralClass();
-
-      if (! overwriteExisting)
-      {
-        if (nameFormsByOC.containsKey(objectClass))
-        {
-          NameForm conflictingNameForm = nameFormsByOC.get(objectClass);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_OC;
-          String message = getMessage(msgID, nameForm.getNameOrOID(),
-                                      objectClass.getNameOrOID(),
-                                      conflictingNameForm.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        String oid = toLowerCase(nameForm.getOID());
-        if (nameFormsByName.containsKey(oid))
-        {
-          NameForm conflictingNameForm = nameFormsByName.get(oid);
-
-          int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_OID;
-          String message = getMessage(msgID, nameForm.getNameOrOID(), oid,
-                                      conflictingNameForm.getNameOrOID());
-          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
-                                       msgID);
-        }
-
-        for (String name : nameForm.getNames().keySet())
-        {
-          if (nameFormsByName.containsKey(name))
-          {
-            NameForm conflictingNameForm = nameFormsByName.get(name);
-
-            int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_NAME;
-            String message = getMessage(msgID, nameForm.getNameOrOID(), oid,
-                                        conflictingNameForm.getNameOrOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message, msgID);
-          }
-        }
-      }
-
-      nameFormsByOC.put(objectClass, nameForm);
-      nameFormsByName.put(toLowerCase(nameForm.getOID()), nameForm);
-
-      for (String name : nameForm.getNames().keySet())
-      {
-        nameFormsByName.put(name, nameForm);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = nameForm.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      nameFormSet.add(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Deregisters the provided name form definition with this schema.
-   *
-   * @param  nameForm  The name form definition to deregister.
-   */
-  public void deregisterNameForm(NameForm nameForm)
-  {
-    assert debugEnter(CLASS_NAME, "deregisterNameForm",
-                      String.valueOf(nameForm));
-
-    synchronized (nameFormsByOC)
-    {
-      nameFormsByOC.remove(nameForm.getStructuralClass(), nameForm);
-      nameFormsByName.remove(toLowerCase(nameForm.getOID()), nameForm);
-
-      for (String name : nameForm.getNames().keySet())
-      {
-        nameFormsByName.remove(name, nameForm);
-      }
-
-      // We'll use an attribute value including the normalized value rather than
-      // the attribute type because otherwise it would use a very expensive
-      // matching rule (OID first component match) that would kill performance.
-      String valueString = nameForm.toString();
-      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
-      ASN1OctetString normValue =
-           new ASN1OctetString(toLowerCase(valueString));
-      nameFormSet.remove(new AttributeValue(rawValue, normValue));
-    }
-  }
-
-
-
-  /**
-   * Creates a new <CODE>Schema</CODE> object that is a duplicate of this one.
-   * It elements may be added and removed from the duplicate without impacting
-   * this version.
-   *
-   * @return  A new <CODE>Schema</CODE> object that is a duplicate of this one.
-   */
-  public Schema duplicate()
-  {
-    assert debugEnter(CLASS_NAME, "duplicate");
-
-    Schema dupSchema = new Schema();
-
-    dupSchema.attributeTypes.putAll(attributeTypes);
-    dupSchema.objectClasses.putAll(objectClasses);
-    dupSchema.syntaxes.putAll(syntaxes);
-    dupSchema.matchingRules.putAll(matchingRules);
-    dupSchema.approximateMatchingRules.putAll(approximateMatchingRules);
-    dupSchema.equalityMatchingRules.putAll(equalityMatchingRules);
-    dupSchema.orderingMatchingRules.putAll(orderingMatchingRules);
-    dupSchema.substringMatchingRules.putAll(substringMatchingRules);
-    dupSchema.matchingRuleUses.putAll(matchingRuleUses);
-    dupSchema.ditContentRules.putAll(ditContentRules);
-    dupSchema.ditStructureRulesByID.putAll(ditStructureRulesByID);
-    dupSchema.ditStructureRulesByNameForm.putAll(ditStructureRulesByNameForm);
-    dupSchema.nameFormsByOC.putAll(nameFormsByOC);
-    dupSchema.nameFormsByName.putAll(nameFormsByName);
-    dupSchema.syntaxSet.addAll(syntaxSet);
-    dupSchema.attributeTypeSet.addAll(attributeTypeSet);
-    dupSchema.ditContentRuleSet.addAll(ditContentRuleSet);
-    dupSchema.ditStructureRuleSet.addAll(ditStructureRuleSet);
-    dupSchema.matchingRuleSet.addAll(matchingRuleSet);
-    dupSchema.matchingRuleUseSet.addAll(matchingRuleUseSet);
-    dupSchema.nameFormSet.addAll(nameFormSet);
-    dupSchema.objectClassSet.addAll(objectClassSet);
-
-    return dupSchema;
-  }
-}
-
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SchemaConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/SchemaConfigManager.java
index 6bf0144..6aed6a0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SchemaConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SchemaConfigManager.java
@@ -53,17 +53,20 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DITContentRule;
 import org.opends.server.types.DITStructureRule;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.MatchingRuleUse;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 import org.opends.server.util.LDIFReader;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
index 5e8657f..fbc7ff1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
@@ -55,15 +55,26 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelledOperationException;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchResultReference;
 import org.opends.server.types.SearchScope;
+import org.opends.server.types.operation.PostOperationSearchOperation;
+import org.opends.server.types.operation.PostResponseSearchOperation;
+import org.opends.server.types.operation.PreOperationSearchOperation;
+import org.opends.server.types.operation.PreParseSearchOperation;
+import org.opends.server.types.operation.SearchEntrySearchOperation;
+import org.opends.server.types.operation.SearchReferenceSearchOperation;
 import org.opends.server.util.TimeThread;
 
 import static org.opends.server.core.CoreConstants.*;
@@ -82,6 +93,9 @@
  */
 public class SearchOperation
        extends Operation
+       implements PreParseSearchOperation, PreOperationSearchOperation,
+                  PostOperationSearchOperation, PostResponseSearchOperation,
+                  SearchEntrySearchOperation, SearchReferenceSearchOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -219,7 +233,15 @@
     this.timeLimit   = timeLimit;
     this.typesOnly   = typesOnly;
     this.rawFilter   = rawFilter;
-    this.attributes  = attributes;
+
+    if (attributes == null)
+    {
+      this.attributes  = new LinkedHashSet<String>(0);
+    }
+    else
+    {
+      this.attributes  = attributes;
+    }
 
 
     if (clientConnection.getSizeLimit() <= 0)
@@ -324,7 +346,15 @@
     this.timeLimit   = timeLimit;
     this.typesOnly   = typesOnly;
     this.filter      = filter;
-    this.attributes  = attributes;
+
+    if (attributes == null)
+    {
+      this.attributes = new LinkedHashSet<String>(0);
+    }
+    else
+    {
+      this.attributes  = attributes;
+    }
 
     rawBaseDN = new ASN1OctetString(baseDN.toString());
     rawFilter = new LDAPFilter(filter);
@@ -386,7 +416,7 @@
    * @return  The raw, unprocessed base DN as included in the request from the
    *          client.
    */
-  public ByteString getRawBaseDN()
+  public final ByteString getRawBaseDN()
   {
     assert debugEnter(CLASS_NAME, "getRawBaseDN");
 
@@ -397,14 +427,12 @@
 
   /**
    * Specifies the raw, unprocessed base DN as included in the request from the
-   * client.  This method should only be called by pre-parse plugins.  Any other
-   * code that wishes to alter the base DN should use the <CODE>setBaseDN</CODE>
-   * method instead.
+   * client.  This method should only be called by pre-parse plugins.
    *
    * @param  rawBaseDN  The raw, unprocessed base DN as included in the request
    *                    from the client.
    */
-  public void setRawBaseDN(ByteString rawBaseDN)
+  public final void setRawBaseDN(ByteString rawBaseDN)
   {
     assert debugEnter(CLASS_NAME, "setRawBaseDN", String.valueOf(rawBaseDN));
 
@@ -423,7 +451,7 @@
    * @return  The base DN for this search operation, or <CODE>null</CODE> if the
    *          raw base DN has not yet been processed.
    */
-  public DN getBaseDN()
+  public final DN getBaseDN()
   {
     assert debugEnter(CLASS_NAME, "getBaseDN");
 
@@ -433,13 +461,12 @@
 
 
   /**
-   * Specifies the base DN for this search operation.  This should not be called
-   * by pre-parse plugins, which should use the <CODE>setRawBaseDN</CODE> method
-   * instead.
+   * Specifies the base DN for this search operation.  This method is only
+   * intended for internal use.
    *
    * @param  baseDN  The base DN for this search operation.
    */
-  public void setBaseDN(DN baseDN)
+  public final void setBaseDN(DN baseDN)
   {
     assert debugEnter(CLASS_NAME, "setBaseDN", String.valueOf(baseDN));
 
@@ -453,7 +480,7 @@
    *
    * @return  The scope for this search operation.
    */
-  public SearchScope getScope()
+  public final SearchScope getScope()
   {
     assert debugEnter(CLASS_NAME, "getScope");
 
@@ -463,11 +490,12 @@
 
 
   /**
-   * Specifies the scope for this search operation.
+   * Specifies the scope for this search operation.  This should only be called
+   * by pre-parse plugins.
    *
    * @param  scope  The scope for this search operation.
    */
-  public void setScope(SearchScope scope)
+  public final void setScope(SearchScope scope)
   {
     assert debugEnter(CLASS_NAME, "setScope", String.valueOf(scope));
 
@@ -481,7 +509,7 @@
    *
    * @return  The alias dereferencing policy for this search operation.
    */
-  public DereferencePolicy getDerefPolicy()
+  public final DereferencePolicy getDerefPolicy()
   {
     assert debugEnter(CLASS_NAME, "getDerefPolicy");
 
@@ -491,12 +519,13 @@
 
 
   /**
-   * Specifies the alias dereferencing policy for this search operation.
+   * Specifies the alias dereferencing policy for this search operation.  This
+   * should only be called by pre-parse plugins.
    *
    * @param  derefPolicy  The alias dereferencing policy for this search
    *                      operation.
    */
-  public void setDerefPolicy(DereferencePolicy derefPolicy)
+  public final void setDerefPolicy(DereferencePolicy derefPolicy)
   {
     assert debugEnter(CLASS_NAME, "setDerefPolicy",
                       String.valueOf(derefPolicy));
@@ -511,7 +540,7 @@
    *
    * @return  The size limit for this search operation.
    */
-  public int getSizeLimit()
+  public final int getSizeLimit()
   {
     assert debugEnter(CLASS_NAME, "getSizeLimit");
 
@@ -521,11 +550,12 @@
 
 
   /**
-   * Specifies the size limit for this search operation.
+   * Specifies the size limit for this search operation.  This should only be
+   * called by pre-parse plugins.
    *
    * @param  sizeLimit  The size limit for this search operation.
    */
-  public void setSizeLimit(int sizeLimit)
+  public final void setSizeLimit(int sizeLimit)
   {
     assert debugEnter(CLASS_NAME, "setSizeLimit", String.valueOf(sizeLimit));
 
@@ -539,7 +569,7 @@
    *
    * @return  The time limit for this search operation.
    */
-  public int getTimeLimit()
+  public final int getTimeLimit()
   {
     assert debugEnter(CLASS_NAME, "getTimeLimit");
 
@@ -549,11 +579,12 @@
 
 
   /**
-   * Specifies the time limit for this search operation.
+   * Specifies the time limit for this search operation.  This should only be
+   * called by pre-parse plugins.
    *
    * @param  timeLimit  The time limit for this search operation.
    */
-  public void setTimeLimit(int timeLimit)
+  public final void setTimeLimit(int timeLimit)
   {
     assert debugEnter(CLASS_NAME, "setTimeLimit", String.valueOf(timeLimit));
 
@@ -567,7 +598,7 @@
    *
    * @return  The typesOnly flag for this search operation.
    */
-  public boolean getTypesOnly()
+  public final boolean getTypesOnly()
   {
     assert debugEnter(CLASS_NAME, "getTypesOnly");
 
@@ -577,11 +608,12 @@
 
 
   /**
-   * Specifies the typesOnly flag for this search operation.
+   * Specifies the typesOnly flag for this search operation.  This should only
+   * be called by pre-parse plugins.
    *
    * @param  typesOnly  The typesOnly flag for this search operation.
    */
-  public void setTypesOnly(boolean typesOnly)
+  public final void setTypesOnly(boolean typesOnly)
   {
     assert debugEnter(CLASS_NAME, "setTypesOnly", String.valueOf(typesOnly));
 
@@ -599,7 +631,7 @@
    * @return  The raw, unprocessed search filter as included in the request from
    *          the client.
    */
-  public LDAPFilter getRawFilter()
+  public final LDAPFilter getRawFilter()
   {
     assert debugEnter(CLASS_NAME, "getRawFilter");
 
@@ -611,13 +643,11 @@
   /**
    * Specifies the raw, unprocessed search filter as included in the request
    * from the client.  This method should only be called by pre-parse plugins.
-   * All later processing that wishes to change the filter should use the
-   * <CODE>setFilter</CODE> method instead.
    *
    * @param  rawFilter  The raw, unprocessed search filter as included in the
    *                    request from the client.
    */
-  public void setRawFilter(LDAPFilter rawFilter)
+  public final void setRawFilter(LDAPFilter rawFilter)
   {
     assert debugEnter(CLASS_NAME, "setRawFilter", String.valueOf(rawFilter));
 
@@ -631,12 +661,12 @@
   /**
    * Retrieves the filter for this search operation.  This should not be called
    * by pre-parse plugins, because the raw filter will not yet have been
-   * processed.  Instead, they should use the <CODE>getRawFilter</CODE> method.
+   * processed.
    *
    * @return  The filter for this search operation, or <CODE>null</CODE> if the
    *          raw filter has not yet been processed.
    */
-  public SearchFilter getFilter()
+  public final SearchFilter getFilter()
   {
     assert debugEnter(CLASS_NAME, "getFilter");
 
@@ -646,32 +676,40 @@
 
 
   /**
-   * Specifies the filter for this search operation.  This should not be called
-   * by pre-parse plugins, which should instead use the
-   * <CODE>setRawFilter</CODE> method.
+   * Retrieves the set of requested attributes for this search operation.  Its
+   * contents should not be be altered.
    *
-   * @param  filter  The filter for this search operation.
+   * @return  The set of requested attributes for this search operation.
    */
-  public void setFilter(SearchFilter filter)
+  public final LinkedHashSet<String> getAttributes()
   {
-    assert debugEnter(CLASS_NAME, "setFilter", String.valueOf(filter));
+    assert debugEnter(CLASS_NAME, "getAttributes");
 
-    this.filter = filter;
+    return attributes;
   }
 
 
 
   /**
-   * Retrieves the set of requested attributes for this search operation.  Its
-   * contents may be altered in pre-parse or pre-operation plugins.
+   * Specifies the set of requested attributes for this search operation.  It
+   * should only be called by pre-parse plugins.
    *
-   * @return  The set of requested attributes for this search operation.
+   * @param  attributes  The set of requested attributes for this search
+   *                     operation.
    */
-  public LinkedHashSet<String> getAttributes()
+  public final void setAttributes(LinkedHashSet<String> attributes)
   {
-    assert debugEnter(CLASS_NAME, "getAttributes");
+    assert debugEnter(CLASS_NAME, "setAttributes",
+                      String.valueOf(attributes));
 
-    return attributes;
+    if (attributes == null)
+    {
+      this.attributes.clear();
+    }
+    else
+    {
+      this.attributes = attributes;
+    }
   }
 
 
@@ -683,7 +721,7 @@
    * @return  The number of entries sent to the client for this search
    *          operation.
    */
-  public int getEntriesSent()
+  public final int getEntriesSent()
   {
     assert debugEnter(CLASS_NAME, "getEntriesSent");
 
@@ -699,7 +737,7 @@
    * @return  The number of search references sent to the client for this search
    *          operation.
    */
-  public int getReferencesSent()
+  public final int getReferencesSent()
   {
     assert debugEnter(CLASS_NAME, "getReferencesSent");
 
@@ -709,11 +747,10 @@
 
 
   /**
-   * Retrieves the time that processing started for this operation.
-   *
-   * @return  The time that processing started for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStartTime()
+  @Override()
+  public final long getProcessingStartTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStartTime");
 
@@ -723,13 +760,10 @@
 
 
   /**
-   * Retrieves the time that processing stopped for this operation.  This will
-   * actually hold a time immediately before the response was sent to the
-   * client.
-   *
-   * @return  The time that processing stopped for this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingStopTime()
+  @Override()
+  public final long getProcessingStopTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingStopTime");
 
@@ -739,14 +773,10 @@
 
 
   /**
-   * Retrieves the length of time in milliseconds that the server spent
-   * processing this operation.  This should not be called until after the
-   * server has sent the response to the client.
-   *
-   * @return  The length of time in milliseconds that the server spent
-   *          processing this operation.
+   * {@inheritDoc}
    */
-  public long getProcessingTime()
+  @Override()
+  public final long getProcessingTime()
   {
     assert debugEnter(CLASS_NAME, "getProcessingTime");
 
@@ -770,7 +800,7 @@
    *          <CODE>false</CODE> if not for some reason (e.g., the size limit
    *          has been reached or the search has been abandoned).
    */
-  public boolean returnEntry(Entry entry, List<Control> controls)
+  public final boolean returnEntry(Entry entry, List<Control> controls)
   {
     assert debugEnter(CLASS_NAME, "returnEntry", String.valueOf(entry));
 
@@ -1227,7 +1257,7 @@
    *          <CODE>false</CODE> if not for some reason (e.g., the size limit
    *          has been reached or the search has been abandoned).
    */
-  public boolean returnReference(SearchResultReference reference)
+  public final boolean returnReference(SearchResultReference reference)
   {
     assert debugEnter(CLASS_NAME, "returnReference", String.valueOf(reference));
 
@@ -1319,7 +1349,7 @@
    * message should have been set for this operation before this method is
    * called.
    */
-  public void sendSearchResultDone()
+  public final void sendSearchResultDone()
   {
     assert debugEnter(CLASS_NAME, "sendSearchResultDone");
 
@@ -1345,11 +1375,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -1360,16 +1389,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -1408,16 +1431,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -1486,13 +1503,10 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
@@ -1502,12 +1516,32 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    responseControls.add(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    responseControls.remove(control);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -2093,7 +2127,7 @@
    *                                       to a request to cancel or abandon the
    *                                       search operation.
    */
-  private void searchBackend(Backend backend)
+  private final void searchBackend(Backend backend)
           throws DirectoryException, CancelledOperationException
   {
     assert debugEnter(CLASS_NAME, "searchBackend", String.valueOf(backend));
@@ -2132,14 +2166,10 @@
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -2183,13 +2213,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -2199,12 +2226,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SimpleSubtreeSpecification.java b/opendj-sdk/opends/src/server/org/opends/server/core/SimpleSubtreeSpecification.java
index 03ac650..cfb7673 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SimpleSubtreeSpecification.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SimpleSubtreeSpecification.java
@@ -37,6 +37,7 @@
 import java.util.regex.Pattern;
 
 import org.opends.server.api.SubtreeSpecification;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.util.StaticUtils;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
index 76ff68f..a5c60b7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
@@ -43,6 +43,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
index 0562db7..50fa8d3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
@@ -39,9 +39,11 @@
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.extensions.NullTrustManagerProvider;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/UnbindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/UnbindOperation.java
index e55bc4a..60c8693 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/UnbindOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/UnbindOperation.java
@@ -32,8 +32,13 @@
 import java.util.List;
 
 import org.opends.server.api.ClientConnection;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.operation.PostOperationUnbindOperation;
+import org.opends.server.types.operation.PreParseUnbindOperation;
 
 import static org.opends.server.loggers.Access.*;
 import static org.opends.server.loggers.Debug.*;
@@ -48,6 +53,7 @@
  */
 public class UnbindOperation
        extends Operation
+       implements PreParseUnbindOperation, PostOperationUnbindOperation
 {
   /**
    * The fully-qualified name of this class for debugging purposes.
@@ -57,6 +63,14 @@
 
 
 
+  // The time that processing started on this operation.
+  private long processingStartTime;
+
+  // The time that processing ended on this operation.
+  private long processingStopTime;
+
+
+
   /**
    * Creates a new unbind operation with the provided information.
    *
@@ -81,11 +95,10 @@
 
 
   /**
-   * Retrieves the operation type for this operation.
-   *
-   * @return  The operation type for this operation.
+   * {@inheritDoc}
    */
-  public OperationType getOperationType()
+  @Override()
+  public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -96,16 +109,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in requests for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in requests for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getRequestLogElements()
+  @Override()
+  public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -118,16 +125,10 @@
 
 
   /**
-   * Retrieves a standard set of elements that should be logged in responses for
-   * this type of operation.  Each element in the array will itself be a
-   * two-element array in which the first element is the name of the field and
-   * the second is a string representation of the value, or <CODE>null</CODE> if
-   * there is no value for that field.
-   *
-   * @return  A standard set of elements that should be logged in responses for
-   *          this type of operation.
+   * {@inheritDoc}
    */
-  public String[][] getResponseLogElements()
+  @Override()
+  public final String[][] getResponseLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
     // candidate for being called by the logging subsystem.
@@ -140,19 +141,14 @@
 
 
   /**
-   * Retrieves the set of controls to include in the response to the client.
-   * Note that the contents of this list should not be altered after
-   * post-operation plugins have been called.  Note that unbind operations
-   * must never have an associated response, so this method will not be used for
-   * this type of operation.
-   *
-   * @return  The set of controls to include in the response to the client.
+   * {@inheritDoc}
    */
-  public List<Control> getResponseControls()
+  @Override()
+  public final List<Control> getResponseControls()
   {
     assert debugEnter(CLASS_NAME, "getResponseControls");
 
-    // An abandon operation can never have a response, so just return an empty
+    // An unbind operation can never have a response, so just return an empty
     // list.
     return NO_RESPONSE_CONTROLS;
   }
@@ -160,12 +156,71 @@
 
 
   /**
-   * Performs the work of actually processing this operation.  This should
-   * include all processing for the operation, including invoking plugins,
-   * logging messages, performing access control, managing synchronization, and
-   * any other work that might need to be done in the course of processing.
+   * {@inheritDoc}
    */
-  public void run()
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    // An unbind operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    // An unbind operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public long getProcessingStartTime()
+  {
+    assert debugEnter(CLASS_NAME, "getProcessingStartTime");
+
+    return processingStartTime;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public long getProcessingStopTime()
+  {
+    assert debugEnter(CLASS_NAME, "getProcessingStopTime");
+
+    return processingStopTime;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public long getProcessingTime()
+  {
+    assert debugEnter(CLASS_NAME, "getProcessingTime");
+
+    return (processingStopTime - processingStartTime);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void run()
   {
     assert debugEnter(CLASS_NAME, "run");
 
@@ -175,6 +230,8 @@
          DirectoryServer.getPluginConfigManager();
     boolean skipPostOperation = false;
 
+    processingStartTime = System.currentTimeMillis();
+
 
     // Invoke the pre-parse unbind plugins.  We don't care about the result
     // since we're going to close the connection anyway.
@@ -196,21 +253,17 @@
 
     // Invoke the post-operation unbind plugins.
     pluginConfigManager.invokePostOperationUnbindPlugins(this);
+
+    processingStopTime = System.currentTimeMillis();
   }
 
 
 
   /**
-   * Attempts to cancel this operation before processing has completed.  Note
-   * that an unbind operation may not be canceled, so this should never do
-   * anything.
-   *
-   * @param  cancelRequest  Information about the way in which the operation
-   *                        should be canceled.
-   *
-   * @return  A code providing information on the result of the cancellation.
+   * {@inheritDoc}
    */
-  public CancelResult cancel(CancelRequest cancelRequest)
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
   {
     assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest));
 
@@ -221,14 +274,10 @@
 
 
   /**
-   * Retrieves the cancel request that has been issued for this operation, if
-   * there is one.  Note that an unbind operation may not be canceled, so this
-   * will always return <CODE>null</CODE>.
-   *
-   * @return  The cancel request that has been issued for this operation, or
-   *          <CODE>null</CODE> if there has not been any request to cancel.
+   * {@inheritDoc}
    */
-  public CancelRequest getCancelRequest()
+  @Override()
+  public final CancelRequest getCancelRequest()
   {
     assert debugEnter(CLASS_NAME, "getCancelRequest");
 
@@ -238,12 +287,10 @@
 
 
   /**
-   * Appends a string representation of this operation to the provided buffer.
-   *
-   * @param  buffer  The buffer into which a string representation of this
-   *                 operation should be appended.
+   * {@inheritDoc}
    */
-  public void toString(StringBuilder buffer)
+  @Override()
+  public final void toString(StringBuilder buffer)
   {
     assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/AnonymousSASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/AnonymousSASLMechanismHandler.java
index 5e63caa..f6333dd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/AnonymousSASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/AnonymousSASLMechanismHandler.java
@@ -33,11 +33,11 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.BindOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/Base64PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/Base64PasswordStorageScheme.java
index 4fabf5b..49230ba 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/Base64PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/Base64PasswordStorageScheme.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/BlindTrustManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/BlindTrustManagerProvider.java
index 51a5724..723517d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/BlindTrustManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/BlindTrustManagerProvider.java
@@ -35,8 +35,8 @@
 import org.opends.server.api.TrustManagerProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.ExtensionsMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
index a7ffba7..5d1e990 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
@@ -47,17 +47,17 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java
index 0e5e3b8..7517a25 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java
@@ -32,13 +32,13 @@
 import org.opends.server.api.ExtendedOperationHandler;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1Sequence;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/ClearPasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/ClearPasswordStorageScheme.java
index 0483547..69e5f28 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/ClearPasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/ClearPasswordStorageScheme.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.extensions.ExtensionsConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
index 3a696ce..06cacca 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
@@ -35,9 +35,9 @@
 import org.opends.server.api.EntryCache;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LockType;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java
index 121d6e9..db68ea0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java
@@ -52,20 +52,20 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
index 9286f4f..4239bd7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandler.java
@@ -40,12 +40,12 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.MultiChoiceConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AccountStatusNotificationType;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/ExactMatchIdentityMapper.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/ExactMatchIdentityMapper.java
index 3630c2a..666523d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/ExactMatchIdentityMapper.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/ExactMatchIdentityMapper.java
@@ -42,9 +42,7 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
@@ -52,8 +50,10 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchScope;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/ExternalSASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/ExternalSASLMechanismHandler.java
index 440ce3e..226993d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/ExternalSASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/ExternalSASLMechanismHandler.java
@@ -43,17 +43,17 @@
 import org.opends.server.config.MultiChoiceConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
index f1f97eb..cfd7249 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
@@ -50,14 +50,14 @@
 import org.opends.server.config.IntegerWithUnitConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.types.CacheEntry;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.LockType;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedKeyManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedKeyManagerProvider.java
index 35edb1e..2f0921f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedKeyManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedKeyManagerProvider.java
@@ -48,11 +48,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
index e5477f9..63e71ff 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
@@ -47,11 +47,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPISASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPISASLMechanismHandler.java
index 5e0bb02..1db579c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPISASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPISASLMechanismHandler.java
@@ -46,13 +46,13 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPIStateInfo.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPIStateInfo.java
index a92c71c..2234c3e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPIStateInfo.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/GSSAPIStateInfo.java
@@ -42,13 +42,13 @@
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/InternalConnectionSecurityProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/InternalConnectionSecurityProvider.java
index f82ac8e..735fc4c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/InternalConnectionSecurityProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/InternalConnectionSecurityProvider.java
@@ -32,7 +32,7 @@
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.ConnectionSecurityProvider;
-import org.opends.server.core.DirectoryException;
+import org.opends.server.types.DirectoryException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/JMXAlertHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/JMXAlertHandler.java
index 9c9889e..f386a88 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/JMXAlertHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/JMXAlertHandler.java
@@ -55,7 +55,7 @@
 import org.opends.server.config.JMXMBean;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DN;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.ConfigMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/LengthBasedPasswordValidator.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/LengthBasedPasswordValidator.java
index c552856..15c76b5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/LengthBasedPasswordValidator.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/LengthBasedPasswordValidator.java
@@ -39,12 +39,12 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.IntegerConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.Operation;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/MD5PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/MD5PasswordStorageScheme.java
index d63876d..d84285e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/MD5PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/MD5PasswordStorageScheme.java
@@ -35,13 +35,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullConnectionSecurityProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullConnectionSecurityProvider.java
index 7e336a3..74e1ab4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullConnectionSecurityProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullConnectionSecurityProvider.java
@@ -36,9 +36,9 @@
 import org.opends.server.api.ConnectionSecurityProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.ExtensionsMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullKeyManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullKeyManagerProvider.java
index 887981a..4088e82 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullKeyManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullKeyManagerProvider.java
@@ -33,8 +33,8 @@
 import org.opends.server.api.KeyManagerProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.ExtensionsMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullTrustManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullTrustManagerProvider.java
index 9de6aff..4d2d429 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/NullTrustManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/NullTrustManagerProvider.java
@@ -33,8 +33,8 @@
 import org.opends.server.api.TrustManagerProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.ExtensionsMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/PKCS11KeyManagerProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/PKCS11KeyManagerProvider.java
index 40c025b..a36e8e5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/PKCS11KeyManagerProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/PKCS11KeyManagerProvider.java
@@ -46,11 +46,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
index fe2278a..664c67c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
@@ -43,11 +43,8 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1Element;
@@ -63,8 +60,11 @@
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
index 33e865d..5d3b2de 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
@@ -41,17 +41,17 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PasswordPolicyState;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/RandomPasswordGenerator.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/RandomPasswordGenerator.java
index 499fa1d..4cb0242 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/RandomPasswordGenerator.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/RandomPasswordGenerator.java
@@ -41,13 +41,13 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.NamedCharacterSet;
 import org.opends.server.types.ResultCode;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SHA1PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SHA1PasswordStorageScheme.java
index f83a28c..f37b4a7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SHA1PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SHA1PasswordStorageScheme.java
@@ -35,13 +35,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java
index d0f40dd..873b592 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedMD5PasswordStorageScheme.java
@@ -36,13 +36,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java
index db90ac2..bec66eb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA1PasswordStorageScheme.java
@@ -36,13 +36,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java
index f0dc5eb..492da2c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA256PasswordStorageScheme.java
@@ -36,13 +36,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java
index 06051ae..dfd5fb5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA384PasswordStorageScheme.java
@@ -36,13 +36,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java
index b5aec83..9412ea5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SaltedSHA512PasswordStorageScheme.java
@@ -36,13 +36,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.util.Base64;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
index 22f6632..5d475e3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -47,14 +47,14 @@
 import org.opends.server.config.IntegerWithUnitConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
 import org.opends.server.types.CacheEntry;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.LockType;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
index bfddb37..6430b65 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
@@ -32,13 +32,13 @@
 import org.opends.server.api.ExtendedOperationHandler;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/SubjectEqualsDNCertificateMapper.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/SubjectEqualsDNCertificateMapper.java
index a757f35..956ac7e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/SubjectEqualsDNCertificateMapper.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/SubjectEqualsDNCertificateMapper.java
@@ -36,12 +36,12 @@
 import org.opends.server.api.CertificateMapper;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.LockManager;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.LockManager;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
index ea06a60..2094d70 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
@@ -28,8 +28,8 @@
 
 
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.Operation;
+import org.opends.server.types.DirectoryException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSConnectionSecurityProvider.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSConnectionSecurityProvider.java
index acd6918..eb1727b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSConnectionSecurityProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSConnectionSecurityProvider.java
@@ -45,10 +45,10 @@
 import org.opends.server.api.TrustManagerProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.SSLClientAuthPolicy;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
index 9e41925..e1f3124 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
@@ -43,16 +43,16 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.IntegerConfigAttribute;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.Operation;
 import org.opends.server.monitors.TraditionalWorkQueueMonitor;
+import org.opends.server.types.CancelRequest;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java
index 1915a6f..6969fe4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java
@@ -29,10 +29,10 @@
 
 
 import org.opends.server.api.DirectoryThread;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.Operation;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
 import org.opends.server.types.DisconnectReason;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/WhoAmIExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/WhoAmIExtendedOperation.java
index e8ea8d0..4008e88 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/WhoAmIExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/WhoAmIExtendedOperation.java
@@ -34,9 +34,9 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AuthenticationInfo;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/loggers/DirectoryFileHandler.java b/opendj-sdk/opends/src/server/org/opends/server/loggers/DirectoryFileHandler.java
index 4b57c04..d3865d9 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/loggers/DirectoryFileHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/loggers/DirectoryFileHandler.java
@@ -40,9 +40,9 @@
 import java.util.logging.LogRecord;
 
 import org.opends.server.api.InvokableComponent;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.config.ConfigAttribute;
 import org.opends.server.config.ConfigEntry;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.InvokableMethod;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/messages/PluginMessages.java b/opendj-sdk/opends/src/server/org/opends/server/messages/PluginMessages.java
index 50773a6..07f38b6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/messages/PluginMessages.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/messages/PluginMessages.java
@@ -769,6 +769,17 @@
 
 
   /**
+   * The message ID for the message that will be used if an attempt is made to
+   * invoke a plugin for a plugin type that it does not support.  This takes
+   * two arguments, which are the DN of the plugin configuration entry and the
+   * name of the unsupported plugin type.
+   */
+  public static final int MSGID_PLUGIN_TYPE_NOT_SUPPORTED =
+       CATEGORY_MASK_PLUGIN | SEVERITY_MASK_SEVERE_ERROR | 67;
+
+
+
+  /**
    * Associates a set of generic messages with the message IDs defined in this
    * class.
    */
@@ -1120,6 +1131,11 @@
                     "An error occurred while attempting to encode a password " +
                     "value stored in attribute %s of user entry %s:  %s.  " +
                     "Password values for this user will not be encoded.");
+
+
+    registerMessage(MSGID_PLUGIN_TYPE_NOT_SUPPORTED,
+                    "The plugin defined in configuration entry %s does not " +
+                    "support the %s plugin type.");
   }
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/monitors/DatabaseEnvironmentMonitor.java b/opendj-sdk/opends/src/server/org/opends/server/monitors/DatabaseEnvironmentMonitor.java
index 96942d3..635d63e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/monitors/DatabaseEnvironmentMonitor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/monitors/DatabaseEnvironmentMonitor.java
@@ -33,11 +33,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.InitializationException;
 
 import com.sleepycat.je.DatabaseException;
 import com.sleepycat.je.Environment;
@@ -101,7 +101,7 @@
    * @throws org.opends.server.config.ConfigException
    *          If an unrecoverable problem arises in the
    *          process of performing the initialization.
-   * @throws org.opends.server.core.InitializationException
+   * @throws org.opends.server.types.InitializationException
    *          If a problem occurs during initialization
    *          that is not related to the server
    *          configuration.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/monitors/StackTraceMonitorProvider.java b/opendj-sdk/opends/src/server/org/opends/server/monitors/StackTraceMonitorProvider.java
index a9b3901..86f6c64 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/monitors/StackTraceMonitorProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/monitors/StackTraceMonitorProvider.java
@@ -36,11 +36,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java b/opendj-sdk/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
index 1dc1787..83ad765 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
@@ -36,11 +36,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/monitors/TraditionalWorkQueueMonitor.java b/opendj-sdk/opends/src/server/org/opends/server/monitors/TraditionalWorkQueueMonitor.java
index a68bf81..89fa8ab 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/monitors/TraditionalWorkQueueMonitor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/monitors/TraditionalWorkQueueMonitor.java
@@ -36,12 +36,12 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.extensions.TraditionalWorkQueue;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/monitors/VersionMonitorProvider.java b/opendj-sdk/opends/src/server/org/opends/server/monitors/VersionMonitorProvider.java
index b628c60..c19a45c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/monitors/VersionMonitorProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/monitors/VersionMonitorProvider.java
@@ -35,11 +35,11 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.DynamicConstants;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java
index 9c35138..33e3435 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java
@@ -42,9 +42,7 @@
 import org.opends.server.api.plugin.PreOperationPluginResult;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AddOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
@@ -52,6 +50,7 @@
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDIFImportConfig;
+import org.opends.server.types.operation.PreOperationAddOperation;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
@@ -62,9 +61,14 @@
 
 /**
  * This class implements a Directory Server plugin that will add the entryUUID
- * attribute to an entry whenever it is added or imported.
+ * attribute to an entry whenever it is added or imported as per RFC 4530.  For
+ * entries added over LDAP, the entryUUID will be based on a semi-random UUID
+ * (which is still guaranteed to be unique).  For entries imported from LDIF,
+ * the UUID will be constructed from the entry DN using a repeatable algorithm.
+ * This will ensure that LDIF files imported in parallel across multiple systems
+ * will have identical entryUUID values.
  */
-public class EntryUUIDPlugin
+public final class EntryUUIDPlugin
        extends DirectoryServerPlugin
 {
   /**
@@ -83,7 +87,7 @@
 
 
   // The attribute type for the "entryUUID" attribute.
-  private AttributeType entryUUIDType;
+  private final AttributeType entryUUIDType;
 
 
 
@@ -98,33 +102,33 @@
     super();
 
     assert debugConstructor(CLASS_NAME);
+
+
+    // Get the entryUUID attribute type.  This needs to be done in the
+    // constructor in order to make the associated variables "final".
+    AttributeType at = DirectoryServer.getAttributeType(ENTRYUUID);
+    if (at == null)
+    {
+      at = new AttributeType(ENTRYUUID, Collections.singleton(ENTRYUUID),
+                             ENTRYUUID, null, null,
+                             DirectoryServer.getDefaultAttributeSyntax(),
+                             AttributeUsage.DIRECTORY_OPERATION, false, true,
+                             false, true);
+    }
+
+    entryUUIDType = at;
   }
 
 
 
   /**
-   * Performs any initialization necessary for this plugin.  This will be called
-   * as soon as the plugin has been loaded and before it is registered with the
-   * server.
-   *
-   * @param  directoryServer  The reference to the Directory Server instance in
-   *                          which the plugin will be running.
-   * @param  pluginTypes      The set of plugin types that indicate the ways in
-   *                          which this plugin will be invoked.
-   * @param  configEntry      The entry containing the configuration information
-   *                          for this plugin.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this plugin.
-   *
-   * @throws  InitializationException  If a problem occurs while initializing
-   *                                   the plugin that is not related to the
-   *                                   server configuration.
+   * {@inheritDoc}
    */
-  public void initializePlugin(DirectoryServer directoryServer,
-                               Set<PluginType> pluginTypes,
-                               ConfigEntry configEntry)
-         throws ConfigException, InitializationException
+  @Override()
+  public final void initializePlugin(DirectoryServer directoryServer,
+                                    Set<PluginType> pluginTypes,
+                                    ConfigEntry configEntry)
+         throws ConfigException
   {
     assert debugEnter(CLASS_NAME, "initializePlugin",
                       String.valueOf(directoryServer),
@@ -149,37 +153,16 @@
           throw new ConfigException(msgID, message);
       }
     }
-
-
-    // Get the entryUUID attribute type.
-    entryUUIDType = DirectoryServer.getAttributeType(ENTRYUUID);
-    if (entryUUIDType == null)
-    {
-      entryUUIDType = new AttributeType(ENTRYUUID,
-          Collections.singleton(ENTRYUUID),
-          ENTRYUUID,
-          null,
-          null,
-          DirectoryServer.getDefaultAttributeSyntax(),
-          AttributeUsage.DIRECTORY_OPERATION,
-          false, true, false, true);
-    }
   }
 
 
 
   /**
-   * Performs any necessary processing that should be done during an LDIF import
-   * operation immediately after reading an entry and confirming that it should
-   * be imported based on the provided configuration.
-   *
-   * @param  importConfig  The configuration used for the LDIF import.
-   * @param  entry         The entry that has been read to the LDIF file.
-   *
-   * @return  The result of the plugin processing.
+   * {@inheritDoc}
    */
-  public LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
-                                       Entry entry)
+  @Override()
+  public final LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
+                                             Entry entry)
   {
     assert debugEnter(CLASS_NAME, "doLDIFImport",
                       String.valueOf(importConfig), String.valueOf(entry));
@@ -217,14 +200,11 @@
 
 
   /**
-   * Performs any necessary processing that should be done just before the
-   * Directory Server performs the core processing for an add operation.
-   *
-   * @param  addOperation  The add operation to be processed.
-   *
-   * @return  Information about the result of the plugin processing.
+   * {@inheritDoc}
    */
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  @Override()
+  public final PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(addOperation));
@@ -252,10 +232,10 @@
     uuidList = new ArrayList<Attribute>(1);
     Attribute uuidAttr = new Attribute(entryUUIDType, "entryUUID", values);
     uuidList.add(uuidAttr);
-    operationalAttributes.put(entryUUIDType, uuidList);
 
 
-    // We shouldn't ever need to return a non-success result.
+    // Add the attribute to the entry and return.
+    addOperation.setAttribute(entryUUIDType, uuidList);
     return new PreOperationPluginResult();
   }
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java
index 2e6f1ff..ef8ad9c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java
@@ -36,27 +36,27 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.SearchOperation;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
 import org.opends.server.types.ObjectClass;
+import org.opends.server.types.operation.PreParseSearchOperation;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.PluginMessages.*;
 import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
 
 
 /**
- *  This pre-parse plugin modifies the operation to allow an object class
+ * This pre-parse plugin modifies the operation to allow an object class
  * identifier to be specified in attributes lists, such as in Search requests,
  * to request the return all attributes belonging to an object class as per the
  * specification in RFC 4529.  The "@" character is used to distinguish an
  * object class identifier from an attribute descriptions.
  */
-public class LDAPADListPlugin
+public final class LDAPADListPlugin
        extends DirectoryServerPlugin
 {
   private static final String CLASS_NAME =
@@ -80,28 +80,13 @@
 
 
   /**
-   * Performs any initialization necessary for this plugin.  This will be called
-   * as soon as the plugin has been loaded and before it is registered with the
-   * server.
-   *
-   * @param  directoryServer  The reference to the Directory Server instance in
-   *                          which the plugin will be running.
-   * @param  pluginTypes      The set of plugin types that indicate the ways in
-   *                          which this plugin will be invoked.
-   * @param  configEntry      The entry containing the configuration information
-   *                          for this plugin.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this plugin.
-   *
-   * @throws  InitializationException  If a problem occurs while initializing
-   *                                   the plugin that is not related to the
-   *                                   server configuration.
+   * {@inheritDoc}
    */
-  public void initializePlugin(DirectoryServer directoryServer,
-                               Set<PluginType> pluginTypes,
-                               ConfigEntry configEntry)
-         throws ConfigException, InitializationException
+  @Override()
+  public final void initializePlugin(DirectoryServer directoryServer,
+                                     Set<PluginType> pluginTypes,
+                                     ConfigEntry configEntry)
+         throws ConfigException
   {
     assert debugEnter(CLASS_NAME, "initializePlugin",
                       String.valueOf(directoryServer),
@@ -138,70 +123,72 @@
 
 
   /**
-   * Performs any necessary processing that should be done before the Directory
-   * Server parses the elements of a search request.
-   *
-   * @param  searchOperation  The search operation that has been requested.
-   *
-   * @return  Information about the result of the plugin processing.
+   * {@inheritDoc}
    */
-  public PreParsePluginResult doPreParse(SearchOperation searchOperation)
+  @Override()
+  public final PreParsePluginResult
+       doPreParse(PreParseSearchOperation searchOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreParseSearch",
           String.valueOf(searchOperation));
 
+
+    // Iterate through the requested attributes to see if any of them start with
+    // an "@" symbol.  If not, then we don't need to do anything.  If so, then
+    // keep track of them.
     LinkedHashSet<String> attributes = searchOperation.getAttributes();
-
-    LinkedHashSet<String> objectClassList = new LinkedHashSet<String> ();
-
-    // Create list of object classes that need to be replaced with attributes.
-    for(String attribute : attributes)
+    boolean foundOC = false;
+    for (String attrName : attributes)
     {
-      // check if it starts with "@". If so add it to the list of object classes
-      if(attribute.startsWith("@"))
+      if (attrName.startsWith("@"))
       {
-        objectClassList.add(attribute);
+        foundOC = true;
+        break;
       }
     }
 
-    // Iterate through list of object classes and replace with attributes.
-    for (String objectClass : objectClassList)
+    if (foundOC)
     {
-      // find object class and get list of attributes.
-      ObjectClass objClass = DirectoryServer.getObjectClass(
-          objectClass.substring(1, objectClass.length()));
-      // remove the object class from the attribute list.
-      attributes.remove(objectClass);
-
-      if(objClass == null)
+      LinkedHashSet<String> newAttrs = new LinkedHashSet<String>();
+      for (String attrName : attributes)
       {
-        // object class not found.
-        assert debugMessage(DebugLogCategory.PLUGIN, DebugLogSeverity.WARNING,
-                        CLASS_NAME, "doPreSearch",
-                        "Invalid object class: " + objectClass);
-      } else
-      {
-        Set<AttributeType> requiredAttributes =
-            objClass.getRequiredAttributeChain();
-        Set<AttributeType> optionalAttributes =
-            objClass.getOptionalAttributeChain();
-
-        // remove attribute and replace with expanded list.
-        assert debugMessage(DebugLogCategory.PLUGIN, DebugLogSeverity.INFO,
-                            CLASS_NAME, "doPreParse",
-                            "Replacing object class " +
-                                 String.valueOf(objClass));
-        for(AttributeType req : requiredAttributes)
+        if (attrName.startsWith("@"))
         {
-          attributes.add(req.getNameOrOID());
+          String lowerName = toLowerCase(attrName.substring(1));
+          ObjectClass oc = DirectoryServer.getObjectClass(lowerName);
+          if (oc == null)
+          {
+            debugMessage(DebugLogCategory.PLUGIN, DebugLogSeverity.WARNING,
+                         CLASS_NAME, "doPreParse",
+                         "Cannot replace unknown objectclass " + lowerName);
+          }
+          else
+          {
+            debugMessage(DebugLogCategory.PLUGIN, DebugLogSeverity.INFO,
+                         CLASS_NAME, "doPreParse",
+                         "Replacing objectclass " + lowerName);
+
+            for (AttributeType at : oc.getRequiredAttributeChain())
+            {
+              newAttrs.add(at.getNameOrOID());
+            }
+
+            for (AttributeType at : oc.getOptionalAttributeChain())
+            {
+              newAttrs.add(at.getNameOrOID());
+            }
+          }
         }
-        for(AttributeType opt : optionalAttributes)
+        else
         {
-          attributes.add(opt.getNameOrOID());
+          newAttrs.add(attrName);
         }
       }
+
+      searchOperation.setAttributes(newAttrs);
     }
 
+
     return new PreParsePluginResult();
   }
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/plugins/LastModPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/plugins/LastModPlugin.java
index 6b190b6..885eb87 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/plugins/LastModPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/plugins/LastModPlugin.java
@@ -30,8 +30,6 @@
 
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.opends.server.api.plugin.DirectoryServerPlugin;
@@ -39,19 +37,18 @@
 import org.opends.server.api.plugin.PreOperationPluginResult;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AddOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
-import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
+import org.opends.server.types.operation.PreOperationAddOperation;
+import org.opends.server.types.operation.PreOperationModifyOperation;
+import org.opends.server.types.operation.PreOperationModifyDNOperation;
 
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.loggers.Debug.*;
@@ -67,7 +64,7 @@
  * to the server, and will add the modifiersName and modifyTimestamp attributes
  * whenever the entry is modified or renamed.
  */
-public class LastModPlugin
+public final class LastModPlugin
        extends DirectoryServerPlugin
 {
   /**
@@ -79,16 +76,16 @@
 
 
   // The attribute type for the "createTimestamp" attribute.
-  private AttributeType createTimestampType;
+  private final AttributeType createTimestampType;
 
   // The attribute type for the "creatorsName" attribute.
-  private AttributeType creatorsNameType;
+  private final AttributeType creatorsNameType;
 
   // The attribute type for the "modifiersName" attribute.
-  private AttributeType modifiersNameType;
+  private final AttributeType modifiersNameType;
 
   // The attribute type for the "modifyTimestamp" attribute.
-  private AttributeType modifyTimestampType;
+  private final AttributeType modifyTimestampType;
 
 
 
@@ -103,33 +100,31 @@
     super();
 
     assert debugConstructor(CLASS_NAME);
+
+
+    // Get the attribute types for the attributes that we will use.  This needs
+    // to be done in the constructor in order to make the associated variables
+    // "final".
+    createTimestampType =
+         DirectoryServer.getAttributeType(OP_ATTR_CREATE_TIMESTAMP_LC, true);
+    creatorsNameType =
+         DirectoryServer.getAttributeType(OP_ATTR_CREATORS_NAME_LC, true);
+    modifiersNameType =
+         DirectoryServer.getAttributeType(OP_ATTR_MODIFIERS_NAME_LC, true);
+    modifyTimestampType =
+      DirectoryServer.getAttributeType(OP_ATTR_MODIFY_TIMESTAMP_LC, true);
   }
 
 
 
   /**
-   * Performs any initialization necessary for this plugin.  This will be called
-   * as soon as the plugin has been loaded and before it is registered with the
-   * server.
-   *
-   * @param  directoryServer  The reference to the Directory Server instance in
-   *                          which the plugin will be running.
-   * @param  pluginTypes      The set of plugin types that indicate the ways in
-   *                          which this plugin will be invoked.
-   * @param  configEntry      The entry containing the configuration information
-   *                          for this plugin.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this plugin.
-   *
-   * @throws  InitializationException  If a problem occurs while initializing
-   *                                   the plugin that is not related to the
-   *                                   server configuration.
+   * {@inheritDoc}
    */
-  public void initializePlugin(DirectoryServer directoryServer,
-                               Set<PluginType> pluginTypes,
-                               ConfigEntry configEntry)
-         throws ConfigException, InitializationException
+  @Override()
+  public final void initializePlugin(DirectoryServer directoryServer,
+                                     Set<PluginType> pluginTypes,
+                                     ConfigEntry configEntry)
+         throws ConfigException
   {
     assert debugEnter(CLASS_NAME, "initializePlugin",
                       String.valueOf(directoryServer),
@@ -155,63 +150,21 @@
           throw new ConfigException(msgID, message);
       }
     }
-
-
-    // Get the attribute types for the attributes that we will use.
-    createTimestampType =
-         DirectoryServer.getAttributeType(OP_ATTR_CREATE_TIMESTAMP_LC);
-    if (createTimestampType == null)
-    {
-      createTimestampType =
-           DirectoryServer.getDefaultAttributeType(OP_ATTR_CREATE_TIMESTAMP);
-    }
-
-    creatorsNameType =
-         DirectoryServer.getAttributeType(OP_ATTR_CREATORS_NAME_LC);
-    if (creatorsNameType == null)
-    {
-      creatorsNameType =
-           DirectoryServer.getDefaultAttributeType(OP_ATTR_CREATORS_NAME);
-    }
-
-    modifiersNameType =
-         DirectoryServer.getAttributeType(OP_ATTR_MODIFIERS_NAME_LC);
-    if (modifiersNameType == null)
-    {
-      modifiersNameType =
-           DirectoryServer.getDefaultAttributeType(OP_ATTR_MODIFIERS_NAME);
-    }
-
-    modifyTimestampType =
-         DirectoryServer.getAttributeType(OP_ATTR_MODIFY_TIMESTAMP_LC);
-    if (modifyTimestampType == null)
-    {
-      modifyTimestampType =
-           DirectoryServer.getDefaultAttributeType(OP_ATTR_MODIFY_TIMESTAMP);
-    }
   }
 
 
 
   /**
-   * Performs any necessary processing that should be done just before the
-   * Directory Server performs the core processing for an add operation.
-   *
-   * @param  addOperation  The add operation to be processed.
-   *
-   * @return  Information about the result of the plugin processing.
+   * {@inheritDoc}
    */
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  @Override()
+  public final PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(addOperation));
 
 
-    // Get the set of operational attributes for the add operation.
-    Map<AttributeType,List<Attribute>> operationalAttrs =
-         addOperation.getOperationalAttributes();
-
-
     // Create the attribute list for the creatorsName attribute, if appropriate.
     DN creatorDN = addOperation.getAuthorizationDN();
     LinkedHashSet<AttributeValue> nameValues =
@@ -232,7 +185,7 @@
                                        nameValues);
     ArrayList<Attribute> nameList = new ArrayList<Attribute>(1);
     nameList.add(nameAttr);
-    operationalAttrs.put(creatorsNameType, nameList);
+    addOperation.setAttribute(creatorsNameType, nameList);
 
 
     //  Create the attribute list for the createTimestamp attribute.
@@ -245,7 +198,7 @@
                                        OP_ATTR_CREATE_TIMESTAMP, timeValues);
     ArrayList<Attribute> timeList = new ArrayList<Attribute>(1);
     timeList.add(timeAttr);
-    operationalAttrs.put(createTimestampType, timeList);
+    addOperation.setAttribute(createTimestampType, timeList);
 
 
     // We shouldn't ever need to return a non-success result.
@@ -255,26 +208,16 @@
 
 
   /**
-   * Performs any necessary processing that should be done just before the
-   * Directory Server performs the core processing for a modify operation.
-   *
-   * @param  modifyOperation  The modify operation to be processed.
-   *
-   * @return  Information about the result of the plugin processing.
+   * {@inheritDoc}
    */
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  @Override()
+  public final PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(modifyOperation));
 
 
-    // Get the set of modifications for this operation.  Also get the modified
-    // entry.  We need to make sure that both get updated appropriately.
-    List<Modification> mods = modifyOperation.getModifications();
-    Entry modifiedEntry = modifyOperation.getModifiedEntry();
-
-
     // Create the modifiersName attribute.
     DN modifierDN = modifyOperation.getAuthorizationDN();
     LinkedHashSet<AttributeValue> nameValues =
@@ -293,11 +236,20 @@
     }
     Attribute nameAttr = new Attribute(modifiersNameType,
                                        OP_ATTR_MODIFIERS_NAME, nameValues);
-    mods.add(new Modification(ModificationType.REPLACE, nameAttr));
+    try
+    {
+      modifyOperation.addModification(new Modification(ModificationType.REPLACE,
+                                                       nameAttr));
+    }
+    catch (DirectoryException de)
+    {
+      assert debugException(CLASS_NAME, "doPreOperation", de);
 
-    ArrayList<Attribute> nameList = new ArrayList<Attribute>(1);
-    nameList.add(nameAttr);
-    modifiedEntry.putAttribute(modifiersNameType, nameList);
+      // This should never happen.
+      modifyOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
+      modifyOperation.appendErrorMessage(de.getErrorMessage());
+      return new PreOperationPluginResult(false, false, true);
+    }
 
 
     //  Create the modifyTimestamp attribute.
@@ -308,11 +260,20 @@
 
     Attribute timeAttr = new Attribute(modifyTimestampType,
                                        OP_ATTR_MODIFY_TIMESTAMP, timeValues);
-    mods.add(new Modification(ModificationType.REPLACE, timeAttr));
+    try
+    {
+      modifyOperation.addModification(new Modification(ModificationType.REPLACE,
+                                                       timeAttr));
+    }
+    catch (DirectoryException de)
+    {
+      assert debugException(CLASS_NAME, "doPreOperation", de);
 
-    ArrayList<Attribute> timeList = new ArrayList<Attribute>(1);
-    timeList.add(timeAttr);
-    modifiedEntry.putAttribute(modifyTimestampType, timeList);
+      // This should never happen.
+      modifyOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
+      modifyOperation.appendErrorMessage(de.getErrorMessage());
+      return new PreOperationPluginResult(false, false, true);
+    }
 
 
     // We shouldn't ever need to return a non-success result.
@@ -322,24 +283,16 @@
 
 
   /**
-   * Performs any necessary processing that should be done just before the
-   * Directory Server performs the core processing for a modify DN operation.
-   *
-   * @param  modifyDNOperation  The modify DN operation to be processed.
-   *
-   * @return  Information about the result of the plugin processing.
+   * {@inheritDoc}
    */
-  public PreOperationPluginResult doPreOperation(ModifyDNOperation
-                                                      modifyDNOperation)
+  @Override()
+  public final PreOperationPluginResult
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
     assert debugEnter(CLASS_NAME, "doPreOperation",
                       String.valueOf(modifyDNOperation));
 
 
-    // Get the set of modifications for this operation.
-    List<Modification> mods = modifyDNOperation.getModifications();
-
-
     // Create the modifiersName attribute.
     DN modifierDN = modifyDNOperation.getAuthorizationDN();
     LinkedHashSet<AttributeValue> nameValues =
@@ -358,7 +311,8 @@
     }
     Attribute nameAttr = new Attribute(modifiersNameType,
                                        OP_ATTR_MODIFIERS_NAME, nameValues);
-    mods.add(new Modification(ModificationType.REPLACE, nameAttr));
+    modifyDNOperation.addModification(new Modification(ModificationType.REPLACE,
+                                                       nameAttr));
 
 
     //  Create the modifyTimestamp attribute.
@@ -369,7 +323,8 @@
 
     Attribute timeAttr = new Attribute(modifyTimestampType,
                                        OP_ATTR_MODIFY_TIMESTAMP, timeValues);
-    mods.add(new Modification(ModificationType.REPLACE, timeAttr));
+    modifyDNOperation.addModification(new Modification(ModificationType.REPLACE,
+                                                       timeAttr));
 
 
     // We shouldn't ever need to return a non-success result.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java
index 904346e..834ea50 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java
@@ -43,7 +43,6 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.PasswordPolicy;
 import org.opends.server.schema.AuthPasswordSyntax;
 import org.opends.server.schema.UserPasswordSyntax;
@@ -69,7 +68,7 @@
  * password policy processing during an LDIF import.  In particular, it ensures
  * that all of the password values are properly encoded before they are stored.
  */
-public class PasswordPolicyImportPlugin
+public final class PasswordPolicyImportPlugin
        extends DirectoryServerPlugin
 {
   /**
@@ -81,10 +80,12 @@
 
 
   // The sets of password storage schemes for the auth password attributes.
-  private HashMap<AttributeType,PasswordStorageScheme[]> authPasswordSchemes;
+  private final HashMap<AttributeType,PasswordStorageScheme[]>
+                     authPasswordSchemes;
 
   // The sets of password storage schemes for the user password attributes.
-  private HashMap<AttributeType,PasswordStorageScheme[]> userPasswordSchemes;
+  private final HashMap<AttributeType,PasswordStorageScheme[]>
+                     userPasswordSchemes;
 
 
 
@@ -99,59 +100,11 @@
     super();
 
     assert debugConstructor(CLASS_NAME);
-  }
 
 
-
-  /**
-   * Performs any initialization necessary for this plugin.  This will be called
-   * as soon as the plugin has been loaded and before it is registered with the
-   * server.
-   *
-   * @param  directoryServer  The reference to the Directory Server instance in
-   *                          which the plugin will be running.
-   * @param  pluginTypes      The set of plugin types that indicate the ways in
-   *                          which this plugin will be invoked.
-   * @param  configEntry      The entry containing the configuration information
-   *                          for this plugin.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this plugin.
-   *
-   * @throws  InitializationException  If a problem occurs while initializing
-   *                                   the plugin that is not related to the
-   *                                   server configuration.
-   */
-  public void initializePlugin(DirectoryServer directoryServer,
-                               Set<PluginType> pluginTypes,
-                               ConfigEntry configEntry)
-         throws ConfigException, InitializationException
-  {
-    assert debugEnter(CLASS_NAME, "initializePlugin",
-                      String.valueOf(directoryServer),
-                      String.valueOf(pluginTypes),
-                      String.valueOf(configEntry));
-
-
-    // Make sure that the plugin has been enabled for the appropriate types.
-    for (PluginType t : pluginTypes)
-    {
-      switch (t)
-      {
-        case LDIF_IMPORT:
-          // This is the only acceptable type.
-          break;
-
-
-        default:
-          int msgID = MSGID_PLUGIN_PWPIMPORT_INVALID_PLUGIN_TYPE;
-          String message = getMessage(msgID, t.toString());
-          throw new ConfigException(msgID, message);
-      }
-    }
-
-
-    // Get the password policies from the Directory Server configuration.
+    // Get the password policies from the Directory Server configuration.  This
+    // is done in the constructor to allow the instance variables to be declared
+    // "final".
     authPasswordSchemes = new HashMap<AttributeType,PasswordStorageScheme[]>();
     userPasswordSchemes = new HashMap<AttributeType,PasswordStorageScheme[]>();
     for (PasswordPolicy p : DirectoryServer.getPasswordPolicies().values())
@@ -223,17 +176,46 @@
 
 
   /**
-   * Performs any necessary processing that should be done during an LDIF import
-   * operation immediately after reading an entry and confirming that it should
-   * be imported based on the provided configuration.
-   *
-   * @param  importConfig  The configuration used for the LDIF import.
-   * @param  entry         The entry that has been read to the LDIF file.
-   *
-   * @return  The result of the plugin processing.
+   * {@inheritDoc}
    */
-  public LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
-                                       Entry entry)
+  @Override()
+  public final void initializePlugin(DirectoryServer directoryServer,
+                               Set<PluginType> pluginTypes,
+                               ConfigEntry configEntry)
+         throws ConfigException
+  {
+    assert debugEnter(CLASS_NAME, "initializePlugin",
+                      String.valueOf(directoryServer),
+                      String.valueOf(pluginTypes),
+                      String.valueOf(configEntry));
+
+
+    // Make sure that the plugin has been enabled for the appropriate types.
+    for (PluginType t : pluginTypes)
+    {
+      switch (t)
+      {
+        case LDIF_IMPORT:
+          // This is the only acceptable type.
+          break;
+
+
+        default:
+          int msgID = MSGID_PLUGIN_PWPIMPORT_INVALID_PLUGIN_TYPE;
+          String message = getMessage(msgID, t.toString());
+          throw new ConfigException(msgID, message);
+      }
+    }
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
+                                             Entry entry)
   {
     assert debugEnter(CLASS_NAME, "doLDIFImport",
                       String.valueOf(importConfig), String.valueOf(entry));
diff --git a/opendj-sdk/opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java b/opendj-sdk/opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java
index d683652..e69a963 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java
@@ -49,7 +49,6 @@
 import org.opends.server.config.ReadOnlyConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
@@ -76,7 +75,7 @@
  * can be analyzed to see where the server is spending all of its processing
  * time.
  */
-public class ProfilerPlugin
+public final class ProfilerPlugin
        extends DirectoryServerPlugin
        implements ConfigurableComponent
 {
@@ -176,28 +175,13 @@
 
 
   /**
-   * Performs any initialization necessary for this plugin.  This will be called
-   * as soon as the plugin has been loaded and before it is registered with the
-   * server.
-   *
-   * @param  directoryServer  The reference to the Directory Server instance in
-   *                          which the plugin will be running.
-   * @param  pluginTypes      The set of plugin types that indicate the ways in
-   *                          which this plugin will be invoked.
-   * @param  configEntry      The entry containing the configuration information
-   *                          for this plugin.
-   *
-   * @throws  ConfigException  If the provided entry does not contain a valid
-   *                           configuration for this plugin.
-   *
-   * @throws  InitializationException  If a problem occurs while initializing
-   *                                   the plugin that is not related to the
-   *                                   server configuration.
+   * {@inheritDoc}
    */
-  public void initializePlugin(DirectoryServer directoryServer,
+  @Override()
+  public final void initializePlugin(DirectoryServer directoryServer,
                                Set<PluginType> pluginTypes,
                                ConfigEntry configEntry)
-         throws ConfigException, InitializationException
+         throws ConfigException
   {
     assert debugEnter(CLASS_NAME, "initializePlugin",
                       String.valueOf(directoryServer),
@@ -342,11 +326,10 @@
 
 
   /**
-   * Performs any necessary finalization for this plugin.  This will be called
-   * just after the plugin has been deregistered with the server but before it
-   * has been unloaded.
+   * {@inheritDoc}
    */
-  public void finalizePlugin()
+  @Override()
+  public final void finalizePlugin()
   {
     assert debugEnter(CLASS_NAME, "finalizePlugin");
 
@@ -386,14 +369,10 @@
 
 
   /**
-   * Performs any processing that should be done when the Directory Server is in
-   * the process of starting.  This method will be called after virtually all
-   * initialization has been performed but before other plugins have before the
-   * connection handlers are started.
-   *
-   * @return  The result of the startup plugin processing.
+   * {@inheritDoc}
    */
-  public StartupPluginResult doStartup()
+  @Override()
+  public final StartupPluginResult doStartup()
   {
     assert debugEnter(CLASS_NAME, "doStartup");
 
@@ -410,13 +389,9 @@
 
 
   /**
-   * Retrieves the DN of the configuration entry with which this component is
-   * associated.
-   *
-   * @return  The DN of the configuration entry with which this component is
-   *          associated.
+   * {@inheritDoc}
    */
-  public DN getConfigurableComponentEntryDN()
+  public final DN getConfigurableComponentEntryDN()
   {
     assert debugEnter(CLASS_NAME, "getConfigurableComponentEntryDN");
 
@@ -426,13 +401,9 @@
 
 
   /**
-   * Retrieves the set of configuration attributes that are associated with this
-   * configurable component.
-   *
-   * @return  The set of configuration attributes that are associated with this
-   *          configurable component.
+   * {@inheritDoc}
    */
-  public List<ConfigAttribute> getConfigurationAttributes()
+  public final List<ConfigAttribute> getConfigurationAttributes()
   {
     assert debugEnter(CLASS_NAME, "getConfigurationAttributes");
 
@@ -484,21 +455,10 @@
 
 
   /**
-   * Indicates whether the provided configuration entry has an acceptable
-   * configuration for this component.  If it does not, then detailed
-   * information about the problem(s) should be added to the provided list.
-   *
-   * @param  configEntry          The configuration entry for which to make the
-   *                              determination.
-   * @param  unacceptableReasons  A list that can be used to hold messages about
-   *                              why the provided entry does not have an
-   *                              acceptable configuration.
-   *
-   * @return  <CODE>true</CODE> if the provided entry has an acceptable
-   *          configuration for this component, or <CODE>false</CODE> if not.
+   * {@inheritDoc}
    */
-  public boolean hasAcceptableConfiguration(ConfigEntry configEntry,
-                                            List<String> unacceptableReasons)
+  public final boolean hasAcceptableConfiguration(ConfigEntry configEntry,
+                            List<String> unacceptableReasons)
   {
     assert debugEnter(CLASS_NAME, "hasAcceptableConfiguration",
                       String.valueOf(configEntry), "java.lang.List<String>");
@@ -614,23 +574,10 @@
 
 
   /**
-   * Makes a best-effort attempt to apply the configuration contained in the
-   * provided entry.  Information about the result of this processing should be
-   * added to the provided message list.  Information should always be added to
-   * this list if a configuration change could not be applied.  If detailed
-   * results are requested, then information about the changes applied
-   * successfully (and optionally about parameters that were not changed) should
-   * also be included.
-   *
-   * @param  configEntry      The entry containing the new configuration to
-   *                          apply for this component.
-   * @param  detailedResults  Indicates whether detailed information about the
-   *                          processing should be added to the list.
-   *
-   * @return  Information about the result of the configuration update.
+   * {@inheritDoc}
    */
-  public ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry,
-                                                  boolean detailedResults)
+  public final ConfigChangeResult applyNewConfiguration(ConfigEntry configEntry,
+                                                        boolean detailedResults)
   {
     assert debugEnter(CLASS_NAME, "applyNewConfiguration",
                       String.valueOf(configEntry),
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
index df6d71b..9d4942e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
@@ -44,11 +44,8 @@
 import org.opends.server.api.ConnectionSecurityProvider;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.CompareOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.ExtendedOperation;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyDNOperation;
@@ -64,11 +61,14 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AuthenticationInfo;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.IntermediateResponse;
 import org.opends.server.types.Modification;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalConnectionHandler.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalConnectionHandler.java
index 034b6df..83578ab 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalConnectionHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/internal/InternalConnectionHandler.java
@@ -33,9 +33,9 @@
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.ConnectionHandler;
-import org.opends.server.core.InitializationException;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java
index 7968ab3..3fd9e68 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java
@@ -57,11 +57,11 @@
 import org.opends.server.config.IntegerConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 /**
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
index 0283af7..105d52b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -45,11 +45,8 @@
 import org.opends.server.core.AbandonOperation;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.CompareOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
 import org.opends.server.core.ModifyOperation;
@@ -65,7 +62,10 @@
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.asn1.ASN1Sequence;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
index dd1d543..e078e82 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
@@ -52,7 +52,6 @@
 import org.opends.server.api.ConnectionSecurityProvider;
 import org.opends.server.api.plugin.PostConnectPluginResult;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.PluginConfigManager;
 import org.opends.server.config.BooleanConfigAttribute;
 import org.opends.server.config.ConfigAttribute;
@@ -70,6 +69,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SSLClientAuthPolicy;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
index a749494..76d3c54 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
@@ -41,7 +41,7 @@
 import org.opends.server.api.DirectoryThread;
 import org.opends.server.api.ServerShutdownListener;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/AbsoluteSubtreeSpecificationSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/AbsoluteSubtreeSpecificationSyntax.java
index d3044d5..bcf6315 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/AbsoluteSubtreeSpecificationSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/AbsoluteSubtreeSpecificationSyntax.java
@@ -41,10 +41,10 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AbsoluteSubtreeSpecification;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java
index 663c1fa..8d6fa5c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java
@@ -40,15 +40,15 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeUsage;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordEqualityMatchingRule.java
index eb12fc9..cc803d1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordEqualityMatchingRule.java
@@ -34,13 +34,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordExactEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordExactEqualityMatchingRule.java
index 2bd6e41..0a3b5ab 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordExactEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordExactEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordSyntax.java
index 4d12b88..f0a59f7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/AuthPasswordSyntax.java
@@ -35,9 +35,9 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringEqualityMatchingRule.java
index 3a65d1f..6827d52 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringEqualityMatchingRule.java
@@ -33,11 +33,11 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringSyntax.java
index f2db706..94ef768 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/BitStringSyntax.java
@@ -35,11 +35,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanEqualityMatchingRule.java
index 7522ee8..ff3d765 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanSyntax.java
index 8e72d92..7f739b7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/BooleanSyntax.java
@@ -36,11 +36,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactEqualityMatchingRule.java
index 4b95f60..bed38fb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5EqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5EqualityMatchingRule.java
index d0fe6dd..ffedb96 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5EqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5EqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5SubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5SubstringMatchingRule.java
index d04d833..566a7dc 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5SubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactIA5SubstringMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactOrderingMatchingRule.java
index e48a4e6..87ffe18 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactOrderingMatchingRule.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactSubstringMatchingRule.java
index a6319e9..323ac6d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseExactSubstringMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
index 6c0db55..30d6d2c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreEqualityMatchingRule.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5EqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5EqualityMatchingRule.java
index 2adbacf..49cb7e7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5EqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5EqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5SubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5SubstringMatchingRule.java
index 9607dfc..e7de3fa 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5SubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreIA5SubstringMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListEqualityMatchingRule.java
index 5590a03..8078358 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListSubstringMatchingRule.java
index 60a0a95..bfbb119 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreListSubstringMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreOrderingMatchingRule.java
index c35340a..e3ce01f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreOrderingMatchingRule.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreSubstringMatchingRule.java
index bce8389..34d996d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/CaseIgnoreSubstringMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DITContentRuleSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DITContentRuleSyntax.java
index 5929e10..2fdf746 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DITContentRuleSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DITContentRuleSyntax.java
@@ -40,17 +40,17 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DITContentRule;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ObjectClassType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DITStructureRuleSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DITStructureRuleSyntax.java
index e82ad55..de26f8e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DITStructureRuleSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DITStructureRuleSyntax.java
@@ -40,15 +40,15 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DITStructureRule;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringFirstComponentEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringFirstComponentEqualityMatchingRule.java
index 200bb54..0a64ba4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringFirstComponentEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringFirstComponentEqualityMatchingRule.java
@@ -31,11 +31,11 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringSyntax.java
index cb05ac0..3e2b864 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DirectoryStringSyntax.java
@@ -43,11 +43,11 @@
 import org.opends.server.config.ConfigAttribute;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameEqualityMatchingRule.java
index 2d10d68..e4c7bb0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AcceptRejectWarn;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameSyntax.java
index 7043396..c20daae 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DistinguishedNameSyntax.java
@@ -36,10 +36,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/DoubleMetaphoneApproximateMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/DoubleMetaphoneApproximateMatchingRule.java
index 79e368c..c64a07a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/DoubleMetaphoneApproximateMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/DoubleMetaphoneApproximateMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.ApproximateMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeEqualityMatchingRule.java
index 9ae313d..7aa767c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeEqualityMatchingRule.java
@@ -38,14 +38,14 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AcceptRejectWarn;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeOrderingMatchingRule.java
index 6bb2e64..73fd57a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeOrderingMatchingRule.java
@@ -37,14 +37,14 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AcceptRejectWarn;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeSyntax.java
index f1815bb..d9e20cd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/GeneralizedTimeSyntax.java
@@ -40,11 +40,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerEqualityMatchingRule.java
index b52673f..caea98d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerFirstComponentEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerFirstComponentEqualityMatchingRule.java
index c330c2d..6f33fcb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerFirstComponentEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerFirstComponentEqualityMatchingRule.java
@@ -31,11 +31,11 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerOrderingMatchingRule.java
index 99a0f7d..1d34278 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerOrderingMatchingRule.java
@@ -31,13 +31,13 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerSyntax.java
index 7c6fe1c..4d63004 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/IntegerSyntax.java
@@ -36,10 +36,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
index c381c69..290db5f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
@@ -35,9 +35,9 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleSyntax.java
index 2cf385b..add4988 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleSyntax.java
@@ -38,9 +38,9 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleUseSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleUseSyntax.java
index 6519c40..f1bcc1a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleUseSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/MatchingRuleUseSyntax.java
@@ -39,15 +39,15 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.MatchingRuleUse;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/NameFormSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/NameFormSyntax.java
index 7198f65..1624a4e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/NameFormSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/NameFormSyntax.java
@@ -40,17 +40,17 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ObjectClassType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
index 17bb00b..687cb1b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringOrderingMatchingRule.java
index df5becd..69e4a6c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringOrderingMatchingRule.java
@@ -31,13 +31,13 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringSubstringMatchingRule.java
index b316d1f..eb95d60 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/NumericStringSubstringMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectClassSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectClassSyntax.java
index 46b7717..1af9544 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectClassSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectClassSyntax.java
@@ -42,16 +42,16 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.Schema;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ObjectClassType;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.Schema;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.loggers.Error.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierEqualityMatchingRule.java
index fce358f..0a941a2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierEqualityMatchingRule.java
@@ -34,14 +34,14 @@
 import org.opends.server.api.MatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types. AttributeType;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierFirstComponentEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierFirstComponentEqualityMatchingRule.java
index b59f38d..ac93f6d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierFirstComponentEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/ObjectIdentifierFirstComponentEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.MatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.NameForm;
 import org.opends.server.types.ObjectClass;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringEqualityMatchingRule.java
index 52cc722..797b4d6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringOrderingMatchingRule.java
index e85eb62..29ca439 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringOrderingMatchingRule.java
@@ -31,10 +31,10 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringSubstringMatchingRule.java
index 7954d02..f583f73 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/OctetStringSubstringMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/PresentationAddressEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/PresentationAddressEqualityMatchingRule.java
index b977dc4..78792a6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/PresentationAddressEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/PresentationAddressEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/ProtocolInformationEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/ProtocolInformationEqualityMatchingRule.java
index 073e795..4489242 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/ProtocolInformationEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/ProtocolInformationEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/RFC3672SubtreeSpecificationSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/RFC3672SubtreeSpecificationSyntax.java
index 9fd8764..73d5480 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/RFC3672SubtreeSpecificationSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/RFC3672SubtreeSpecificationSyntax.java
@@ -40,11 +40,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.RFC3672SubtreeSpecification;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/RelativeSubtreeSpecificationSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/RelativeSubtreeSpecificationSyntax.java
index 530f030..b92910a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/RelativeSubtreeSpecificationSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/RelativeSubtreeSpecificationSyntax.java
@@ -40,11 +40,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.RelativeSubtreeSpecification;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberEqualityMatchingRule.java
index f5d4eaf..6d9e2d4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberSubstringMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberSubstringMatchingRule.java
index 04773d3..f483f30 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberSubstringMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/TelephoneNumberSubstringMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UTCTimeSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UTCTimeSyntax.java
index 42c2010..3a96055 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UTCTimeSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UTCTimeSyntax.java
@@ -40,11 +40,11 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDEqualityMatchingRule.java
index 49ff432..283f19d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDEqualityMatchingRule.java
@@ -33,13 +33,13 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDOrderingMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDOrderingMatchingRule.java
index 1ee0655..234d932 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDOrderingMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UUIDOrderingMatchingRule.java
@@ -31,13 +31,13 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UniqueMemberEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UniqueMemberEqualityMatchingRule.java
index f702b60..5ff34f1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UniqueMemberEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UniqueMemberEqualityMatchingRule.java
@@ -33,14 +33,14 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordEqualityMatchingRule.java
index bcd0d3e..1907130 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordEqualityMatchingRule.java
@@ -34,13 +34,13 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordExactEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordExactEqualityMatchingRule.java
index c15183a..b1b5422 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordExactEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordExactEqualityMatchingRule.java
@@ -33,10 +33,10 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordSyntax.java b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordSyntax.java
index eb8baa5..c63c75e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordSyntax.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/UserPasswordSyntax.java
@@ -35,9 +35,9 @@
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/schema/WordEqualityMatchingRule.java b/opendj-sdk/opends/src/server/org/opends/server/schema/WordEqualityMatchingRule.java
index 5b937c5..b564813 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/schema/WordEqualityMatchingRule.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/schema/WordEqualityMatchingRule.java
@@ -31,11 +31,11 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.schema.SchemaConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ChangelogStartMessage.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ChangelogStartMessage.java
index d0c05ea..5cd6738 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ChangelogStartMessage.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ChangelogStartMessage.java
@@ -30,8 +30,8 @@
 import java.io.UnsupportedEncodingException;
 import java.util.zip.DataFormatException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
-import org.opends.server.core.DirectoryException;
 
 /**
  * Message sent by a changelog server to another changelog server at Startup.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
index bbb7fb1..bd7f70e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/MultimasterSynchronization.java
@@ -39,7 +39,7 @@
 import org.opends.server.core.AddOperation;
 import org.opends.server.types.DN;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.Entry;
 import org.opends.server.core.ModifyDNOperation;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerStartMessage.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerStartMessage.java
index 77d150e..c9fa051 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerStartMessage.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerStartMessage.java
@@ -32,8 +32,8 @@
 import java.net.UnknownHostException;
 import java.util.zip.DataFormatException;
 
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
-import org.opends.server.core.DirectoryException;
 
 /**
  * This message is used by LDAP server when they first connect.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerState.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerState.java
index 3dd71f2..336afb0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerState.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/ServerState.java
@@ -46,7 +46,6 @@
 import org.opends.server.core.AddOperation;
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -60,6 +59,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ModificationType;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java b/opendj-sdk/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
index 65b5185..7e71f2e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/synchronization/SynchronizationDomain.java
@@ -53,7 +53,6 @@
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyOperation;
@@ -64,6 +63,7 @@
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.Entry;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/BackupTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/BackupTask.java
index 3d0507d..0aa7639 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/BackupTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/BackupTask.java
@@ -39,7 +39,6 @@
 
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.api.Backend;
@@ -49,6 +48,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/ExportTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/ExportTask.java
index 1ab3fc2..d57dcff 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/ExportTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/ExportTask.java
@@ -35,13 +35,13 @@
 import static org.opends.server.loggers.Error.logError;
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.api.Backend;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
index 269b406..d3bfbe5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
@@ -36,13 +36,13 @@
 
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.api.Backend;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/RestoreTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/RestoreTask.java
index 89511b9..563b154 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/RestoreTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/RestoreTask.java
@@ -37,7 +37,6 @@
 
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.api.Backend;
@@ -47,6 +46,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ErrorLogCategory;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/ShutdownTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/ShutdownTask.java
index 8913671..827b883 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/ShutdownTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/ShutdownTask.java
@@ -33,11 +33,11 @@
 
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/TaskUtils.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/TaskUtils.java
index 70e8fc6..6c13527 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/TaskUtils.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/TaskUtils.java
@@ -39,7 +39,6 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.loggers.Error;
 import org.opends.server.messages.TaskMessages;
@@ -49,6 +48,7 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/BackUpDB.java b/opendj-sdk/opends/src/server/org/opends/server/tools/BackUpDB.java
index 6eac5c6..1839f1c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/BackUpDB.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/BackUpDB.java
@@ -44,16 +44,16 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.loggers.StartupErrorLogger;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.BackupDirectory;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/ConfigureDS.java b/opendj-sdk/opends/src/server/org/opends/server/tools/ConfigureDS.java
index 6d781df..9e95008 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/ConfigureDS.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/ConfigureDS.java
@@ -36,11 +36,11 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.IntegerConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.extensions.SaltedSHA512PasswordStorageScheme;
 import org.opends.server.protocols.ldap.LDAPResultCode;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/EncodePassword.java b/opendj-sdk/opends/src/server/org/opends/server/tools/EncodePassword.java
index 877e5d5..a29a2e6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/EncodePassword.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/EncodePassword.java
@@ -36,13 +36,13 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.ConfigFileHandler;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.PasswordStorageSchemeConfigManager;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.schema.AuthPasswordSyntax;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/ExportLDIF.java b/opendj-sdk/opends/src/server/org/opends/server/tools/ExportLDIF.java
index 9c9b2e4..5e4ec3e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/ExportLDIF.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/ExportLDIF.java
@@ -40,16 +40,16 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.loggers.StartupErrorLogger;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ExistingFileBehavior;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.util.args.ArgumentException;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java b/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
index e3eafad..c4a44c2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
@@ -42,17 +42,17 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.loggers.StartupErrorLogger;
 import org.opends.server.tools.makeldif.TemplateFile;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
 import org.opends.server.types.ExistingFileBehavior;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.util.args.ArgumentException;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDIFModify.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDIFModify.java
index 6c582be..732d01f 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDIFModify.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDIFModify.java
@@ -37,7 +37,6 @@
 import java.util.Map;
 
 import org.opends.server.config.ConfigFileHandler;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.ldap.LDAPException;
 import org.opends.server.protocols.ldap.LDAPModification;
@@ -45,6 +44,7 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ExistingFileBehavior;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java b/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
index 4165490..84c0672 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
@@ -42,16 +42,16 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.loggers.StartupErrorLogger;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.RestoreConfig;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/VerifyIndex.java b/opendj-sdk/opends/src/server/org/opends/server/tools/VerifyIndex.java
index 0a241e8..e04f1a0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/VerifyIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/VerifyIndex.java
@@ -37,14 +37,14 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.config.StringConfigAttribute;
 import org.opends.server.core.CoreConfigManager;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.loggers.StartupErrorLogger;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.ErrorLogCategory;
 import org.opends.server.types.ErrorLogSeverity;
+import org.opends.server.types.InitializationException;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java
index 9f5c739..5135417 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/AttributeValueTag.java
@@ -31,8 +31,8 @@
 import java.util.List;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/DNTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/DNTag.java
index c901542..be051e7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/DNTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/DNTag.java
@@ -30,8 +30,8 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.RDN;
 
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FileTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FileTag.java
index 72f4a74..6e9d115 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FileTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FileTag.java
@@ -33,7 +33,7 @@
 import java.util.List;
 import java.util.Random;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java
index f37c4df..5c14b3e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/FirstNameTag.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java
index 4730f21..5c048eb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/GUIDTag.java
@@ -31,7 +31,7 @@
 import java.util.List;
 import java.util.UUID;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java
index 3c82d33..98fd2dc 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfAbsentTag.java
@@ -31,8 +31,8 @@
 import java.util.List;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java
index bb8bb55..ea6b1c5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/IfPresentTag.java
@@ -31,8 +31,8 @@
 import java.util.List;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AttributeType;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java
index f4ad87e..95d7a7d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/LastNameTag.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java
index 6db0cd2..3dcfe20 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/ParentDNTag.java
@@ -30,8 +30,8 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java
index e124d39..29b8d9c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/PresenceTag.java
@@ -31,7 +31,7 @@
 import java.util.List;
 import java.util.Random;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java
index 03fe525..7951f05 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RDNTag.java
@@ -30,8 +30,8 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java
index cb57a1a..d5dc7f1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/RandomTag.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.util.Random;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java
index 7501444..8242167 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/SequentialTag.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java
index ba98e5c..208c646 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/StaticTextTag.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/Tag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/Tag.java
index 92ef549..0601fba 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/Tag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/Tag.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
+import org.opends.server.types.InitializationException;
 
 
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java
index 8d76937..05bd12b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/TemplateFile.java
@@ -43,9 +43,9 @@
 import java.util.StringTokenizer;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.ToolMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java
index 1bf252c..631c379 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreDNTag.java
@@ -30,8 +30,8 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.RDN;
 
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java
index 6635480..8ac2344 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/makeldif/UnderscoreParentDNTag.java
@@ -30,8 +30,8 @@
 
 import java.util.List;
 
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.RDN;
 
 import static org.opends.server.messages.MessageHandler.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/AttributeType.java b/opendj-sdk/opends/src/server/org/opends/server/types/AttributeType.java
index 0d56cab..f35f8aa 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/AttributeType.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/AttributeType.java
@@ -36,7 +36,6 @@
 import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.api.SubstringMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/AttributeValue.java b/opendj-sdk/opends/src/server/org/opends/server/types/AttributeValue.java
index 36932c6..a9d992e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/AttributeValue.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/AttributeValue.java
@@ -29,7 +29,6 @@
 
 
 import org.opends.server.api.EqualityMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/BackupDirectory.java b/opendj-sdk/opends/src/server/org/opends/server/types/BackupDirectory.java
index 40b3e5e..bf62ce6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/BackupDirectory.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/BackupDirectory.java
@@ -38,7 +38,6 @@
 import java.util.LinkedList;
 
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryException;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.CoreMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/CancelRequest.java b/opendj-sdk/opends/src/server/org/opends/server/types/CancelRequest.java
new file mode 100644
index 0000000..88c6c84
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/CancelRequest.java
@@ -0,0 +1,184 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types;
+
+
+
+import static org.opends.server.loggers.Debug.*;
+
+
+
+/**
+ * This class defines a data structure that can be used to hold
+ * information about a request to cancel or abandon an operation in
+ * progress.
+ */
+public class CancelRequest
+{
+  /**
+   * The fully-qualified name of this class for debugging purposes.
+   */
+  private static final String CLASS_NAME =
+       "org.opends.server.types.CancelRequest";
+
+
+
+  // Indicates whether to send a response to the original request if
+  // the operation is canceled.
+  private final boolean notifyOriginalRequestor;
+
+  // A message that explains the purpose for this cancellation (may be
+  // included in the response to the original requestor).
+  private final String cancelReason;
+
+  // A buffer to hold a human-readable response that the server
+  // provided for the result of the cancellation.
+  private StringBuilder responseMessage;
+
+
+
+  /**
+   * Creates a new cancel request with the provided information.
+   *
+   * @param  notifyOriginalRequestor  Indicates whether the original
+   *                                  requestor should receive a
+   *                                  response if the operation is
+   *                                  canceled.
+   * @param  cancelReason             A message that explains the
+   *                                  purpose for this cancellation.
+   */
+  public CancelRequest(boolean notifyOriginalRequestor,
+                       String cancelReason)
+  {
+    assert debugConstructor(CLASS_NAME,
+                            String.valueOf(notifyOriginalRequestor),
+                            String.valueOf(cancelReason));
+
+    this.notifyOriginalRequestor = notifyOriginalRequestor;
+    this.cancelReason            = cancelReason;
+    this.responseMessage         = new StringBuilder();
+  }
+
+
+
+  /**
+   * Creates a new cancel request with the provided information.
+   *
+   * @param  notifyOriginalRequestor  Indicates whether the original
+   *                                  requestor should receive a
+   *                                  response if the operation is
+   *                                  canceled.
+   * @param  cancelReason             A message that explains the
+   *                                  purpose for this cancellation.
+   * @param  responseMessage          A buffer to hold a
+   *                                  human-readable response that the
+   *                                  server provided for the result
+   *                                  of the cancellation.
+   */
+  public CancelRequest(boolean notifyOriginalRequestor,
+                       String cancelReason,
+                       StringBuilder responseMessage)
+  {
+    assert debugConstructor(CLASS_NAME,
+                            String.valueOf(notifyOriginalRequestor),
+                            String.valueOf(cancelReason),
+                            "java.lang.StringBuilder");
+
+    this.notifyOriginalRequestor = notifyOriginalRequestor;
+    this.cancelReason            = cancelReason;
+    this.responseMessage         = responseMessage;
+  }
+
+
+
+  /**
+   * Indicates whether the original requestor should receive a
+   * response to the request if the operation is canceled.
+   *
+   * @return  <CODE>true</CODE> if the original requestor should
+   *          receive a response if the operation is canceled, or
+   *          <CODE>false</CODE> if not.
+   */
+  public final boolean notifyOriginalRequestor()
+  {
+    assert debugEnter(CLASS_NAME, "notifyOriginalRequestor");
+
+    return notifyOriginalRequestor;
+  }
+
+
+
+  /**
+   * Retrieves a message that explains the purpose for this
+   * cancellation.
+   *
+   * @return  A message that explains the purpose for this
+   *          cancellation.
+   */
+  public final String getCancelReason()
+  {
+    assert debugEnter(CLASS_NAME, "getCancelReason");
+
+    return cancelReason;
+  }
+
+
+
+  /**
+   * Retrieves the buffer that is used to hold a human-readable
+   * response that the server provided for the result of the
+   * cancellation.  The caller may alter the contents of this buffer.
+   *
+   * @return  The buffer that is used to hold a human-readable
+   *          response that the server provided for the result of this
+   *          cancellation.
+   */
+  public final StringBuilder getResponseMessage()
+  {
+    assert debugEnter(CLASS_NAME, "getResponseMessage");
+
+    return responseMessage;
+  }
+
+
+
+  /**
+   * Appends the provided message to the buffer used to hold
+   * information about the result of the cancellation.
+   *
+   * @param  message  The message to append to the response message
+   *                  buffer.
+   */
+  public final void addResponseMessage(String message)
+  {
+    assert debugEnter(CLASS_NAME, "addResponseMessage",
+                      String.valueOf(message));
+
+    responseMessage.append(message);
+  }
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CancelResult.java b/opendj-sdk/opends/src/server/org/opends/server/types/CancelResult.java
similarity index 72%
rename from opendj-sdk/opends/src/server/org/opends/server/core/CancelResult.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/CancelResult.java
index 2940c70..527eed8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CancelResult.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/CancelResult.java
@@ -24,67 +24,64 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
-
-
-
-import org.opends.server.types.ResultCode;
+package org.opends.server.types;
 
 
 
 /**
- * This enumeration defines the set of possible outcomes that can result from
- * processing a cancel request.  This is based on the specification contained in
- * RFC 3909.
+ * This enumeration defines the set of possible outcomes that can
+ * result from processing a cancel request.  This is based on the
+ * specification contained in RFC 3909.
  */
 public enum CancelResult
 {
   /**
-   * The cancel result that indicates that the target operation was canceled
-   * successfully and in a manner that should have no permanent effects on the
-   * server or the data it contains.
+   * The cancel result that indicates that the target operation was
+   * canceled successfully and in a manner that should have no
+   * permanent effects on the server or the data it contains.
    */
   CANCELED(ResultCode.CANCELED),
 
 
 
   /**
-   * The cancel result that indicates that the target operation could not be
-   * found, which may mean that it either does not exist or has already
-   * completed.
+   * The cancel result that indicates that the target operation could
+   * not be found, which may mean that it either does not exist or has
+   * already completed.
    */
   NO_SUCH_OPERATION(ResultCode.NO_SUCH_OPERATION),
 
 
 
   /**
-   * The cancel result that indicates that processing on the target operation
-   * had already progressed to a point in which it was too late to be able to
-   * cancel.
+   * The cancel result that indicates that processing on the target
+   * operation had already progressed to a point in which it was too
+   * late to be able to cancel.
    */
   TOO_LATE(ResultCode.TOO_LATE),
 
 
 
   /**
-   * The cancel result that indicates that the operation exists but cannot be
-   * canceled for some reason (e.g., it is an abandon, bind, cancel, or unbind
-   * operation, or if it is one that would impact the security of the underlying
-   * connection).
+   * The cancel result that indicates that the operation exists but
+   * cannot be canceled for some reason (e.g., it is an abandon, bind,
+   * cancel, or unbind operation, or if it is one that would impact
+   * the security of the underlying connection).
    */
   CANNOT_CANCEL(ResultCode.CANNOT_CANCEL);
 
 
 
   // The result code associated with this cancel result.
-  private ResultCode resultCode;
+  private final ResultCode resultCode;
 
 
 
   /**
    * Creates a new cancel result with the provided result code.
    *
-   * @param  resultCode  The result code associated with this cancel result.
+   * @param  resultCode  The result code associated with this cancel
+   *                     result.
    */
   private CancelResult(ResultCode resultCode)
   {
@@ -98,7 +95,7 @@
    *
    * @return  The result code associated with this cancel result.
    */
-  public ResultCode getResultCode()
+  public final ResultCode getResultCode()
   {
     return resultCode;
   }
@@ -110,7 +107,7 @@
    *
    * @return  A string representation of this cancel result.
    */
-  public String toString()
+  public final String toString()
   {
     return String.valueOf(resultCode);
   }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CancelledOperationException.java b/opendj-sdk/opends/src/server/org/opends/server/types/CancelledOperationException.java
similarity index 62%
rename from opendj-sdk/opends/src/server/org/opends/server/core/CancelledOperationException.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/CancelledOperationException.java
index 3f05b89..4872036 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CancelledOperationException.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/CancelledOperationException.java
@@ -24,7 +24,7 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
@@ -33,9 +33,9 @@
 
 
 /**
- * This class defines an exception that may be thrown if the operation being
- * processed is cancelled for some reason (e.g., an abandon or cancel request
- * from the client).
+ * This class defines an exception that may be thrown if the operation
+ * being processed is cancelled for some reason (e.g., an abandon or
+ * cancel request from the client).
  */
 public class CancelledOperationException
        extends Exception
@@ -44,33 +44,33 @@
    * The fully-qualified name of this class for debugging purposes.
    */
   private static final String CLASS_NAME =
-       "org.opends.server.core.CancelledOperationException";
+       "org.opends.server.types.CancelledOperationException";
 
 
 
   /**
-   * The serial version identifier required to satisfy the compiler because this
-   * class extends <CODE>java.lang.Exception</CODE>, which implements the
-   * <CODE>java.io.Serializable</CODE> interface.  This value was generated
-   * using the <CODE>serialver</CODE> command-line utility included with the
-   * Java SDK.
+   * The serial version identifier required to satisfy the compiler
+   * because this class extends <CODE>java.lang.Exception</CODE>,
+   * which implements the <CODE>java.io.Serializable</CODE> interface.
+   * This value was generated using the <CODE>serialver</CODE>
+   * command-line utility included with the Java SDK.
    */
   private static final long serialVersionUID = -1936491673256446966L;
 
 
 
-  // The cancel result that provides information about the status of the
-  // cancellation.
-  private CancelResult cancelResult;
+  // The cancel result that provides information about the status of
+  // the cancellation.
+  private final CancelResult cancelResult;
 
   // The message ID for the cancel message.
-  private int messageID;
+  private final int messageID;
 
 
 
   /**
-   * Creates a new cancelled operation exception with the provided result and
-   * no additional message.
+   * Creates a new cancelled operation exception with the provided
+   * result and no additional message.
    *
    * @param  cancelResult  The result of the cancel processing.
    */
@@ -87,22 +87,25 @@
 
 
   /**
-   * Creates a new cancelled operation exception with the provided information.
+   * Creates a new cancelled operation exception with the provided
+   * information.
    *
    * @param  cancelResult  The result of the cancel processing.
-   * @param  message       The message providing additional information about
-   *                       the cancel processing, or <CODE>null</CODE> if there
-   *                       is no message.
-   * @param  messageID     The message ID that uniquely identifies the cancel
-   *                       message, or -1 if there is no message.
+   * @param  message       The message providing additional
+   *                       information about the cancel processing, or
+   *                       <CODE>null</CODE> if there is no message.
+   * @param  messageID     The message ID that uniquely identifies the
+   *                       cancel message, or -1 if there is no
+   *                       message.
    */
-  public CancelledOperationException(CancelResult cancelResult, String message,
-                                     int messageID)
+  public CancelledOperationException(CancelResult cancelResult,
+                                     String message, int messageID)
   {
     super(message);
 
     assert debugConstructor(CLASS_NAME, String.valueOf(cancelResult),
-                            String.valueOf(message), String.valueOf(messageID));
+                            String.valueOf(message),
+                            String.valueOf(messageID));
 
     this.cancelResult = cancelResult;
     this.messageID    = messageID;
@@ -111,11 +114,13 @@
 
 
   /**
-   * Retrieves the cancel result for this cancelled operation exception.
+   * Retrieves the cancel result for this cancelled operation
+   * exception.
    *
-   * @return  The cancel result for this cancelled operation exception.
+   * @return  The cancel result for this cancelled operation
+   *          exception.
    */
-  public CancelResult getCancelResult()
+  public final CancelResult getCancelResult()
   {
     assert debugEnter(CLASS_NAME, "getCancelResult");
 
@@ -125,14 +130,14 @@
 
 
   /**
-   * Retrieves the unique message ID for the message associated with this
-   * cancelled operation exception.
+   * Retrieves the unique message ID for the message associated with
+   * this cancelled operation exception.
    *
-   * @return  The unique message ID for the message associated with this
-   *          cancelled operation exception, or <CODE>-1</CODE> if there is no
-   *          message.
+   * @return  The unique message ID for the message associated with
+   *          this cancelled operation exception, or <CODE>-1</CODE>
+   *          if there is no message.
    */
-  public int getMessageID()
+  public final int getMessageID()
   {
     assert debugEnter(CLASS_NAME, "getMessageID");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/CryptoManager.java b/opendj-sdk/opends/src/server/org/opends/server/types/CryptoManager.java
similarity index 63%
rename from opendj-sdk/opends/src/server/org/opends/server/core/CryptoManager.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/CryptoManager.java
index 0a70926..a3d04a1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/CryptoManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/CryptoManager.java
@@ -24,7 +24,7 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
@@ -54,12 +54,13 @@
 
 
 /**
- * This class provides the interface to the Directory Server cryptographic
- * framework, which may be used for hashing, encryption, and other kinds of
- * cryptographic operations.  Note that it also contains methods for compressing
- * and uncompressing data.  Although these are not strictly cryptographic
- * operations, there are a lot of similarities and it may be conceivable at
- * some point that accelerated compression may be available just as it is for
+ * This class provides the interface to the Directory Server
+ * cryptographic framework, which may be used for hashing, encryption,
+ * and other kinds of cryptographic operations.  Note that it also
+ * contains methods for compressing and uncompressing data.  Although
+ * these are not strictly cryptographic operations, there are a lot of
+ * similarities and it may be conceivable at some point that
+ * accelerated compression may be available just as it is for
  * cryptographic operations.
  */
 public class CryptoManager
@@ -68,11 +69,12 @@
    * The fully-qualified name of this class for debugging purposes.
    */
   private static final String CLASS_NAME =
-       "org.opends.server.core.CryptoManager";
+       "org.opends.server.types.CryptoManager";
 
 
 
-  // The default secret key that we will use for encryption and decryption.
+  // The default secret key that we will use for encryption and
+  // decryption.
   private SecretKey secretKey;
 
   // The preferred cipher for the Directory Server.
@@ -89,32 +91,34 @@
   /**
    * Creates a new instance of this crypto manager object.
    *
-   * @throws  ConfigException  If a problem occurs while creating this crypto
-   *                           manager that is a result of a problem in the
-   *                           configuration.
+   * @throws  ConfigException  If a problem occurs while creating this
+   *                           crypto manager that is a result of a
+   *                           problem in the configuration.
    *
-   * @throws  InitializationException  If a problem occurs while creating this
-   *                                   crypto manager that is not the result of
-   *                                   a problem in the configuration.
+   * @throws  InitializationException  If a problem occurs while
+   *                                   creating this crypto manager
+   *                                   that is not the result of a
+   *                                   problem in the configuration.
    */
   public CryptoManager()
          throws ConfigException, InitializationException
   {
     assert debugConstructor(CLASS_NAME);
 
-    // FIXME -- Get the defaults from the configuration rather than hard-coding
-    // them.
+    // FIXME -- Get the defaults from the configuration rather than
+    // hard-coding them.
     preferredDigestAlgorithm = "SHA-1";
     preferredMACAlgorithm    = "HmacSHA1";
     preferredCipher          = "AES/CBC/PKCS5Padding";
 
 
-    // FIXME -- Use a much more secure way of constructing the secret key.
+    // FIXME -- Use a much more secure way of constructing the secret
+    // key.
     secretKey = new SecretKeySpec(new byte[16], "AES");
 
 
-    // Make sure that we can create instances of the preferred digest, MAC, and
-    // cipher algorithms.
+    // Make sure that we can create instances of the preferred digest,
+    // MAC, and cipher algorithms.
     try
     {
       MessageDigest.getInstance(preferredDigestAlgorithm);
@@ -124,8 +128,9 @@
       assert debugException(CLASS_NAME, "<init>", e);
 
       // FIXME -- Number this.
-      throw new InitializationException(-1, "Can't get preferred digest:  " +
-                                        stackTraceToSingleLineString(e), e);
+      throw new InitializationException(-1,
+                     "Can't get preferred digest:  " +
+                     stackTraceToSingleLineString(e), e);
     }
 
     try
@@ -138,9 +143,9 @@
       assert debugException(CLASS_NAME, "<init>", e);
 
       // FIXME -- Number this.
-      throw new InitializationException(-1, "Can't get preferred MAC " +
-                                        "provider:  " +
-                                        stackTraceToSingleLineString(e), e);
+      throw new InitializationException(-1,
+                     "Can't get preferred MAC provider:  " +
+                     stackTraceToSingleLineString(e), e);
     }
 
     try
@@ -153,8 +158,9 @@
       assert debugException(CLASS_NAME, "<init>", e);
 
       // FIXME -- Number this.
-      throw new InitializationException(-1, "Can't get preferred cipher:  " +
-                                        stackTraceToSingleLineString(e), e);
+      throw new InitializationException(-1,
+                     "Can't get preferred cipher:  " +
+                     stackTraceToSingleLineString(e), e);
     }
   }
 
@@ -169,8 +175,8 @@
   {
     assert debugEnter(CLASS_NAME, "getSecureRandom");
 
-    // FIXME -- Is this threadsafe?  Can we share a single instance among all
-    // threads?
+    // FIXME -- Is this threadsafe?  Can we share a single instance
+    // among all threads?
     return new SecureRandom();
   }
 
@@ -183,7 +189,8 @@
    */
   public String getPreferredMessageDigestAlgorithm()
   {
-    assert debugEnter(CLASS_NAME, "getPreferredMessageDigestAlgorithm");
+    assert debugEnter(CLASS_NAME,
+                      "getPreferredMessageDigestAlgorithm");
 
     return preferredDigestAlgorithm;
   }
@@ -191,14 +198,15 @@
 
 
   /**
-   * Retrieves a <CODE>MessageDigest</CODE> object that may be used to generate
-   * digests using the preferred digest algorithm.
+   * Retrieves a <CODE>MessageDigest</CODE> object that may be used to
+   * generate digests using the preferred digest algorithm.
    *
-   * @return  A <CODE>MessageDigest</CODE> object that may be used to generate
-   *          digests using the preferred digest algorithm.
+   * @return  A <CODE>MessageDigest</CODE> object that may be used to
+   *          generate digests using the preferred digest algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public MessageDigest getPreferredMessageDigest()
          throws NoSuchAlgorithmException
@@ -211,17 +219,18 @@
 
 
   /**
-   * Retrieves a <CODE>MessageDigest</CODE> object that may be used to generate
-   * digests using the specified algorithm.
+   * Retrieves a <CODE>MessageDigest</CODE> object that may be used to
+   * generate digests using the specified algorithm.
    *
-   * @param  digestAlgorithm  The algorithm to use to generate the message
-   *                          digest.
+   * @param  digestAlgorithm  The algorithm to use to generate the
+   *                          message digest.
    *
-   * @return  A <CODE>MessageDigest</CODE> object that may be used to generate
-   *          digests using the specified algorithm.
+   * @return  A <CODE>MessageDigest</CODE> object that may be used to
+   *          generate digests using the specified algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public MessageDigest getMessageDigest(String digestAlgorithm)
          throws NoSuchAlgorithmException
@@ -235,43 +244,48 @@
 
 
   /**
-   * Retrieves a byte array containing a message digest based on the provided
-   * data, using the preferred digest algorithm.
+   * Retrieves a byte array containing a message digest based on the
+   * provided data, using the preferred digest algorithm.
    *
    * @param  data  The data to be digested.
    *
    * @return  A byte array containing the generated message digest.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] digest(byte[] data)
          throws NoSuchAlgorithmException
   {
-    assert debugEnter(CLASS_NAME, "digest", "byte[" + data.length + "]");
+    assert debugEnter(CLASS_NAME, "digest",
+                      "byte[" + data.length + "]");
 
-    return MessageDigest.getInstance(preferredDigestAlgorithm).digest(data);
+    return MessageDigest.getInstance(preferredDigestAlgorithm).
+                digest(data);
   }
 
 
 
   /**
-   * Retrieves a byte array containing a message digest based on the provided
-   * data, using the requested digest algorithm.
+   * Retrieves a byte array containing a message digest based on the
+   * provided data, using the requested digest algorithm.
    *
-   * @param  digestAlgorithm  The algorithm to use to generate the message
-   *                          digest.
+   * @param  digestAlgorithm  The algorithm to use to generate the
+   *                          message digest.
    * @param  data             The data to be digested.
    *
    * @return  A byte array containing the generated message digest.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] digest(String digestAlgorithm, byte[] data)
          throws NoSuchAlgorithmException
   {
-    assert debugEnter(CLASS_NAME, "digest", String.valueOf(digestAlgorithm),
+    assert debugEnter(CLASS_NAME, "digest",
+                      String.valueOf(digestAlgorithm),
                       "byte[" + data.length + "]");
 
     return MessageDigest.getInstance(digestAlgorithm).digest(data);
@@ -280,26 +294,30 @@
 
 
   /**
-   * Retrieves a byte array containing a message digest based on the data read
-   * from the provided input stream, using the preferred digest algorithm.  Data
-   * will be read until the end of the stream is reached.
+   * Retrieves a byte array containing a message digest based on the
+   * data read from the provided input stream, using the preferred
+   * digest algorithm.  Data will be read until the end of the stream
+   * is reached.
    *
-   * @param  inputStream  The input stream from which the data is to be read.
+   * @param  inputStream  The input stream from which the data is to
+   *                      be read.
    *
    * @return  A byte array containing the generated message digest.
    *
-   * @throws  IOException  If a problem occurs while reading data from the
-   *                       provided stream.
+   * @throws  IOException  If a problem occurs while reading data from
+   *                       the provided stream.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] digest(InputStream inputStream)
          throws IOException, NoSuchAlgorithmException
   {
     assert debugEnter(CLASS_NAME, "digest", "java.io.InputStream");
 
-    MessageDigest digest = MessageDigest.getInstance(preferredDigestAlgorithm);
+    MessageDigest digest =
+         MessageDigest.getInstance(preferredDigestAlgorithm);
 
     byte[] buffer = new byte[8192];
     while (true)
@@ -319,24 +337,27 @@
 
 
   /**
-   * Retrieves a byte array containing a message digest based on the data read
-   * from the provided input stream, using the requested digest algorithm.  Data
-   * will be read until the end of the stream is reached.
+   * Retrieves a byte array containing a message digest based on the
+   * data read from the provided input stream, using the requested
+   * digest algorithm.  Data will be read until the end of the stream
+   * is reached.
    *
-   * @param  digestAlgorithm  The algorithm to use to generate the message
-   *                          digest.
-   * @param  inputStream      The input stream from which the data is to be
-   *                          read.
+   * @param  digestAlgorithm  The algorithm to use to generate the
+   *                          message digest.
+   * @param  inputStream      The input stream from which the data is
+   *                          to be read.
    *
    * @return  A byte array containing the generated message digest.
    *
-   * @throws  IOException  If a problem occurs while reading data from the
-   *                       provided stream.
+   * @throws  IOException  If a problem occurs while reading data from
+   *                       the provided stream.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
-  public byte[] digest(String digestAlgorithm, InputStream inputStream)
+  public byte[] digest(String digestAlgorithm,
+                       InputStream inputStream)
          throws IOException, NoSuchAlgorithmException
   {
     assert debugEnter(CLASS_NAME, "digest", "java.io.InputStream");
@@ -367,7 +388,8 @@
    */
   public String getPreferredMACAlgorithm()
   {
-    assert debugEnter(CLASS_NAME, "getPreferredMessageDigestAlgorithm");
+    assert debugEnter(CLASS_NAME,
+                      "getPreferredMessageDigestAlgorithm");
 
     return preferredMACAlgorithm;
   }
@@ -379,11 +401,13 @@
    *
    * @return  A MAC provider using the preferred algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    *
-   * @throws  InvalidKeyException  If the provided key is not appropriate for
-   *                               use with the requested MAC algorithm.
+   * @throws  InvalidKeyException  If the provided key is not
+   *                               appropriate for use with the
+   *                               requested MAC algorithm.
    */
   public Mac getPreferredMACProvider()
          throws NoSuchAlgorithmException, InvalidKeyException
@@ -405,11 +429,13 @@
    *
    * @return  A MAC provider using the specified algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    *
-   * @throws  InvalidKeyException  If the provided key is not appropriate for
-   *                               use with the requested MAC algorithm.
+   * @throws  InvalidKeyException  If the provided key is not
+   *                               appropriate for use with the
+   *                               requested MAC algorithm.
    */
   public Mac getMACProvider(String macAlgorithm)
          throws NoSuchAlgorithmException, InvalidKeyException
@@ -426,15 +452,16 @@
 
 
   /**
-   * Retrieves a byte array containing a MAC based on the provided data, using
-   * the preferred MAC algorithm.
+   * Retrieves a byte array containing a MAC based on the provided
+   * data, using the preferred MAC algorithm.
    *
    * @param  data  The data for which to generate the MAC.
    *
    * @return  A byte array containing the generated MAC.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] mac(byte[] data)
          throws NoSuchAlgorithmException
@@ -447,16 +474,17 @@
 
 
   /**
-   * Retrieves a byte array containing a MAC based on the provided data, using
-   * the requested MAC algorithm.
+   * Retrieves a byte array containing a MAC based on the provided
+   * data, using the requested MAC algorithm.
    *
    * @param  macAlgorithm  The algorithm to use for the MAC.
    * @param  data          The data for which to generate the MAC.
    *
    * @return  A byte array containing the generated MAC.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] mac(String macAlgorithm, byte[] data)
          throws NoSuchAlgorithmException
@@ -470,19 +498,22 @@
 
 
   /**
-   * Retrieves a byte array containing a MAC based on the data read from the
-   * provided input stream, using the preferred MAC algorithm.  Data will be
-   * read until the end of the stream is reached.
+   * Retrieves a byte array containing a MAC based on the data read
+   * from the provided input stream, using the preferred MAC
+   * algorithm.  Data will be read until the end of the stream is
+   * reached.
    *
-   * @param  inputStream  The input stream from which the data is to be read.
+   * @param  inputStream  The input stream from which the data is to
+   *                      be read.
    *
    * @return  A byte array containing the generated MAC.
    *
-   * @throws  IOException  If a problem occurs while reading data from the
-   *                       provided stream.
+   * @throws  IOException  If a problem occurs while reading data from
+   *                       the provided stream.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] mac(InputStream inputStream)
          throws IOException, NoSuchAlgorithmException
@@ -509,25 +540,29 @@
 
 
   /**
-   * Retrieves a byte array containing a MAC based on the data read from the
-   * provided input stream, using the preferred MAC algorithm.  Data will be
-   * read until the end of the stream is reached.
+   * Retrieves a byte array containing a MAC based on the data read
+   * from the provided input stream, using the preferred MAC
+   * algorithm.  Data will be read until the end of the stream is
+   * reached.
    *
    * @param  macAlgorithm  The algorithm to use for the MAC.
-   * @param  inputStream   The input stream from which the data is to be read.
+   * @param  inputStream   The input stream from which the data is to
+   *                       be read.
    *
    * @return  A byte array containing the generated MAC.
    *
-   * @throws  IOException  If a problem occurs while reading data from the
-   *                       provided stream.
+   * @throws  IOException  If a problem occurs while reading data from
+   *                       the provided stream.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    */
   public byte[] mac(String macAlgorithm, InputStream inputStream)
          throws IOException, NoSuchAlgorithmException
   {
-    assert debugEnter(CLASS_NAME, "digest", String.valueOf(macAlgorithm),
+    assert debugEnter(CLASS_NAME, "digest",
+                      String.valueOf(macAlgorithm),
                       "java.io.InputStream");
 
     Mac mac = Mac.getInstance(macAlgorithm);
@@ -564,31 +599,35 @@
 
 
   /**
-   * Retrieves a cipher using the preferred algorithm and the specified cipher
-   * mode.
+   * Retrieves a cipher using the preferred algorithm and the
+   * specified cipher mode.
    *
-   * @param  cipherMode  The cipher mode that indicates how the cipher will be
-   *                     used (e.g., encryption, decryption, wrapping,
-   *                     unwrapping).
+   * @param  cipherMode  The cipher mode that indicates how the cipher
+   *                     will be used (e.g., encryption, decryption,
+   *                     wrapping, unwrapping).
    *
    * @return  A cipher using the preferred algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    *
-   * @throws  NoSuchPaddingException  If the requested padding mechanism is not
-   *                                  supported or is unavailable.
+   * @throws  NoSuchPaddingException  If the requested padding
+   *                                  mechanism is not supported or is
+   *                                  unavailable.
    *
-   * @throws  InvalidKeyException  If the provided key is not appropriate for
-   *                               use with the requested cipher algorithm.
+   * @throws  InvalidKeyException  If the provided key is not
+   *                               appropriate for use with the
+   *                               requested cipher algorithm.
    *
-   * @throws  InvalidAlgorithmParameterException  If an internal problem occurs
-   *                                              as a result of the
-   *                                              initialization vector used.
+   * @throws  InvalidAlgorithmParameterException
+   *               If an internal problem occurs as a result of the
+   *               initialization vector used.
    */
   public Cipher getPreferredCipher(int cipherMode)
          throws NoSuchAlgorithmException, NoSuchPaddingException,
-                InvalidKeyException, InvalidAlgorithmParameterException
+                InvalidKeyException,
+                InvalidAlgorithmParameterException
   {
     assert debugEnter(CLASS_NAME, "getPreferredCipher",
                       String.valueOf(cipherMode));
@@ -606,32 +645,36 @@
 
 
   /**
-   * Retrieves a cipher using the preferred algorithm and the specified cipher
-   * mode.
+   * Retrieves a cipher using the preferred algorithm and the
+   * specified cipher mode.
    *
    * @param  cipherAlgorithm  The algorithm to use for the cipher.
-   * @param  cipherMode       The cipher mode that indicates how the cipher will
-   *                          be used (e.g., encryption, decryption, wrapping,
-   *                          unwrapping).
+   * @param  cipherMode       The cipher mode that indicates how the
+   *                          cipher will be used (e.g., encryption,
+   *                          decryption, wrapping, unwrapping).
    *
    * @return  A cipher using the preferred algorithm.
    *
-   * @throws  NoSuchAlgorithmException  If the requested algorithm is not
-   *                                    supported or is unavailable.
+   * @throws  NoSuchAlgorithmException  If the requested algorithm is
+   *                                    not supported or is
+   *                                    unavailable.
    *
-   * @throws  NoSuchPaddingException  If the requested padding mechanism is not
-   *                                  supported or is unavailable.
+   * @throws  NoSuchPaddingException  If the requested padding
+   *                                  mechanism is not supported or is
+   *                                  unavailable.
    *
-   * @throws  InvalidKeyException  If the provided key is not appropriate for
-   *                               use with the requested cipher algorithm.
+   * @throws  InvalidKeyException  If the provided key is not
+   *                               appropriate for use with the
+   *                               requested cipher algorithm.
    *
-   * @throws  InvalidAlgorithmParameterException  If an internal problem occurs
-   *                                              as a result of the
-   *                                              initialization vector used.
+   * @throws  InvalidAlgorithmParameterException
+   *               If an internal problem occurs as a result of the
+   *               initialization vector used.
    */
   public Cipher getCipher(String cipherAlgorithm, int cipherMode)
          throws NoSuchAlgorithmException, NoSuchPaddingException,
-                InvalidKeyException, InvalidAlgorithmParameterException
+                InvalidKeyException,
+                InvalidAlgorithmParameterException
   {
     assert debugEnter(CLASS_NAME, "getCipher",
                       String.valueOf(cipherAlgorithm),
@@ -650,20 +693,23 @@
 
 
   /**
-   * Encrypts the data in the provided byte array using the preferred cipher.
+   * Encrypts the data in the provided byte array using the preferred
+   * cipher.
    *
    * @param  data  The data to be encrypted.
    *
-   * @return  A byte array containing the encrypted representation of the
-   *          provided data.
+   * @return  A byte array containing the encrypted representation of
+   *          the provided data.
    *
-   * @throws  GeneralSecurityException  If a problem occurs while attempting to
-   *                                    encrypt the data.
+   * @throws  GeneralSecurityException  If a problem occurs while
+   *                                    attempting to encrypt the
+   *                                    data.
    */
   public byte[] encrypt(byte[] data)
          throws GeneralSecurityException
   {
-    assert debugEnter(CLASS_NAME, "encrypt", "byte[" + data.length + "]");
+    assert debugEnter(CLASS_NAME, "encrypt",
+                      "byte[" + data.length + "]");
 
     Cipher cipher = Cipher.getInstance(preferredCipher);
 
@@ -677,20 +723,23 @@
 
 
   /**
-   * Decrypts the data in the provided byte array using the preferred cipher.
+   * Decrypts the data in the provided byte array using the preferred
+   * cipher.
    *
    * @param  data  The data to be decrypted.
    *
-   * @return  A byte array containing the cleartext representation of the
-   *          provided data.
+   * @return  A byte array containing the cleartext representation of
+   *          the provided data.
    *
-   * @throws  GeneralSecurityException  If a problem occurs while attempting to
-   *                                    decrypt the data.
+   * @throws  GeneralSecurityException  If a problem occurs while
+   *                                    attempting to decrypt the
+   *                                    data.
    */
   public byte[] decrypt(byte[] data)
          throws GeneralSecurityException
   {
-    assert debugEnter(CLASS_NAME, "decrypt", "byte[" + data.length + "]");
+    assert debugEnter(CLASS_NAME, "decrypt",
+                      "byte[" + data.length + "]");
 
     Cipher cipher = Cipher.getInstance(preferredCipher);
 
@@ -704,21 +753,25 @@
 
 
   /**
-   * Encrypts the data in the provided byte array using the preferred cipher.
+   * Encrypts the data in the provided byte array using the preferred
+   * cipher.
    *
-   * @param  cipherAlgorithm  The algorithm to use to encrypt the data.
+   * @param  cipherAlgorithm  The algorithm to use to encrypt the
+   *                          data.
    * @param  data             The data to be encrypted.
    *
-   * @return  A byte array containing the encrypted representation of the
-   *          provided data.
+   * @return  A byte array containing the encrypted representation of
+   *          the provided data.
    *
-   * @throws  GeneralSecurityException  If a problem occurs while attempting to
-   *                                    encrypt the data.
+   * @throws  GeneralSecurityException  If a problem occurs while
+   *                                    attempting to encrypt the
+   *                                    data.
    */
   public byte[] encrypt(String cipherAlgorithm, byte[] data)
          throws GeneralSecurityException
   {
-    assert debugEnter(CLASS_NAME, "encrypt", "byte[" + data.length + "]");
+    assert debugEnter(CLASS_NAME, "encrypt",
+                      "byte[" + data.length + "]");
 
     Cipher cipher = Cipher.getInstance(cipherAlgorithm);
 
@@ -732,21 +785,25 @@
 
 
   /**
-   * Decrypts the data in the provided byte array using the requested cipher.
+   * Decrypts the data in the provided byte array using the requested
+   * cipher.
    *
-   * @param  cipherAlgorithm  The algorithm to use to decrypt the data.
+   * @param  cipherAlgorithm  The algorithm to use to decrypt the
+   *                          data.
    * @param  data             The data to be decrypted.
    *
-   * @return  A byte array containing the cleartext representation of the
-   *          provided data.
+   * @return  A byte array containing the cleartext representation of
+   *          the provided data.
    *
-   * @throws  GeneralSecurityException  If a problem occurs while attempting to
-   *                                    decrypt the data.
+   * @throws  GeneralSecurityException  If a problem occurs while
+   *                                    attempting to decrypt the
+   *                                    data.
    */
   public byte[] decrypt(String cipherAlgorithm, byte[] data)
          throws GeneralSecurityException
   {
-    assert debugEnter(CLASS_NAME, "decrypt", "byte[" + data.length + "]");
+    assert debugEnter(CLASS_NAME, "decrypt",
+                      "byte[" + data.length + "]");
 
     Cipher cipher = Cipher.getInstance(cipherAlgorithm);
 
@@ -760,18 +817,20 @@
 
 
   /**
-   * Attempts to compress the data in the provided source array into the given
-   * destination array.  If the compressed data will fit into the destination
-   * array, then this method will return the number of bytes of compressed data
-   * in the array.  Otherwise, it will return -1 to indicate that the
-   * compression was not successful.  Note that if -1 is returned, then the data
-   * in the destination array should be considered invalid.
+   * Attempts to compress the data in the provided source array into
+   * the given destination array.  If the compressed data will fit
+   * into the destination array, then this method will return the
+   * number of bytes of compressed data in the array.  Otherwise, it
+   * will return -1 to indicate that the compression was not
+   * successful.  Note that if -1 is returned, then the data in the
+   * destination array should be considered invalid.
    *
    * @param  src  The array containing the raw data to compress.
-   * @param  dst  The array into which the compressed data should be written.
+   * @param  dst  The array into which the compressed data should be
+   *              written.
    *
-   * @return  The number of bytes of compressed data, or -1 if it was not
-   *          possible to actually compress the data.
+   * @return  The number of bytes of compressed data, or -1 if it was
+   *          not possible to actually compress the data.
    */
   public int compress(byte[] src, byte[] dst)
   {
@@ -800,26 +859,29 @@
 
 
   /**
-   * Attempts to uncompress the data in the provided source array into the given
-   * destination array.  If the uncompressed data will fit into the given
-   * destination array, then this method will return the number of bytes of
-   * uncompressed data written into the destination buffer.  Otherwise, it will
-   * return a negative value to indicate that the destination buffer was not
-   * large enough.  The absolute value of that negative return value will
-   * indicate the buffer size required to fully decompress the data.  Note that
-   * if a negative value is returned, then the data in the destination array
-   * should be considered invalid.
+   * Attempts to uncompress the data in the provided source array into
+   * the given destination array.  If the uncompressed data will fit
+   * into the given destination array, then this method will return
+   * the number of bytes of uncompressed data written into the
+   * destination buffer.  Otherwise, it will return a negative value
+   * to indicate that the destination buffer was not large enough.
+   * The absolute value of that negative return value will indicate
+   * the buffer size required to fully decompress the data.  Note that
+   * if a negative value is returned, then the data in the destination
+   * array should be considered invalid.
    *
    * @param  src  The array containing the compressed data.
-   * @param  dst  The array into which the uncompressed data should be written.
+   * @param  dst  The array into which the uncompressed data should be
+   *              written.
    *
-   * @return  A positive value containing the number of bytes of uncompressed
-   *          data written into the destination buffer, or a negative value
-   *          whose absolute value is the size of the destination buffer
-   *          required to fully decompress the provided data.
+   * @return  A positive value containing the number of bytes of
+   *          uncompressed data written into the destination buffer,
+   *          or a negative value whose absolute value is the size of
+   *          the destination buffer required to fully decompress the
+   *          provided data.
    *
-   * @throws  DataFormatException  If a problem occurs while attempting to
-   *                               uncompress the data.
+   * @throws  DataFormatException  If a problem occurs while
+   *                               attempting to uncompress the data.
    */
   public int uncompress(byte[] src, byte[] dst)
          throws DataFormatException
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/DN.java b/opendj-sdk/opends/src/server/org/opends/server/types/DN.java
index 4e90978..857c8f2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/DN.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/DN.java
@@ -31,7 +31,6 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryException.java b/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryException.java
similarity index 68%
rename from opendj-sdk/opends/src/server/org/opends/server/core/DirectoryException.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/DirectoryException.java
index 009d942..8122556 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/DirectoryException.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryException.java
@@ -24,22 +24,19 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
 import java.util.List;
 
-import org.opends.server.types.DN;
-import org.opends.server.types.ResultCode;
-
 import static org.opends.server.loggers.Debug.*;
 
 
 
 /**
- * This class defines an exception that may be thrown if a problem occurs in the
- * Directory Server.
+ * This class defines an exception that may be thrown if a problem
+ * occurs in the Directory Server.
  */
 public class DirectoryException
        extends Exception
@@ -48,47 +45,49 @@
    * The fully-qualified name of this class for debugging purposes.
    */
   private static final String CLASS_NAME =
-       "org.opends.server.core.DirectoryException";
+       "org.opends.server.types.DirectoryException";
 
 
 
   /**
-   * The serial version identifier required to satisfy the compiler because this
-   * class extends <CODE>java.lang.Exception</CODE>, which implements the
-   * <CODE>java.io.Serializable</CODE> interface.  This value was generated
-   * using the <CODE>serialver</CODE> command-line utility included with the
-   * Java SDK.
+   * The serial version identifier required to satisfy the compiler
+   * because this class extends <CODE>java.lang.Exception</CODE>,
+   * which implements the <CODE>java.io.Serializable</CODE> interface.
+   * This value was generated using the <CODE>serialver</CODE>
+   * command-line utility included with the Java SDK.
    */
   private static final long serialVersionUID = 2615453139798417203L;
 
 
 
   // The matched DN for this directory exception.
-  private DN matchedDN;
+  private final DN matchedDN;
 
   // The message ID for the error message.
-  private int errorMessageID;
+  private final int errorMessageID;
 
   // The set of referral URLs for this directory exception.
-  private List<String> referralURLs;
+  private final List<String> referralURLs;
 
   // The result code for this directory exception.
-  private ResultCode resultCode;
+  private final ResultCode resultCode;
 
   // The error message for this directory exception.
-  private String errorMessage;
+  private final String errorMessage;
 
 
 
   /**
    * Creates a new directory exception with the provided information.
    *
-   * @param  resultCode      The result code for this directory exception.
-   * @param  errorMessage    The error message for this directory exception.
+   * @param  resultCode      The result code for this directory
+   *                         exception.
+   * @param  errorMessage    The error message for this directory
+   *                         exception.
    * @param  errorMessageID  The unique ID for the error message.
    */
-  public DirectoryException(ResultCode resultCode, String errorMessage,
-                            int errorMessageID)
+  public DirectoryException(ResultCode resultCode,
+                            String errorMessage, int errorMessageID)
   {
     super(errorMessage);
 
@@ -108,14 +107,17 @@
   /**
    * Creates a new directory exception with the provided information.
    *
-   * @param  resultCode      The result code for this directory exception.
-   * @param  errorMessage    The error message for this directory exception.
+   * @param  resultCode      The result code for this directory
+   *                         exception.
+   * @param  errorMessage    The error message for this directory
+   *                         exception.
    * @param  errorMessageID  The unique ID for the error message.
-   * @param  cause           The exception that was caught to trigger this
-   *                         directory exception.
+   * @param  cause           The exception that was caught to trigger
+   *                         this directory exception.
    */
-  public DirectoryException(ResultCode resultCode, String errorMessage,
-                            int errorMessageID, Throwable cause)
+  public DirectoryException(ResultCode resultCode,
+                            String errorMessage, int errorMessageID,
+                            Throwable cause)
   {
     super(errorMessage, cause);
 
@@ -136,22 +138,27 @@
   /**
    * Creates a new directory exception with the provided information.
    *
-   * @param  resultCode      The result code for this directory exception.
-   * @param  errorMessage    The error message for this directory exception.
+   * @param  resultCode      The result code for this directory
+   *                         exception.
+   * @param  errorMessage    The error message for this directory
+   *                         exception.
    * @param  errorMessageID  The unique ID for the error message.
-   * @param  matchedDN       The matched DN for this directory exception.
-   * @param  cause           The exception that was caught to trigger this
-   *                         directory exception.
+   * @param  matchedDN       The matched DN for this directory
+   *                         exception.
+   * @param  cause           The exception that was caught to trigger
+   *                         this directory exception.
    */
-  public DirectoryException(ResultCode resultCode, String errorMessage,
-                            int errorMessageID, DN matchedDN, Throwable cause)
+  public DirectoryException(ResultCode resultCode,
+                            String errorMessage, int errorMessageID,
+                            DN matchedDN, Throwable cause)
   {
     super(errorMessage, cause);
 
     assert debugConstructor(CLASS_NAME, String.valueOf(resultCode),
                             String.valueOf(errorMessage),
                             String.valueOf(errorMessageID),
-                            String.valueOf(matchedDN), String.valueOf(cause));
+                            String.valueOf(matchedDN),
+                            String.valueOf(cause));
 
     this.resultCode     = resultCode;
     this.errorMessage   = errorMessage;
@@ -165,18 +172,22 @@
   /**
    * Creates a new directory exception with the provided information.
    *
-   * @param  resultCode      The result code for this directory exception.
-   * @param  errorMessage    The error message for this directory exception.
-   * @param  errorMessageID  The unique ID for the error message.
-   * @param  matchedDN       The matched DN for this directory exception.
-   * @param  referralURLs    The set of referral URLs for this directory
+   * @param  resultCode      The result code for this directory
    *                         exception.
-   * @param  cause           The exception that was caught to trigger this
+   * @param  errorMessage    The error message for this directory
+   *                         exception.
+   * @param  errorMessageID  The unique ID for the error message.
+   * @param  matchedDN       The matched DN for this directory
+   *                         exception.
+   * @param  referralURLs    The set of referral URLs for this
    *                         directory exception.
+   * @param  cause           The exception that was caught to trigger
+   *                         this directory exception.
    */
-  public DirectoryException(ResultCode resultCode, String errorMessage,
-                            int errorMessageID, DN matchedDN,
-                            List<String> referralURLs, Throwable cause)
+  public DirectoryException(ResultCode resultCode,
+                            String errorMessage, int errorMessageID,
+                            DN matchedDN, List<String> referralURLs,
+                            Throwable cause)
   {
     super(errorMessage, cause);
 
@@ -205,7 +216,7 @@
    *
    * @return  The result code for this directory exception.
    */
-  public ResultCode getResultCode()
+  public final ResultCode getResultCode()
   {
     assert debugEnter(CLASS_NAME, "getResultCode");
 
@@ -219,7 +230,7 @@
    *
    * @return  The error message for this directory exception.
    */
-  public String getErrorMessage()
+  public final String getErrorMessage()
   {
     assert debugEnter(CLASS_NAME, "getErrorMessage");
 
@@ -229,13 +240,13 @@
 
 
   /**
-   * Retrieves the unique ID for the error message associated with this
-   * directory exception.
+   * Retrieves the unique ID for the error message associated with
+   * this directory exception.
    *
-   * @return  The unique ID for the error message associated with this directory
-   *          exception.
+   * @return  The unique ID for the error message associated with this
+   *          directory exception.
    */
-  public int getErrorMessageID()
+  public final int getErrorMessageID()
   {
     assert debugEnter(CLASS_NAME, "getErrorMessageID");
 
@@ -247,10 +258,10 @@
   /**
    * Retrieves the matched DN for this directory exception.
    *
-   * @return  The matched DN for this directory exception, or <CODE>null</CODE>
-   *          if there is none.
+   * @return  The matched DN for this directory exception, or
+   *          <CODE>null</CODE> if there is none.
    */
-  public DN getMatchedDN()
+  public final DN getMatchedDN()
   {
     assert debugEnter(CLASS_NAME, "getMatchedDN");
 
@@ -262,10 +273,10 @@
   /**
    * Retrieves the set of referral URLs for this directory exception.
    *
-   * @return  The set of referral URLs for this directory exception, or
-   *          <CODE>null</CODE> if there are none.
+   * @return  The set of referral URLs for this directory exception,
+   *          or <CODE>null</CODE> if there are none.
    */
-  public List<String> getReferralURLs()
+  public final List<String> getReferralURLs()
   {
     assert debugEnter(CLASS_NAME, "getReferralURLs");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/Entry.java b/opendj-sdk/opends/src/server/org/opends/server/types/Entry.java
index fa2ccd2..9239ae6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/Entry.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/Entry.java
@@ -46,9 +46,7 @@
 import org.opends.server.api.AttributeValueDecoder;
 import org.opends.server.api.ProtocolElement;
 import org.opends.server.api.plugin.LDIFPluginResult;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.LockManager;
 import org.opends.server.core.PluginConfigManager;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.util.LDIFException;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/FilePermission.java b/opendj-sdk/opends/src/server/org/opends/server/types/FilePermission.java
index a48f3c4..69c165c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/FilePermission.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/FilePermission.java
@@ -33,7 +33,6 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 
 import static org.opends.server.config.ConfigConstants.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/InitializationException.java b/opendj-sdk/opends/src/server/org/opends/server/types/InitializationException.java
similarity index 73%
rename from opendj-sdk/opends/src/server/org/opends/server/core/InitializationException.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/InitializationException.java
index cf684a4..c0423dc 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/InitializationException.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/InitializationException.java
@@ -24,7 +24,7 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
@@ -33,8 +33,8 @@
 
 
 /**
- * This class defines an exception that may be thrown if a problem occurs while
- * trying to initialize a Directory Server component.
+ * This class defines an exception that may be thrown if a problem
+ * occurs while trying to initialize a Directory Server component.
  */
 public class InitializationException
        extends Exception
@@ -43,32 +43,34 @@
    * The fully-qualified name of this class for debugging purposes.
    */
   private static final String CLASS_NAME =
-       "org.opends.server.core.InitializationException";
+       "org.opends.server.types.InitializationException";
 
 
 
   /**
-   * The serial version identifier required to satisfy the compiler because this
-   * class extends <CODE>java.lang.Exception</CODE>, which implements the
-   * <CODE>java.io.Serializable</CODE> interface.  This value was generated
-   * using the <CODE>serialver</CODE> command-line utility included with the
-   * Java SDK.
+   * The serial version identifier required to satisfy the compiler
+   * because this class extends <CODE>java.lang.Exception</CODE>,
+   * which implements the <CODE>java.io.Serializable</CODE> interface.
+   * This value was generated using the <CODE>serialver</CODE>
+   * command-line utility included with the Java SDK.
    */
   private static final long serialVersionUID = -6121147544833914730L;
 
 
 
-  // The message ID for the message associated with this initialization
-  // exception.
-  private int messageID;
+  // The message ID for the message associated with this
+  // initialization exception.
+  private final int messageID;
 
 
 
   /**
    * Creates a new initialization exception with the provided message.
    *
-   * @param  messageID  The unique identifier for the associated message.
-   * @param  message    The message that explains the problem that occurred.
+   * @param  messageID  The unique identifier for the associated
+   *                    message.
+   * @param  message    The message that explains the problem that
+   *                    occurred.
    */
   public InitializationException(int messageID, String message)
   {
@@ -82,14 +84,18 @@
 
 
   /**
-   * Creates a new initialization exception with the provided message and root
-   * cause.
+   * Creates a new initialization exception with the provided message
+   * and root cause.
    *
-   * @param  messageID  The unique identifier for the associated message.
-   * @param  message    The message that explains the problem that occurred.
-   * @param  cause      The exception that was caught to trigger this exception.
+   * @param  messageID  The unique identifier for the associated
+   *                    message.
+   * @param  message    The message that explains the problem that
+   *                    occurred.
+   * @param  cause      The exception that was caught to trigger this
+   *                    exception.
    */
-  public InitializationException(int messageID, String message, Throwable cause)
+  public InitializationException(int messageID, String message,
+                                 Throwable cause)
   {
     super(message, cause);
 
@@ -106,7 +112,7 @@
    *
    * @return  The unique identifier for the associated message.
    */
-  public int getMessageID()
+  public final int getMessageID()
   {
     assert debugEnter(CLASS_NAME, "getMessageID");
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/InvokableMethod.java b/opendj-sdk/opends/src/server/org/opends/server/types/InvokableMethod.java
index 85da4ff..4ae30d8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/InvokableMethod.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/InvokableMethod.java
@@ -35,7 +35,6 @@
 
 import org.opends.server.api.InvokableComponent;
 import org.opends.server.config.ConfigAttribute;
-import org.opends.server.core.DirectoryException;
 
 import static org.opends.server.loggers.Debug.*;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java b/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
index f9ed46f..38aa628 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
@@ -33,7 +33,6 @@
 import java.util.LinkedList;
 import java.util.StringTokenizer;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 
 import static org.opends.server.loggers.Debug.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LDIFExportConfig.java b/opendj-sdk/opends/src/server/org/opends/server/types/LDIFExportConfig.java
index c9013ab..5dd29ec 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LDIFExportConfig.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LDIFExportConfig.java
@@ -40,8 +40,6 @@
 import java.util.Set;
 import java.util.zip.GZIPOutputStream;
 
-import org.opends.server.core.DirectoryException;
-
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.MessageHandler.*;
 import static org.opends.server.messages.UtilityMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LDIFImportConfig.java b/opendj-sdk/opends/src/server/org/opends/server/types/LDIFImportConfig.java
index 0f00eab..c4cbff2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LDIFImportConfig.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LDIFImportConfig.java
@@ -46,7 +46,6 @@
 import java.util.Set;
 import java.util.zip.GZIPInputStream;
 
-import org.opends.server.core.DirectoryException;
 import org.opends.server.tools.makeldif.MakeLDIFInputStream;
 import org.opends.server.tools.makeldif.TemplateFile;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
new file mode 100644
index 0000000..18a480f
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
@@ -0,0 +1,836 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types;
+
+
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import static org.opends.server.loggers.Debug.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a Directory Server component that can keep track
+ * of all locks needed throughout the Directory Server.  It is
+ * intended primarily for entry locking but support for other types of
+ * objects might be added in the future.
+ */
+public class LockManager
+{
+  /**
+   * The fully-qualified name of this class for debugging purposes.
+   */
+  private static final String CLASS_NAME =
+       "org.opends.server.types.LockManager";
+
+
+
+  /**
+   * The number of buckets into which the set of global DN locks will
+   * be broken.
+   */
+  public static final int NUM_GLOBAL_DN_LOCKS =
+       (10 * Runtime.getRuntime().availableProcessors());
+
+
+
+  /**
+   * The initial capacity to use for the DN lock hashtable.
+   */
+  public static final int DN_TABLE_INITIAL_SIZE = 50;
+
+
+
+  /**
+   * The load factor to use for the DN lock hashtable.
+   */
+  public static final float DN_TABLE_LOAD_FACTOR = 0.75F;
+
+
+
+  /**
+   * The default length of time in milliseconds to wait while
+   * attempting to acquire a read or write lock.
+   */
+  public static final long DEFAULT_TIMEOUT = 3000;
+
+
+
+  // The set of global DN locks that we need to ensure thread safety
+  // for all of the other operations.
+  private static ReentrantLock[] globalDNLocks;
+
+  // The set of entry locks that the server knows about.
+  private static ConcurrentHashMap<DN,ReentrantReadWriteLock>
+                      entryLocks;
+
+
+
+  // Initialize all of the lock variables.
+  static
+  {
+    // Create the set of global DN locks.
+    globalDNLocks = new ReentrantLock[NUM_GLOBAL_DN_LOCKS];
+    for (int i=0; i < NUM_GLOBAL_DN_LOCKS; i++)
+    {
+      globalDNLocks[i] = new ReentrantLock();
+    }
+
+
+    // Create an empty table for holding the entry locks.
+    entryLocks = new ConcurrentHashMap<DN,ReentrantReadWriteLock>(
+         DN_TABLE_INITIAL_SIZE, DN_TABLE_LOAD_FACTOR,
+         NUM_GLOBAL_DN_LOCKS);
+  }
+
+
+
+  /**
+   * Attempts to acquire a read lock on the specified entry.  It will
+   * succeed only if the lock is not already held.  If any blocking is
+   * required, then this call will fail rather than block.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the read
+   *                  lock.
+   *
+   * @return  The read lock that was acquired, or <CODE>null</CODE> if
+   *          it was not possible to obtain a read lock for some
+   *          reason.
+   */
+  public static final Lock tryLockRead(DN entryDN)
+  {
+    assert debugEnter(CLASS_NAME, "tryLockRead",
+                      String.valueOf(entryDN));
+
+
+    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
+
+
+    // Get the hash code for the provided entry DN and determine which
+    // global lock to acquire.  This will ensure that no two threads
+    // will be allowed to lock or unlock the same entry at any given
+    // time, but should allow other entries with different hash codes
+    // to be processed.
+    ReentrantLock globalLock;
+    try
+    {
+      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
+      if (! globalLock.tryLock())
+      {
+        return null;
+      }
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockRead", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME,  "lockRead",
+                  "Unexpected exception while trying to obtain the " +
+                  "global lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+
+
+
+    // At this point we have the global lock for this bucket.  We must
+    // use a try/catch/finally block to ensure that the global lock is
+    // always released no matter what.
+    try
+    {
+      // Now check to see if the entry is already in the lock table.
+      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
+      if (entryLock == null)
+      {
+        // No lock exists for the entry.  Create one and put it in the
+        // table.
+        entryLock = new ReentrantReadWriteLock();
+        if (entryLock.readLock().tryLock())
+        {
+          entryLocks.put(entryDN, entryLock);
+          return entryLock.readLock();
+        }
+        else
+        {
+          // This should never happen since we just created the lock.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
+                      "Unable to acquire read lock on " +
+                      "newly-created lock for entry " +
+                      entryDN.toString());
+          return null;
+        }
+      }
+      else
+      {
+        // There is already a lock for the entry.  Try to get its read
+        // lock.
+        if (entryLock.readLock().tryLock())
+        {
+          // We got the read lock.  We don't need to do anything else.
+          return entryLock.readLock();
+        }
+        else
+        {
+          // We couldn't get the read lock.  Write a debug message.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.WARNING, CLASS_NAME,
+                      "lockRead",
+                      "Unable to acquire a read lock for entry " +
+                      entryDN.toString() + " that was already " +
+                      "present in the lock table.");
+          return null;
+        }
+      }
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockRead", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
+                  "Unexpected exception while trying to obtain a " +
+                  "read lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+    finally
+    {
+      // This will always be called even after a return.
+      globalLock.unlock();
+    }
+  }
+
+
+
+  /**
+   * Attempts to acquire a read lock for the specified entry.
+   * Multiple threads can hold the read lock concurrently for an entry
+   * as long as the write lock is held.  If the write lock is held,
+   * then no other read or write locks will be allowed for that entry
+   * until the write lock is released.  A default timeout will be used
+   * for the lock.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the read
+   *                  lock.
+   *
+   * @return  The read lock that was acquired, or <CODE>null</CODE> if
+   *          it was not possible to obtain a read lock for some
+   *          reason.
+   */
+  public static final Lock lockRead(DN entryDN)
+  {
+    assert debugEnter(CLASS_NAME, "lockRead",
+                      String.valueOf(entryDN));
+
+    return lockRead(entryDN, DEFAULT_TIMEOUT);
+  }
+
+
+
+  /**
+   * Attempts to acquire a read lock for the specified entry.
+   * Multiple threads can hold the read lock concurrently for an entry
+   * as long as the write lock is held.  If the write lock is held,
+   * then no other read or write locks will be allowed for that entry
+   * until the write lock is released.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the read
+   *                  lock.
+   * @param  timeout  The maximum length of time in milliseconds to
+   *                  wait for the lock before timing out.
+   *
+   * @return  The read lock that was acquired, or <CODE>null</CODE> if
+   *          it was not possible to obtain a read lock for some
+   *          reason.
+   */
+  public static final Lock lockRead(DN entryDN, long timeout)
+  {
+    assert debugEnter(CLASS_NAME, "lockRead", String.valueOf(entryDN),
+                      String.valueOf(timeout));
+
+
+    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
+
+
+    // Get the hash code for the provided entry DN and determine which
+    // global lock to acquire.  This will ensure that no two threads
+    // will be allowed to lock or unlock the same entry at any given
+    // time, but should allow other entries with different hash codes
+    // to be processed.
+    ReentrantLock globalLock;
+    try
+    {
+      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
+      if (! globalLock.tryLock(timeout, TimeUnit.MILLISECONDS))
+      {
+        return null;
+      }
+    }
+    catch (InterruptedException ie)
+    {
+      assert debugException(CLASS_NAME, "lockRead", ie);
+
+      // This is fine.  The thread trying to acquire the lock was
+      // interrupted.
+      return null;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockRead", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
+                  "Unexpected exception while trying to obtain the " +
+                  "global lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+
+
+
+    // At this point we have the global lock for this bucket.  We must
+    // use a try/catch/finally block to ensure that the global lock is
+    // always released no matter what.
+    try
+    {
+      // Now check to see if the entry is already in the lock table.
+      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
+      if (entryLock == null)
+      {
+        // No lock exists for the entry.  Create one and put it in the
+        // table.
+        entryLock = new ReentrantReadWriteLock();
+        if (entryLock.readLock().tryLock(timeout,
+                                         TimeUnit.MILLISECONDS))
+        {
+          entryLocks.put(entryDN, entryLock);
+          return entryLock.readLock();
+        }
+        else
+        {
+          // This should never happen since we just created the lock.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
+                      "Unable to acquire read lock on " +
+                      "newly-created lock for entry " +
+                      entryDN.toString());
+          return null;
+        }
+      }
+      else
+      {
+        // There is already a lock for the entry.  Try to get its read
+        // lock.
+        if (entryLock.readLock().tryLock(timeout,
+                                         TimeUnit.MILLISECONDS))
+        {
+          // We got the read lock.  We don't need to do anything else.
+          return entryLock.readLock();
+        }
+        else
+        {
+          // We couldn't get the read lock.  Write a debug message.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.WARNING, CLASS_NAME,
+                      "lockRead",
+                      "Unable to acquire a read lock for entry " +
+                      entryDN.toString() + " that was already " +
+                      "present in the lock table.");
+          return null;
+        }
+      }
+    }
+    catch (InterruptedException ie)
+    {
+      assert debugException(CLASS_NAME, "lockRead", ie);
+
+      // This is fine.  The thread trying to acquire the lock was
+      // interrupted.
+      return null;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockRead", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockRead",
+                  "Unexpected exception while trying to obtain a " +
+                  "read lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+    finally
+    {
+      // This will always be called even after a return.
+      globalLock.unlock();
+    }
+  }
+
+
+
+  /**
+   * Attempts to acquire a write lock on the specified entry.  It will
+   * succeed only if the lock is not already held.  If any blocking is
+   * required, then this call will fail rather than block.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the
+   *                  write lock.
+   *
+   * @return  The write lock that was acquired, or <CODE>null</CODE>
+   *          if it was not possible to obtain a write lock for some
+   *          reason.
+   */
+  public static final Lock tryLockWrite(DN entryDN)
+  {
+    assert debugEnter(CLASS_NAME, "lockWrite",
+                      String.valueOf(entryDN));
+
+
+    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
+
+
+    // Get the hash code for the provided entry DN and determine which
+    // global lock to acquire.  This will ensure that no two threads
+    // will be allowed to lock or unlock the same entry at any given
+    // time, but should allow other entries with different hash codes
+    // to be processed.
+    ReentrantLock globalLock;
+    try
+    {
+      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
+      if (! globalLock.tryLock())
+      {
+        return null;
+      }
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                  "Unexpected exception while trying to obtain the " +
+                  "global lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+
+
+
+    // At this point we have the global lock for this bucket.  We must
+    // use a try/catch/finally block to ensure that the global lock is
+    // always released no matter what.
+    try
+    {
+      // Now check to see if the entry is already in the lock table.
+      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
+      if (entryLock == null)
+      {
+        // No lock exists for the entry.  Create one and put it in the
+        // table.
+        entryLock = new ReentrantReadWriteLock();
+        if (entryLock.writeLock().tryLock())
+        {
+          entryLocks.put(entryDN, entryLock);
+          return entryLock.writeLock();
+        }
+        else
+        {
+          // This should never happen since we just created the lock.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                      "Unable to acquire write lock on " +
+                      "newly-created lock for entry " +
+                      entryDN.toString());
+          return null;
+        }
+      }
+      else
+      {
+        // There is already a lock for the entry.  Try to get its
+        // write lock.
+        if (entryLock.writeLock().tryLock())
+        {
+          // We got the write lock.  We don't need to do anything
+          // else.
+          return entryLock.writeLock();
+        }
+        else
+        {
+          // We couldn't get the write lock.  Write a debug message.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.WARNING, CLASS_NAME,
+                      "lockWrite",
+                      "Unable to acquire the write lock for entry " +
+                      entryDN.toString() + " that was already " +
+                      "present in the lock table.");
+          return null;
+        }
+      }
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                  "Unexpected exception while trying to obtain the " +
+                  "write lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+    finally
+    {
+      // This will always be called even after a return.
+      globalLock.unlock();
+    }
+  }
+
+
+
+  /**
+   * Attempts to acquire the write lock for the specified entry.  Only
+   * a single thread may hold the write lock for an entry at any given
+   * time, and during that time no read locks may be held for it.  A
+   * default timeout will be used for the lock.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the
+   *                  write lock.
+   *
+   * @return  The write lock that was acquired, or <CODE>null</CODE>
+   *          if it was not possible to obtain a read lock for some
+   *          reason.
+   */
+  public static final Lock lockWrite(DN entryDN)
+  {
+    assert debugEnter(CLASS_NAME, "lockRead",
+                      String.valueOf(entryDN));
+
+    return lockWrite(entryDN, DEFAULT_TIMEOUT);
+  }
+
+
+
+  /**
+   * Attempts to acquire the write lock for the specified entry.  Only
+   * a single thread may hold the write lock for an entry at any given
+   * time, and during that time no read locks may be held for it.
+   *
+   * @param  entryDN  The DN of the entry for which to obtain the
+   *                  write lock.
+   * @param  timeout  The maximum length of time in milliseconds to
+   *                  wait for the lock before timing out.
+   *
+   * @return  The write lock that was acquired, or <CODE>null</CODE>
+   *          if it was not possible to obtain a read lock for some
+   *          reason.
+   */
+  public static final Lock lockWrite(DN entryDN, long timeout)
+  {
+    assert debugEnter(CLASS_NAME, "lockWrite",
+                      String.valueOf(entryDN),
+                      String.valueOf(timeout));
+
+
+    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
+
+
+    // Get the hash code for the provided entry DN and determine which
+    // global lock to acquire.  This will ensure that no two threads
+    // will be allowed to lock or unlock the same entry at any given
+    // time, but should allow other entries with different hash codes
+    // to be processed.
+    ReentrantLock globalLock;
+    try
+    {
+      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
+      if (! globalLock.tryLock(timeout, TimeUnit.MILLISECONDS))
+      {
+        return null;
+      }
+    }
+    catch (InterruptedException ie)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", ie);
+
+      // This is fine.  The thread trying to acquire the lock was
+      // interrupted.
+      return null;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                  "Unexpected exception while trying to obtain the " +
+                  "global lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+
+
+
+    // At this point we have the global lock for this bucket.  We must
+    // use a try/catch/finally block to ensure that the global lock is
+    // always released no matter what.
+    try
+    {
+      // Now check to see if the entry is already in the lock table.
+      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
+      if (entryLock == null)
+      {
+        // No lock exists for the entry.  Create one and put it in the
+        // table.
+        entryLock = new ReentrantReadWriteLock();
+        if (entryLock.writeLock().tryLock(timeout,
+                                          TimeUnit.MILLISECONDS))
+        {
+          entryLocks.put(entryDN, entryLock);
+          return entryLock.writeLock();
+        }
+        else
+        {
+          // This should never happen since we just created the lock.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                      "Unable to acquire write lock on " +
+                      "newly-created lock for entry " +
+                      entryDN.toString());
+          return null;
+        }
+      }
+      else
+      {
+        // There is already a lock for the entry.  Try to get its
+        // write lock.
+        if (entryLock.writeLock().tryLock(timeout,
+                                          TimeUnit.MILLISECONDS))
+        {
+          // We got the write lock.  We don't need to do anything
+          // else.
+          return entryLock.writeLock();
+        }
+        else
+        {
+          // We couldn't get the write lock.  Write a debug message.
+          assert debugMessage(DebugLogCategory.CORE_SERVER,
+                      DebugLogSeverity.WARNING, CLASS_NAME,
+                      "lockWrite",
+                      "Unable to acquire the write lock for entry " +
+                      entryDN.toString() + " that was already " +
+                      "present in the lock table.");
+          return null;
+        }
+      }
+    }
+    catch (InterruptedException ie)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", ie);
+
+      // This is fine.  The thread trying to acquire the lock was
+      // interrupted.
+      return null;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "lockWrite", e);
+
+      // This is not fine.  Some unexpected error occurred.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "lockWrite",
+                  "Unexpected exception while trying to obtain the " +
+                  "write lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return null;
+    }
+    finally
+    {
+      // This will always be called even after a return.
+      globalLock.unlock();
+    }
+  }
+
+
+
+  /**
+   * Releases a read or write lock held on the specified entry.
+   *
+   * @param  entryDN  The DN of the entry for which to release the
+   *                  lock.
+   * @param  lock     The read or write lock held for the entry.
+   */
+  public static final void unlock(DN entryDN, Lock lock)
+  {
+    assert debugEnter(CLASS_NAME, "unlock", String.valueOf(entryDN));
+
+
+    // Unlock the entry without grabbing any additional locks.
+    try
+    {
+      lock.unlock();
+    }
+    catch (Exception e)
+    {
+      // This should never happen.  However, if it does, then just
+      // capture the exception and continue because it may still be
+      // necessary to remove the lock for the entry from the table.
+      assert debugException(CLASS_NAME, "unlock", e);
+    }
+
+
+    int hashCode = (entryDN.hashCode() & 0x7FFFFFFF);
+
+
+    // Now grab the global lock for the entry and check to see if we
+    // can remove it from the table.
+    ReentrantLock globalLock;
+    try
+    {
+      globalLock = globalDNLocks[hashCode % NUM_GLOBAL_DN_LOCKS];
+
+      // This will block until it acquires the lock or until it is
+      // interrupted.
+      globalLock.lockInterruptibly();
+    }
+    catch (InterruptedException ie)
+    {
+      assert debugException(CLASS_NAME, "unlock", ie);
+
+      // The lock trying to acquire the lock was interrupted.  In this
+      // case, we'll just return.  The worst that could happen here is
+      // that a lock that isn't held by anything is still in the table
+      // which will just consume a little memory.
+      return;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "unlock", e);
+
+      // This is not fine.  Some unexpected error occurred.  But
+      // again, the worst that could happen is that we may not clean
+      // up an unheld lock, which isn't really that big a deal unless
+      // it happens too often.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "unlock",
+                  "Unexpected exception while trying to obtain the " +
+                  "global lock for entry " + entryDN.toString() +
+                  ":  " + stackTraceToSingleLineString(e));
+      return;
+    }
+
+
+    // At this point we have the global lock for this bucket.  We must
+    // use a try/catch/finally block to ensure that the global lock is
+    // always released no matter what.
+    try
+    {
+      ReentrantReadWriteLock entryLock = entryLocks.get(entryDN);
+      if ((entryLock != null) &&
+          (entryLock.getReadLockCount() == 0) &&
+          (! entryLock.isWriteLocked()))
+      {
+        // This lock isn't held so we can remove it from the table.
+        entryLocks.remove(entryDN);
+      }
+
+      return;
+    }
+    catch (Exception e)
+    {
+      assert debugException(CLASS_NAME, "unlock", e);
+
+      // This should never happen.
+      assert debugMessage(DebugLogCategory.CORE_SERVER,
+                  DebugLogSeverity.ERROR, CLASS_NAME, "unlock",
+                  "Unexpected exception while trying to determine " +
+                  "whether the lock for entry " + entryDN.toString() +
+                  " can be removed:  " +
+                  stackTraceToSingleLineString(e));
+      return;
+    }
+    finally
+    {
+      globalLock.unlock();
+    }
+  }
+
+
+
+  /**
+   * Removes any reference to the specified entry from the lock table.
+   * This may be helpful if there is a case where a lock has been
+   * orphaned somehow and must be removed before other threads may
+   * acquire it.
+   *
+   * @param  entryDN  The DN of the entry for which to remove the lock
+   *                  from the table.
+   *
+   * @return  The read write lock that was removed from the table, or
+   *          <CODE>null</CODE> if nothing was in the table for the
+   *          specified entry.  If a lock object is returned, it may
+   *          be possible to get information about who was holding it.
+   */
+  public static final ReentrantReadWriteLock destroyLock(DN entryDN)
+  {
+    assert debugEnter(CLASS_NAME, "destroyLock",
+                      String.valueOf(entryDN));
+
+    return entryLocks.remove(entryDN);
+  }
+
+
+
+  /**
+   * Retrieves the number of entries currently held in the lock table.
+   * Note that this may be an expensive operation.
+   *
+   * @return  The number of entries currently held in the lock table.
+   */
+  public static final int lockTableSize()
+  {
+    assert debugEnter(CLASS_NAME, "lockTableSize");
+
+    return entryLocks.size();
+  }
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/OperationType.java b/opendj-sdk/opends/src/server/org/opends/server/types/OperationType.java
similarity index 91%
rename from opendj-sdk/opends/src/server/org/opends/server/core/OperationType.java
rename to opendj-sdk/opends/src/server/org/opends/server/types/OperationType.java
index a496d18..7d6a2f9 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/OperationType.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/OperationType.java
@@ -24,13 +24,13 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
 /**
- * This enumeration defines the set of possible operation types that may be
- * processed by the Directory Server.
+ * This enumeration defines the set of possible operation types that
+ * may be processed by the Directory Server.
  */
 public enum OperationType
 {
@@ -105,14 +105,15 @@
 
 
   // The string representation of this operation type.
-  private String operationName;
+  private final String operationName;
 
 
 
   /**
    * Creates a new operation type with the provided operation name.
    *
-   * @param  operationName  The operation name for this operation type.
+   * @param  operationName  The operation name for this operation
+   *                        type.
    */
   private OperationType(String operationName)
   {
@@ -126,7 +127,7 @@
    *
    * @return  The human-readable name for this operation type.
    */
-  public String getOperationName()
+  public final String getOperationName()
   {
     return operationName;
   }
@@ -138,7 +139,7 @@
    *
    * @return  A string representation of this operation type.
    */
-  public String toString()
+  public final String toString()
   {
     return operationName;
   }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/RDN.java b/opendj-sdk/opends/src/server/org/opends/server/types/RDN.java
index 4256c8e..9fc3a9b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/RDN.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/RDN.java
@@ -33,9 +33,8 @@
 import java.util.List;
 import java.util.TreeSet;
 
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
+import org.opends.server.protocols.asn1.ASN1OctetString;
 
 import static org.opends.server.loggers.Debug.*;
 import static org.opends.server.messages.CoreMessages.*;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/Schema.java b/opendj-sdk/opends/src/server/org/opends/server/types/Schema.java
new file mode 100644
index 0000000..0c28e66
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/Schema.java
@@ -0,0 +1,2381 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types;
+
+
+
+import java.util.LinkedHashSet;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.opends.server.api.ApproximateMatchingRule;
+import org.opends.server.api.AttributeSyntax;
+import org.opends.server.api.EqualityMatchingRule;
+import org.opends.server.api.MatchingRule;
+import org.opends.server.api.OrderingMatchingRule;
+import org.opends.server.api.SubstringMatchingRule;
+import org.opends.server.protocols.asn1.ASN1OctetString;
+
+import static org.opends.server.loggers.Debug.*;
+import static org.opends.server.messages.CoreMessages.*;
+import static org.opends.server.messages.MessageHandler.*;
+import static org.opends.server.util.StaticUtils.*;
+
+
+
+/**
+ * This class defines a data structure that holds information about
+ * the components of the Directory Server schema.  It includes the
+ * following kinds of elements:
+ *
+ * <UL>
+ *   <LI>Attribute type definitions</LI>
+ *   <LI>Objectclass definitions</LI>
+ *   <LI>Attribute syntax definitions</LI>
+ *   <LI>Matching rule definitions</LI>
+ *   <LI>Matching rule use definitions</LI>
+ *   <LI>DIT content rule definitions</LI>
+ *   <LI>DIT structure rule definitions</LI>
+ *   <LI>Name form definitions</LI>
+ * </UL>
+ */
+public class Schema
+{
+  /**
+   * The fully-qualified name of this class for debugging purposes.
+   */
+  private static final String CLASS_NAME =
+       "org.opends.server.types.Schema";
+
+
+
+  // The set of attribute type definitions for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // attribute type itself.
+  private ConcurrentHashMap<String,AttributeType> attributeTypes;
+
+  // The set of objectclass definitions for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // objectclass itself.
+  private ConcurrentHashMap<String,ObjectClass> objectClasses;
+
+  // The set of attribute syntaxes for this schema, mapped between the
+  // OID for the syntax and the syntax itself.
+  private ConcurrentHashMap<String,AttributeSyntax> syntaxes;
+
+  // The entire set of matching rules for this schema, mapped between
+  // the lowercase names and OID for the definition and the matching
+  // rule itself.
+  private ConcurrentHashMap<String,MatchingRule> matchingRules;
+
+  // The set of approximate matching rules for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // matching rule itself.
+  private ConcurrentHashMap<String,ApproximateMatchingRule>
+               approximateMatchingRules;
+
+  // The set of equality matching rules for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // matching rule itself.
+  private ConcurrentHashMap<String,EqualityMatchingRule>
+               equalityMatchingRules;
+
+  // The set of ordering matching rules for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // matching rule itself.
+  private ConcurrentHashMap<String,OrderingMatchingRule>
+               orderingMatchingRules;
+
+  // The set of substring matching rules for this schema, mapped
+  // between the lowercase names and OID for the definition and the
+  // matching rule itself.
+  private ConcurrentHashMap<String,SubstringMatchingRule>
+               substringMatchingRules;
+
+  // The set of matching rule uses for this schema, mapped between the
+  // matching rule for the definition and the matching rule use
+  // itself.
+  private ConcurrentHashMap<MatchingRule,MatchingRuleUse>
+               matchingRuleUses;
+
+  // The set of DIT content rules for this schema, mapped between the
+  // structural objectclass for the definition and the DIT content
+  // rule itself.
+  private ConcurrentHashMap<ObjectClass,DITContentRule>
+               ditContentRules;
+
+  // The set of DIT structure rules for this schema, mapped between
+  // the name form for the definition and the DIT structure rule
+  // itself.
+  private ConcurrentHashMap<Integer,DITStructureRule>
+               ditStructureRulesByID;
+
+  // The set of DIT structure rules for this schema, mapped between
+  // the name form for the definition and the DIT structure rule
+  // itself.
+  private ConcurrentHashMap<NameForm,DITStructureRule>
+               ditStructureRulesByNameForm;
+
+  // The set of name forms for this schema, mapped between the
+  // structural objectclass for the definition and the name form
+  // itself.
+  private ConcurrentHashMap<ObjectClass,NameForm> nameFormsByOC;
+
+  // The set of name forms for this schema, mapped between the
+  // names/OID and the name form itself.
+  private ConcurrentHashMap<String,NameForm> nameFormsByName;
+
+  // The set of pre-encoded attribute syntax representations.
+  private LinkedHashSet<AttributeValue> syntaxSet;
+
+  // The set of pre-encoded attribute type representations.
+  private LinkedHashSet<AttributeValue> attributeTypeSet;
+
+  // The set of pre-encoded DIT content rule representations.
+  private LinkedHashSet<AttributeValue> ditContentRuleSet;
+
+  // The set of pre-encoded DIT structure rule representations.
+  private LinkedHashSet<AttributeValue> ditStructureRuleSet;
+
+  // The set of pre-encoded matching rule representations.
+  private LinkedHashSet<AttributeValue> matchingRuleSet;
+
+  // The set of pre-encoded matching rule use representations.
+  private LinkedHashSet<AttributeValue> matchingRuleUseSet;
+
+  // The set of pre-encoded name form representations.
+  private LinkedHashSet<AttributeValue> nameFormSet;
+
+  // The set of pre-encoded objectclass representations.
+  private LinkedHashSet<AttributeValue> objectClassSet;
+
+
+
+  /**
+   * Creates a new schema structure with all elements initialized but
+   * empty.
+   */
+  public Schema()
+  {
+    assert debugConstructor(CLASS_NAME);
+
+    attributeTypes = new ConcurrentHashMap<String,AttributeType>();
+    objectClasses = new ConcurrentHashMap<String,ObjectClass>();
+    syntaxes = new ConcurrentHashMap<String,AttributeSyntax>();
+    matchingRules = new ConcurrentHashMap<String,MatchingRule>();
+    approximateMatchingRules =
+         new ConcurrentHashMap<String,ApproximateMatchingRule>();
+    equalityMatchingRules =
+         new ConcurrentHashMap<String,EqualityMatchingRule>();
+    orderingMatchingRules =
+         new ConcurrentHashMap<String,OrderingMatchingRule>();
+    substringMatchingRules =
+         new ConcurrentHashMap<String,SubstringMatchingRule>();
+    matchingRuleUses =
+         new ConcurrentHashMap<MatchingRule,MatchingRuleUse>();
+    ditContentRules =
+         new ConcurrentHashMap<ObjectClass,DITContentRule>();
+    ditStructureRulesByID =
+         new ConcurrentHashMap<Integer,DITStructureRule>();
+    ditStructureRulesByNameForm =
+         new ConcurrentHashMap<NameForm,DITStructureRule>();
+    nameFormsByOC = new ConcurrentHashMap<ObjectClass,NameForm>();
+    nameFormsByName = new ConcurrentHashMap<String,NameForm>();
+
+
+    syntaxSet           = new LinkedHashSet<AttributeValue>();
+    attributeTypeSet    = new LinkedHashSet<AttributeValue>();
+    ditContentRuleSet   = new LinkedHashSet<AttributeValue>();
+    ditStructureRuleSet = new LinkedHashSet<AttributeValue>();
+    matchingRuleSet     = new LinkedHashSet<AttributeValue>();
+    matchingRuleUseSet  = new LinkedHashSet<AttributeValue>();
+    nameFormSet         = new LinkedHashSet<AttributeValue>();
+    objectClassSet      = new LinkedHashSet<AttributeValue>();
+  }
+
+
+
+  /**
+   * Retrieves the attribute type definitions for this schema, as a
+   * mapping between the lowercase names and OIDs for the attribute
+   * type and the attribute type itself.  Each attribute type may be
+   * associated with multiple keys (once for the OID and again for
+   * each name).  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The attribute type definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,AttributeType>
+                    getAttributeTypes()
+  {
+    assert debugEnter(CLASS_NAME, "getAttributeTypes");
+
+    return attributeTypes;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined attribute types for this schema.
+   *
+   * @return  The set of defined attribute types for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getAttributeTypeSet()
+  {
+    assert debugEnter(CLASS_NAME, "getAttributeTypeSet");
+
+    return attributeTypeSet;
+  }
+
+
+
+  /**
+   * Retrieves the attribute type definition with the specified name
+   * or OID.
+   *
+   * @param  lowerName  The name or OID of the attribute type to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested attribute type, or <CODE>null</CODE> if no
+   *          type is registered with the provided name or OID.
+   */
+  public final AttributeType getAttributeType(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getAttributeType",
+                      String.valueOf(lowerName));
+
+    return attributeTypes.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided attribute type definition with this
+   * schema.
+   *
+   * @param  attributeType      The attribute type to register with
+   *                            this schema.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another attribute
+   *                            type with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerAttributeType(AttributeType attributeType,
+                                          boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerAttributeType",
+                      String.valueOf(attributeType),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (attributeTypes)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(attributeType.getOID());
+        if (attributeTypes.containsKey(oid))
+        {
+          AttributeType conflictingType = attributeTypes.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_ATTRIBUTE_OID;
+          String message =
+               getMessage(msgID, attributeType.getNameOrOID(), oid,
+                          conflictingType.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        for (String name : attributeType.getNormalizedNames())
+        {
+          if (attributeTypes.containsKey(name))
+          {
+            AttributeType conflictingType = attributeTypes.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_ATTRIBUTE_NAME;
+            String message =
+                 getMessage(msgID, attributeType.getNameOrOID(), name,
+                            conflictingType.getNameOrOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      attributeTypes.put(toLowerCase(attributeType.getOID()),
+                         attributeType);
+
+      for (String name : attributeType.getNormalizedNames())
+      {
+        attributeTypes.put(name, attributeType);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = attributeType.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      attributeTypeSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided attribute type definition with this
+   * schema.
+   *
+   * @param  attributeType  The attribute type to deregister with this
+   *                        schema.
+   */
+  public final void deregisterAttributeType(
+                         AttributeType attributeType)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterAttributeType",
+                      String.valueOf(attributeType));
+
+    synchronized (attributeTypes)
+    {
+      attributeTypes.remove(toLowerCase(attributeType.getOID()),
+                            attributeType);
+
+      for (String name : attributeType.getNormalizedNames())
+      {
+        attributeTypes.remove(name, attributeType);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = attributeType.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      attributeTypeSet.remove(new AttributeValue(rawValue,
+                                                 normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the objectclass definitions for this schema, as a
+   * mapping between the lowercase names and OIDs for the objectclass
+   * and the objectclass itself.  Each objectclass may be associated
+   * with multiple keys (once for the OID and again for each name).
+   * The contents of the returned mapping must not be altered.
+   *
+   * @return  The objectclass definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,ObjectClass>
+                    getObjectClasses()
+  {
+    assert debugEnter(CLASS_NAME, "getObjectClasses");
+
+    return objectClasses;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined objectclasses for this schema.
+   *
+   * @return  The set of defined objectclasses for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getObjectClassSet()
+  {
+    assert debugEnter(CLASS_NAME, "getObjectClassSet");
+
+    return objectClassSet;
+  }
+
+
+
+  /**
+   * Retrieves the objectclass definition with the specified name or
+   * OID.
+   *
+   * @param  lowerName  The name or OID of the objectclass to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested objectclass, or <CODE>null</CODE> if no
+   *          class is registered with the provided name or OID.
+   */
+  public final ObjectClass getObjectClass(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getObjectClass",
+                      String.valueOf(lowerName));
+
+    return objectClasses.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided objectclass definition with this schema.
+   *
+   * @param  objectClass        The objectclass to register with this
+   *                            schema.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another objectclass
+   *                            with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>.
+   */
+  public final void registerObjectClass(ObjectClass objectClass,
+                                        boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerObjectClass",
+                      String.valueOf(objectClass),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (objectClasses)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(objectClass.getOID());
+        if (objectClasses.containsKey(oid))
+        {
+          ObjectClass conflictingClass = objectClasses.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_OBJECTCLASS_OID;
+          String message =
+               getMessage(msgID, objectClass.getNameOrOID(),
+                          oid, conflictingClass.getNameOrOID());
+          throw new DirectoryException(
+                       ResultCode.CONSTRAINT_VIOLATION, message,
+                       msgID);
+        }
+
+        for (String name : objectClass.getNormalizedNames())
+        {
+          if (objectClasses.containsKey(name))
+          {
+            ObjectClass conflictingClass = objectClasses.get(name);
+
+            int msgID = MSGID_SCHEMA_CONFLICTING_OBJECTCLASS_NAME;
+            String message =
+                 getMessage(msgID, objectClass.getNameOrOID(), name,
+                            conflictingClass.getNameOrOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      objectClasses.put(toLowerCase(objectClass.getOID()),
+                        objectClass);
+
+      for (String name : objectClass.getNormalizedNames())
+      {
+        objectClasses.put(name, objectClass);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = objectClass.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      objectClassSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided objectclass definition with this schema.
+   *
+   * @param  objectClass  The objectclass to deregister with this
+   *                      schema.
+   */
+  public final void deregisterObjectClass(ObjectClass objectClass)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterObjectClass",
+                      String.valueOf(objectClass));
+
+    synchronized (objectClasses)
+    {
+      objectClasses.remove(toLowerCase(objectClass.getOID()),
+                           objectClass);
+
+      for (String name : objectClass.getNormalizedNames())
+      {
+        objectClasses.remove(name, objectClass);
+      }
+
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = objectClass.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      objectClassSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the attribute syntax definitions for this schema, as a
+   * mapping between the OID for the syntax and the syntax itself.
+   * Each syntax should only be present once, since its only key is
+   * its OID.  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The attribute syntax definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,AttributeSyntax> getSyntaxes()
+  {
+    assert debugEnter(CLASS_NAME, "getSyntaxes");
+
+    return syntaxes;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined attribute syntaxes for this schema.
+   *
+   * @return  The set of defined attribute syntaxes for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getSyntaxSet()
+  {
+    assert debugEnter(CLASS_NAME, "getSyntaxSet");
+
+    return syntaxSet;
+  }
+
+
+
+  /**
+   * Retrieves the attribute syntax definition with the OID.
+   *
+   * @param  lowerName  The OID of the attribute syntax to retrieve,
+   *                    formatted in all lowercase characters.
+   *
+   * @return  The requested attribute syntax, or <CODE>null</CODE> if
+   *          no syntax is registered with the provided OID.
+   */
+  public final AttributeSyntax getSyntax(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getSyntax",
+                      String.valueOf(lowerName));
+
+    return syntaxes.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided attribute syntax definition with this
+   * schema.
+   *
+   * @param  syntax             The attribute syntax to register with
+   *                            this schema.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another attribute
+   *                            syntax with the same OID).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerSyntax(AttributeSyntax syntax,
+                                   boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerSyntax",
+                      String.valueOf(syntax),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (syntaxes)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(syntax.getOID());
+        if (syntaxes.containsKey(oid))
+        {
+          AttributeSyntax conflictingSyntax = syntaxes.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_SYNTAX_OID;
+          String message =
+               getMessage(msgID, syntax.getSyntaxName(),
+                          oid, conflictingSyntax.getSyntaxName());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+      }
+
+      syntaxes.put(toLowerCase(syntax.getOID()), syntax);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = syntax.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      syntaxSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided attribute syntax definition with this
+   * schema.
+   *
+   * @param  syntax  The attribute syntax to deregister with this
+   *                 schema.
+   */
+  public final void deregisterSyntax(AttributeSyntax syntax)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterSyntax",
+                      String.valueOf(syntax));
+
+    synchronized (syntaxes)
+    {
+      syntaxes.remove(toLowerCase(syntax.getOID()), syntax);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = syntax.toString();
+      ASN1OctetString rawValue = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      syntaxSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the entire set of matching rule definitions for this
+   * schema, as a mapping between the lowercase names and OIDs for the
+   * matching rule and the matching rule itself.  Each matching rule
+   * may be associated with multiple keys (once for the OID and again
+   * for each name).  This should be a superset of the sets of
+   * approximate, equality, ordering, and substring matching rules.
+   * The contents of the returned mapping must not be altered.
+   *
+   * @return  The matching rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,MatchingRule>
+                    getMatchingRules()
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRules");
+
+    return matchingRules;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined matching rules for this schema.
+   *
+   * @return  The set of defined matching rules for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getMatchingRuleSet()
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRuleSet");
+
+    return matchingRuleSet;
+  }
+
+
+
+  /**
+   * Retrieves the matching rule definition with the specified name or
+   * OID.
+   *
+   * @param  lowerName  The name or OID of the matching rule to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested matching rule, or <CODE>null</CODE> if no
+   *          rule is registered with the provided name or OID.
+   */
+  public final MatchingRule getMatchingRule(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRule",
+                      String.valueOf(lowerName));
+
+    return matchingRules.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided matching rule definition with this schema.
+   *
+   * @param  matchingRule       The matching rule to register with
+   *                            this schema.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e.,
+   *                            another matching rule with the same
+   *                            OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerMatchingRule(MatchingRule matchingRule,
+                                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerMatchingRule",
+                      String.valueOf(matchingRule),
+                      String.valueOf(overwriteExisting));
+
+    if (matchingRule instanceof ApproximateMatchingRule)
+    {
+      registerApproximateMatchingRule(
+           (ApproximateMatchingRule) matchingRule, overwriteExisting);
+    }
+    else if (matchingRule instanceof EqualityMatchingRule)
+    {
+      registerEqualityMatchingRule(
+           (EqualityMatchingRule) matchingRule, overwriteExisting);
+    }
+    else if (matchingRule instanceof OrderingMatchingRule)
+    {
+      registerOrderingMatchingRule(
+           (OrderingMatchingRule) matchingRule, overwriteExisting);
+    }
+    else if (matchingRule instanceof SubstringMatchingRule)
+    {
+      registerSubstringMatchingRule(
+           (SubstringMatchingRule) matchingRule, overwriteExisting);
+    }
+    else
+    {
+      synchronized (matchingRules)
+      {
+        if (! overwriteExisting)
+        {
+          String oid = toLowerCase(matchingRule.getOID());
+          if (matchingRules.containsKey(oid))
+          {
+            MatchingRule conflictingRule = matchingRules.get(oid);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
+            String message =
+                 getMessage(msgID, matchingRule.getNameOrOID(), oid,
+                            conflictingRule.getNameOrOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+
+          String name = matchingRule.getName();
+          if (name != null)
+          {
+            name = toLowerCase(name);
+            if (matchingRules.containsKey(name))
+            {
+              MatchingRule conflictingRule = matchingRules.get(name);
+
+              int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
+              String message =
+                   getMessage(msgID, matchingRule.getOID(), name,
+                              conflictingRule.getOID());
+              throw new DirectoryException(
+                             ResultCode.CONSTRAINT_VIOLATION, message,
+                             msgID);
+            }
+          }
+        }
+
+        matchingRules.put(toLowerCase(matchingRule.getOID()),
+                          matchingRule);
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          matchingRules.put(toLowerCase(name), matchingRule);
+        }
+
+        // We'll use an attribute value including the normalized value
+        // rather than the attribute type because otherwise it would
+        // use a very expensive matching rule (OID first component
+        // match) that would kill performance.
+        String valueString = matchingRule.toString();
+        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+        ASN1OctetString normValue =
+             new ASN1OctetString(toLowerCase(valueString));
+        matchingRuleSet.add(new AttributeValue(rawValue, normValue));
+      }
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided matching rule definition with this
+   * schema.
+   *
+   * @param  matchingRule  The matching rule to deregister with this
+   *                       schema.
+   */
+  public final void deregisterMatchingRule(MatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterMatchingRule",
+                      String.valueOf(matchingRule));
+
+    if (matchingRule instanceof ApproximateMatchingRule)
+    {
+      deregisterApproximateMatchingRule(
+           (ApproximateMatchingRule) matchingRule);
+    }
+    else if (matchingRule instanceof EqualityMatchingRule)
+    {
+      deregisterEqualityMatchingRule(
+           (EqualityMatchingRule) matchingRule);
+    }
+    else if (matchingRule instanceof OrderingMatchingRule)
+    {
+      deregisterOrderingMatchingRule(
+           (OrderingMatchingRule) matchingRule);
+    }
+    else if (matchingRule instanceof SubstringMatchingRule)
+    {
+      deregisterSubstringMatchingRule(
+           (SubstringMatchingRule) matchingRule);
+    }
+    else
+    {
+      synchronized (matchingRules)
+      {
+        matchingRules.remove(toLowerCase(matchingRule.getOID()),
+                             matchingRule);
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          matchingRules.remove(toLowerCase(name), matchingRule);
+        }
+
+
+        // We'll use an attribute value including the normalized value
+        // rather than the attribute type because otherwise it would
+        // use a very expensive matching rule (OID first component
+        // match) that would kill performance.
+        String valueString = matchingRule.toString();
+        ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+        ASN1OctetString normValue =
+             new ASN1OctetString(toLowerCase(valueString));
+        matchingRuleSet.remove(new AttributeValue(rawValue,
+                                                  normValue));
+      }
+    }
+  }
+
+
+
+  /**
+   * Retrieves the approximate matching rule definitions for this
+   * schema, as a mapping between the lowercase names and OIDs for the
+   * matching rule and the matching rule itself.  Each matching rule
+   * may be associated with multiple keys (once for the OID and again
+   * for each name).  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The approximate matching rule definitions for this
+   *          schema.
+   */
+  public final ConcurrentHashMap<String,ApproximateMatchingRule>
+                    getApproximateMatchingRules()
+  {
+    assert debugEnter(CLASS_NAME, "getApproximateMatchingRules");
+
+    return approximateMatchingRules;
+  }
+
+
+
+  /**
+   * Retrieves the approximate matching rule definition with the
+   * specified name or OID.
+   *
+   * @param  lowerName  The name or OID of the matching rule to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested matching rule, or <CODE>null</CODE> if no
+   *          approximate matching rule is registered with the
+   *          provided name or OID.
+   */
+  public final ApproximateMatchingRule
+                    getApproximateMatchingRule(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getApproximateMatchingRule",
+                      String.valueOf(lowerName));
+
+    return approximateMatchingRules.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided approximate matching rule with this
+   * schema.
+   *
+   * @param  matchingRule       The approximate matching rule to
+   *                            register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another matching rule
+   *                            with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerApproximateMatchingRule(
+                         ApproximateMatchingRule matchingRule,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerApproximateMatchingRule",
+                      String.valueOf(matchingRule),
+                      String.valueOf(overwriteExisting));
+
+
+    synchronized (matchingRules)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(matchingRule.getOID());
+        if (matchingRules.containsKey(oid))
+        {
+          MatchingRule conflictingRule = matchingRules.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
+          String message =
+               getMessage(msgID, matchingRule.getNameOrOID(), oid,
+                          conflictingRule.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          name = toLowerCase(name);
+          if (matchingRules.containsKey(name))
+          {
+            MatchingRule conflictingRule = matchingRules.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
+            String message =
+                 getMessage(msgID, matchingRule.getOID(), name,
+                            conflictingRule.getOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      String oid = toLowerCase(matchingRule.getOID());
+      approximateMatchingRules.put(oid, matchingRule);
+      matchingRules.put(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        approximateMatchingRules.put(name, matchingRule);
+        matchingRules.put(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided approximate matching rule definition
+   * with this schema.
+   *
+   * @param  matchingRule  The approximate matching rule to deregister
+   *                       with this schema.
+   */
+  public final void deregisterApproximateMatchingRule(
+                         ApproximateMatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterApproximateMatchingRule",
+                      String.valueOf(matchingRule));
+
+    synchronized (matchingRules)
+    {
+      String oid = matchingRule.getOID();
+      approximateMatchingRules.remove(oid, matchingRule);
+      matchingRules.remove(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        approximateMatchingRules.remove(name, matchingRule);
+        matchingRules.remove(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the equality matching rule definitions for this schema,
+   * as a mapping between the lowercase names and OIDs for the
+   * matching rule and the matching rule itself.  Each matching rule
+   * may be associated with multiple keys (once for the OID and again
+   * for each name).  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The equality matching rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,EqualityMatchingRule>
+                    getEqualityMatchingRules()
+  {
+    assert debugEnter(CLASS_NAME, "getEqualityMatchingRules");
+
+    return equalityMatchingRules;
+  }
+
+
+
+  /**
+   * Retrieves the equality matching rule definition with the
+   * specified name or OID.
+   *
+   * @param  lowerName  The name or OID of the matching rule to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested matching rule, or <CODE>null</CODE> if no
+   *          equality matching rule is registered with the provided
+   *          name or OID.
+   */
+  public final EqualityMatchingRule getEqualityMatchingRule(
+                                         String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getEqualityMatchingRule",
+                      String.valueOf(lowerName));
+
+    return equalityMatchingRules.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided equality matching rule with this schema.
+   *
+   * @param  matchingRule       The equality matching rule to
+   *                            register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another matching rule
+   *                            with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerEqualityMatchingRule(
+                         EqualityMatchingRule matchingRule,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerEqualityMatchingRule",
+                      String.valueOf(matchingRule),
+                      String.valueOf(overwriteExisting));
+
+
+    synchronized (matchingRules)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(matchingRule.getOID());
+        if (matchingRules.containsKey(oid))
+        {
+          MatchingRule conflictingRule = matchingRules.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
+          String message =
+               getMessage(msgID, matchingRule.getNameOrOID(), oid,
+                          conflictingRule.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          name = toLowerCase(name);
+          if (matchingRules.containsKey(name))
+          {
+            MatchingRule conflictingRule = matchingRules.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
+            String message =
+                 getMessage(msgID, matchingRule.getOID(), name,
+                            conflictingRule.getOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      String oid = toLowerCase(matchingRule.getOID());
+      equalityMatchingRules.put(oid, matchingRule);
+      matchingRules.put(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        equalityMatchingRules.put(name, matchingRule);
+        matchingRules.put(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided equality matching rule definition with
+   * this schema.
+   *
+   * @param  matchingRule  The equality matching rule to deregister
+   *                       with this schema.
+   */
+  public final void deregisterEqualityMatchingRule(
+                         EqualityMatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterEqualityMatchingRule",
+                      String.valueOf(matchingRule));
+
+    synchronized (matchingRules)
+    {
+      String oid = matchingRule.getOID();
+      equalityMatchingRules.remove(oid, matchingRule);
+      matchingRules.remove(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        equalityMatchingRules.remove(name, matchingRule);
+        matchingRules.remove(name, matchingRule);
+      }
+
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the ordering matching rule definitions for this schema,
+   * as a mapping between the lowercase names and OIDs for the
+   * matching rule and the matching rule itself.  Each matching rule
+   * may be associated with multiple keys (once for the OID and again
+   * for each name).  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The ordering matching rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,OrderingMatchingRule>
+                    getOrderingMatchingRules()
+  {
+    assert debugEnter(CLASS_NAME, "getOrderingMatchingRules");
+
+    return orderingMatchingRules;
+  }
+
+
+
+  /**
+   * Retrieves the ordering matching rule definition with the
+   * specified name or OID.
+   *
+   * @param  lowerName  The name or OID of the matching rule to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested matching rule, or <CODE>null</CODE> if no
+   *          ordering matching rule is registered with the provided
+   *          name or OID.
+   */
+  public final OrderingMatchingRule getOrderingMatchingRule(
+                                         String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getOrderingMatchingRule",
+                      String.valueOf(lowerName));
+
+    return orderingMatchingRules.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided ordering matching rule with this schema.
+   *
+   * @param  matchingRule       The ordering matching rule to
+   *                            register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another matching rule
+   *                            with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerOrderingMatchingRule(
+                         OrderingMatchingRule matchingRule,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerOrderingMatchingRule",
+                      String.valueOf(matchingRule),
+                      String.valueOf(overwriteExisting));
+
+
+    synchronized (matchingRules)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(matchingRule.getOID());
+        if (matchingRules.containsKey(oid))
+        {
+          MatchingRule conflictingRule = matchingRules.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
+          String message =
+               getMessage(msgID, matchingRule.getNameOrOID(), oid,
+                          conflictingRule.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          name = toLowerCase(name);
+          if (matchingRules.containsKey(name))
+          {
+            MatchingRule conflictingRule = matchingRules.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
+            String message =
+                 getMessage(msgID, matchingRule.getOID(), name,
+                            conflictingRule.getOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      String oid = toLowerCase(matchingRule.getOID());
+      orderingMatchingRules.put(oid, matchingRule);
+      matchingRules.put(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        orderingMatchingRules.put(name, matchingRule);
+        matchingRules.put(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided ordering matching rule definition with
+   * this schema.
+   *
+   * @param  matchingRule  The ordering matching rule to deregister
+   *                       with this schema.
+   */
+  public final void deregisterOrderingMatchingRule(
+                         OrderingMatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterOrderingMatchingRule",
+                      String.valueOf(matchingRule));
+
+    synchronized (matchingRules)
+    {
+      String oid = matchingRule.getOID();
+      orderingMatchingRules.remove(oid, matchingRule);
+      matchingRules.remove(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        orderingMatchingRules.remove(name, matchingRule);
+        matchingRules.remove(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the substring matching rule definitions for this
+   * schema, as a mapping between the lowercase names and OIDs for the
+   * matching rule and the matching rule itself.  Each matching rule
+   * may be associated with multiple keys (once for the OID and again
+   * for each name).  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The substring matching rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,SubstringMatchingRule>
+                    getSubstringMatchingRules()
+  {
+    assert debugEnter(CLASS_NAME, "getSubstringMatchingRules");
+
+    return substringMatchingRules;
+  }
+
+
+
+  /**
+   * Retrieves the substring matching rule definition with the
+   * specified name or OID.
+   *
+   * @param  lowerName  The name or OID of the matching rule to
+   *                    retrieve, formatted in all lowercase
+   *                    characters.
+   *
+   * @return  The requested matching rule, or <CODE>null</CODE> if no
+   *          substring matching rule is registered with the provided
+   *          name or OID.
+   */
+  public final SubstringMatchingRule getSubstringMatchingRule(
+                                          String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getSubstringMatchingRule",
+                      String.valueOf(lowerName));
+
+    return substringMatchingRules.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided substring matching rule with this schema.
+   *
+   * @param  matchingRule       The substring matching rule to
+   *                            register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another matching rule
+   *                            with the same OID or name).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerSubstringMatchingRule(
+                         SubstringMatchingRule matchingRule,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerSubstringMatchingRule",
+                      String.valueOf(matchingRule),
+                      String.valueOf(overwriteExisting));
+
+
+    synchronized (matchingRules)
+    {
+      if (! overwriteExisting)
+      {
+        String oid = toLowerCase(matchingRule.getOID());
+        if (matchingRules.containsKey(oid))
+        {
+          MatchingRule conflictingRule = matchingRules.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_OID;
+          String message =
+               getMessage(msgID, matchingRule.getNameOrOID(), oid,
+                          conflictingRule.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        String name = matchingRule.getName();
+        if (name != null)
+        {
+          name = toLowerCase(name);
+          if (matchingRules.containsKey(name))
+          {
+            MatchingRule conflictingRule = matchingRules.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_MR_NAME;
+            String message =
+                 getMessage(msgID, matchingRule.getOID(), name,
+                            conflictingRule.getOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      String oid = toLowerCase(matchingRule.getOID());
+      substringMatchingRules.put(oid, matchingRule);
+      matchingRules.put(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        substringMatchingRules.put(name, matchingRule);
+        matchingRules.put(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided substring matching rule definition with
+   * this schema.
+   *
+   * @param  matchingRule  The substring matching rule to deregister
+   *                       with this schema.
+   */
+  public final void deregisterSubstringMatchingRule(
+                         SubstringMatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterSubstringMatchingRule",
+                      String.valueOf(matchingRule));
+
+    synchronized (matchingRules)
+    {
+      String oid = matchingRule.getOID();
+      substringMatchingRules.remove(oid, matchingRule);
+      matchingRules.remove(oid, matchingRule);
+
+      String name = matchingRule.getName();
+      if (name != null)
+      {
+        name = toLowerCase(name);
+        substringMatchingRules.remove(name, matchingRule);
+        matchingRules.remove(name, matchingRule);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the matching rule use definitions for this schema, as a
+   * mapping between the matching rule for the matching rule use
+   * definition and the matching rule use itself.  Each matching rule
+   * use should only be present once, since its only key is its
+   * matching rule.  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The matching rule use definitions for this schema.
+   */
+  public final ConcurrentHashMap<MatchingRule,MatchingRuleUse>
+                    getMatchingRuleUses()
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRuleUses");
+
+    return matchingRuleUses;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined matching rule uses for this schema.
+   *
+   * @return  The set of defined matching rule uses for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getMatchingRuleUseSet()
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRuleUseSet");
+
+    return matchingRuleUseSet;
+  }
+
+
+
+  /**
+   * Retrieves the matching rule use definition for the specified
+   * matching rule.
+   *
+   * @param  matchingRule  The matching rule for which to retrieve the
+   *                       matching rule use definition.
+   *
+   * @return  The matching rule use definition, or <CODE>null</CODE>
+   *          if none exists for the specified matching rule.
+   */
+  public final MatchingRuleUse getMatchingRuleUse(
+                                    MatchingRule matchingRule)
+  {
+    assert debugEnter(CLASS_NAME, "getMatchingRuleUse",
+                      String.valueOf(matchingRule));
+
+    return matchingRuleUses.get(matchingRule);
+  }
+
+
+
+  /**
+   * Registers the provided matching rule use definition with this
+   * schema.
+   *
+   * @param  matchingRuleUse    The matching rule use definition to
+   *                            register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another matching rule
+   *                            use with the same matching rule).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerMatchingRuleUse(
+                         MatchingRuleUse matchingRuleUse,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerMatchingRuleUse",
+                      String.valueOf(matchingRuleUse),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (matchingRuleUses)
+    {
+      MatchingRule matchingRule = matchingRuleUse.getMatchingRule();
+
+      if (! overwriteExisting)
+      {
+        if (matchingRuleUses.containsKey(matchingRule))
+        {
+          MatchingRuleUse conflictingUse =
+                               matchingRuleUses.get(matchingRule);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_MATCHING_RULE_USE;
+          String message =
+               getMessage(msgID, matchingRuleUse.getName(),
+                          matchingRule.getNameOrOID(),
+                          conflictingUse.getName());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+      }
+
+      matchingRuleUses.put(matchingRule, matchingRuleUse);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRuleUse.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleUseSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided matching rule use definition with this
+   * schema.
+   *
+   * @param  matchingRuleUse  The matching rule use to deregister with
+   *                          this schema.
+   */
+  public final void deregisterMatchingRuleUse(
+                         MatchingRuleUse matchingRuleUse)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterMatchingRuleUse",
+                      String.valueOf(matchingRuleUse));
+
+    synchronized (matchingRuleUses)
+    {
+      matchingRuleUses.remove(matchingRuleUse.getMatchingRule(),
+                              matchingRuleUse);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = matchingRuleUse.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      matchingRuleUseSet.remove(new AttributeValue(rawValue,
+                                                   normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the DIT content rule definitions for this schema, as a
+   * mapping between the objectclass for the rule and the DIT content
+   * rule itself.  Each DIT content rule should only be present once,
+   * since its only key is its objectclass.  The contents of the
+   * returned mapping must not be altered.
+   *
+   * @return  The DIT content rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<ObjectClass,DITContentRule>
+                    getDITContentRules()
+  {
+    assert debugEnter(CLASS_NAME, "getDITContentRules");
+
+    return ditContentRules;
+  }
+
+
+
+  /**
+   * Retrieves the set of defined DIT content rules for this schema.
+   *
+   * @return  The set of defined DIT content rules for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getDITContentRuleSet()
+  {
+    assert debugEnter(CLASS_NAME, "getDITContentRuleSet");
+
+    return ditContentRuleSet;
+  }
+
+
+
+  /**
+   * Retrieves the DIT content rule definition for the specified
+   * objectclass.
+   *
+   * @param  objectClass  The objectclass for the DIT content rule to
+   *                      retrieve.
+   *
+   * @return  The requested DIT content rule, or <CODE>null</CODE> if
+   *          no DIT content rule is registered with the provided
+   *          objectclass.
+   */
+  public final DITContentRule getDITContentRule(
+                                   ObjectClass objectClass)
+  {
+    assert debugEnter(CLASS_NAME, "getDITContentRule",
+                      String.valueOf(objectClass));
+
+    return ditContentRules.get(objectClass);
+  }
+
+
+
+  /**
+   * Registers the provided DIT content rule definition with this
+   * schema.
+   *
+   * @param  ditContentRule     The DIT content rule to register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another DIT content
+   *                            rule with the same objectclass).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerDITContentRule(
+                          DITContentRule ditContentRule,
+                          boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerDITContentRule",
+                      String.valueOf(ditContentRule),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (ditContentRules)
+    {
+      ObjectClass objectClass = ditContentRule.getStructuralClass();
+
+      if (! overwriteExisting)
+      {
+        if (ditContentRules.containsKey(objectClass))
+        {
+          DITContentRule conflictingRule =
+                              ditContentRules.get(objectClass);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_DIT_CONTENT_RULE;
+          String message = getMessage(msgID, ditContentRule.getName(),
+                                      objectClass.getNameOrOID(),
+                                      conflictingRule.getName());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+      }
+
+      ditContentRules.put(objectClass, ditContentRule);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = ditContentRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      ditContentRuleSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided DIT content rule definition with this
+   * schema.
+   *
+   * @param  ditContentRule  The DIT content rule to deregister with
+   *                         this schema.
+   */
+  public final void deregisterDITContentRule(
+                         DITContentRule ditContentRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterDITContentRule",
+                      String.valueOf(ditContentRule));
+
+    synchronized (ditContentRules)
+    {
+      ditContentRules.remove(ditContentRule.getStructuralClass(),
+                             ditContentRule);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = ditContentRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      ditContentRuleSet.remove(new AttributeValue(rawValue,
+                                                  normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the set of defined DIT structure rules for this schema.
+   *
+   * @return  The set of defined DIT structure rules for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getDITStructureRuleSet()
+  {
+    assert debugEnter(CLASS_NAME, "getDITStructureRuleSet");
+
+    return ditStructureRuleSet;
+  }
+
+
+
+  /**
+   * Retrieves the DIT structure rule definitions for this schema, as
+   * a mapping between the rule ID for the rule and the DIT structure
+   * rule itself.  Each DIT structure rule should only be present
+   * once, since its only key is its rule ID.  The contents of the
+   * returned mapping must not be altered.
+   *
+   * @return  The DIT structure rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<Integer,DITStructureRule>
+                    getDITStructureRulesByID()
+  {
+    assert debugEnter(CLASS_NAME, "getDITStructureRulesByID");
+
+    return ditStructureRulesByID;
+  }
+
+
+
+  /**
+   * Retrieves the DIT structure rule definitions for this schema, as
+   * a mapping between the name form for the rule and the DIT
+   * structure rule itself.  Each DIT structure rule should only be
+   * present once, since its only key is its name form.  The contents
+   * of the returned mapping must not be altered.
+   *
+   * @return  The DIT structure rule definitions for this schema.
+   */
+  public final ConcurrentHashMap<NameForm,DITStructureRule>
+                    getDITStructureRulesByNameForm()
+  {
+    assert debugEnter(CLASS_NAME, "getDITStructureRulesByNameForm");
+
+    return ditStructureRulesByNameForm;
+  }
+
+
+
+  /**
+   * Retrieves the DIT structure rule definition with the provided
+   * rule ID.
+   *
+   * @param  ruleID  The rule ID for the DIT structure rule to
+   *                 retrieve.
+   *
+   * @return  The requested DIT structure rule, or <CODE>null</CODE>
+   *          if no DIT structure rule is registered with the provided
+   *          rule ID.
+   */
+  public final DITStructureRule getDITStructureRule(int ruleID)
+  {
+    assert debugEnter(CLASS_NAME, "getDITStructureRule",
+                      String.valueOf(ruleID));
+
+    return ditStructureRulesByID.get(ruleID);
+  }
+
+
+
+  /**
+   * Retrieves the DIT structure rule definition for the provided name
+   * form.
+   *
+   * @param  nameForm  The name form for the DIT structure rule to
+   *                   retrieve.
+   *
+   * @return  The requested DIT structure rule, or <CODE>null</CODE>
+   *          if no DIT structure rule is registered with the provided
+   *          name form.
+   */
+  public final DITStructureRule getDITStructureRule(NameForm nameForm)
+  {
+    assert debugEnter(CLASS_NAME, "getDITStructureRule",
+                      String.valueOf(nameForm));
+
+    return ditStructureRulesByNameForm.get(nameForm);
+  }
+
+
+
+  /**
+   * Registers the provided DIT structure rule definition with this
+   * schema.
+   *
+   * @param  ditStructureRule   The DIT structure rule to register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another DIT structure
+   *                            rule with the same name form).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerDITStructureRule(
+                         DITStructureRule ditStructureRule,
+                         boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "ditStructureRule",
+                      String.valueOf(ditStructureRule),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (ditStructureRulesByNameForm)
+    {
+      NameForm nameForm = ditStructureRule.getNameForm();
+      int      ruleID   = ditStructureRule.getRuleID();
+
+      if (! overwriteExisting)
+      {
+        if (ditStructureRulesByNameForm.containsKey(nameForm))
+        {
+          DITStructureRule conflictingRule =
+               ditStructureRulesByNameForm.get(nameForm);
+
+          int msgID =
+               MSGID_SCHEMA_CONFLICTING_DIT_STRUCTURE_RULE_NAME_FORM;
+          String message =
+               getMessage(msgID, ditStructureRule.getNameOrRuleID(),
+                          nameForm.getNameOrOID(),
+                          conflictingRule.getNameOrRuleID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        if (ditStructureRulesByID.containsKey(ruleID))
+        {
+          DITStructureRule conflictingRule =
+               ditStructureRulesByID.get(ruleID);
+
+          int msgID = MSGID_SCHEMA_CONFLICTING_DIT_STRUCTURE_RULE_ID;
+          String message =
+               getMessage(msgID, ditStructureRule.getNameOrRuleID(),
+                          ruleID, conflictingRule.getNameOrRuleID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+      }
+
+      ditStructureRulesByNameForm.put(nameForm, ditStructureRule);
+      ditStructureRulesByID.put(ruleID, ditStructureRule);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = ditStructureRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      ditStructureRuleSet.add(new AttributeValue(rawValue,
+                                                 normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided DIT structure rule definition with this
+   * schema.
+   *
+   * @param  ditStructureRule  The DIT structure rule to deregister
+   *                           with this schema.
+   */
+  public final void deregisterDITStructureRule(
+                         DITStructureRule ditStructureRule)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterDITStructureRule",
+                      String.valueOf(ditStructureRule));
+
+    synchronized (ditStructureRulesByNameForm)
+    {
+      ditStructureRulesByNameForm.remove(
+           ditStructureRule.getNameForm(), ditStructureRule);
+      ditStructureRulesByID.remove(ditStructureRule.getRuleID(),
+                                   ditStructureRule);
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = ditStructureRule.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      ditStructureRuleSet.remove(new AttributeValue(rawValue,
+                                                    normValue));
+    }
+  }
+
+
+
+  /**
+   * Retrieves the set of defined name forms for this schema.
+   *
+   * @return  The set of defined name forms for this schema.
+   */
+  public final LinkedHashSet<AttributeValue> getNameFormSet()
+  {
+    assert debugEnter(CLASS_NAME, "getNameFormSet");
+
+    return nameFormSet;
+  }
+
+
+
+  /**
+   * Retrieves the name form definitions for this schema, as a mapping
+   * between the objectclass for the name form and the name form
+   * itself.  Each name form should only be present once, since its
+   * only key is its objectclass.  The contents of the returned
+   * mapping must not be altered.
+   *
+   * @return  The name form definitions for this schema.
+   */
+  public final ConcurrentHashMap<ObjectClass,NameForm>
+                    getNameFormsByObjectClass()
+  {
+    assert debugEnter(CLASS_NAME, "getNameForms");
+
+    return nameFormsByOC;
+  }
+
+
+
+  /**
+   * Retrieves the name form definitions for this schema, as a mapping
+   * between the names/OID for the name form and the name form itself.
+   * Each name form may be present multiple times with different names
+   * and its OID.  The contents of the returned mapping must not be
+   * altered.
+   *
+   * @return  The name form definitions for this schema.
+   */
+  public final ConcurrentHashMap<String,NameForm>
+                    getNameFormsByNameOrOID()
+  {
+    assert debugEnter(CLASS_NAME, "getNameForms");
+
+    return nameFormsByName;
+  }
+
+
+
+  /**
+   * Retrieves the name form definition for the specified objectclass.
+   *
+   * @param  objectClass  The objectclass for the name form to
+   *                      retrieve.
+   *
+   * @return  The requested name form, or <CODE>null</CODE> if no name
+   *          form is registered with the provided objectClass.
+   */
+  public final NameForm getNameForm(ObjectClass objectClass)
+  {
+    assert debugEnter(CLASS_NAME, "getNameForm",
+                      String.valueOf(objectClass));
+
+    return nameFormsByOC.get(objectClass);
+  }
+
+
+
+  /**
+   * Retrieves the name form definition with the provided name or OID.
+   *
+   * @param  lowerName  The name or OID of the name form to retrieve,
+   *                    formatted in all lowercase characters.
+   *
+   * @return  The requested name form, or <CODE>null</CODE> if no name
+   *          form is registered with the provided name or OID.
+   */
+  public final NameForm getNameForm(String lowerName)
+  {
+    assert debugEnter(CLASS_NAME, "getNameForm",
+                      String.valueOf(lowerName));
+
+    return nameFormsByName.get(lowerName);
+  }
+
+
+
+  /**
+   * Registers the provided name form definition with this schema.
+   *
+   * @param  nameForm           The name form definition to register.
+   * @param  overwriteExisting  Indicates whether to overwrite an
+   *                            existing mapping if there are any
+   *                            conflicts (i.e., another name form
+   *                            with the same objectclass).
+   *
+   * @throws  DirectoryException  If a conflict is encountered and the
+   *                              <CODE>overwriteExisting</CODE> flag
+   *                              is set to <CODE>false</CODE>
+   */
+  public final void registerNameForm(NameForm nameForm,
+                                     boolean overwriteExisting)
+         throws DirectoryException
+  {
+    assert debugEnter(CLASS_NAME, "registerNameForm",
+                      String.valueOf(nameForm),
+                      String.valueOf(overwriteExisting));
+
+    synchronized (nameFormsByOC)
+    {
+      ObjectClass objectClass = nameForm.getStructuralClass();
+
+      if (! overwriteExisting)
+      {
+        if (nameFormsByOC.containsKey(objectClass))
+        {
+          NameForm conflictingNameForm =
+               nameFormsByOC.get(objectClass);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_OC;
+          String message =
+               getMessage(msgID, nameForm.getNameOrOID(),
+                          objectClass.getNameOrOID(),
+                          conflictingNameForm.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        String oid = toLowerCase(nameForm.getOID());
+        if (nameFormsByName.containsKey(oid))
+        {
+          NameForm conflictingNameForm = nameFormsByName.get(oid);
+
+          int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_OID;
+          String message =
+               getMessage(msgID, nameForm.getNameOrOID(), oid,
+                          conflictingNameForm.getNameOrOID());
+          throw new DirectoryException(
+                         ResultCode.CONSTRAINT_VIOLATION, message,
+                         msgID);
+        }
+
+        for (String name : nameForm.getNames().keySet())
+        {
+          if (nameFormsByName.containsKey(name))
+          {
+            NameForm conflictingNameForm = nameFormsByName.get(name);
+
+            int    msgID   = MSGID_SCHEMA_CONFLICTING_NAME_FORM_NAME;
+            String message =
+                 getMessage(msgID, nameForm.getNameOrOID(), oid,
+                            conflictingNameForm.getNameOrOID());
+            throw new DirectoryException(
+                           ResultCode.CONSTRAINT_VIOLATION, message,
+                           msgID);
+          }
+        }
+      }
+
+      nameFormsByOC.put(objectClass, nameForm);
+      nameFormsByName.put(toLowerCase(nameForm.getOID()), nameForm);
+
+      for (String name : nameForm.getNames().keySet())
+      {
+        nameFormsByName.put(name, nameForm);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = nameForm.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      nameFormSet.add(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided name form definition with this schema.
+   *
+   * @param  nameForm  The name form definition to deregister.
+   */
+  public final void deregisterNameForm(NameForm nameForm)
+  {
+    assert debugEnter(CLASS_NAME, "deregisterNameForm",
+                      String.valueOf(nameForm));
+
+    synchronized (nameFormsByOC)
+    {
+      nameFormsByOC.remove(nameForm.getStructuralClass(), nameForm);
+      nameFormsByName.remove(toLowerCase(nameForm.getOID()),
+                             nameForm);
+
+      for (String name : nameForm.getNames().keySet())
+      {
+        nameFormsByName.remove(name, nameForm);
+      }
+
+      // We'll use an attribute value including the normalized value
+      // rather than the attribute type because otherwise it would use
+      // a very expensive matching rule (OID first component match)
+      // that would kill performance.
+      String valueString = nameForm.toString();
+      ASN1OctetString rawValue  = new ASN1OctetString(valueString);
+      ASN1OctetString normValue =
+           new ASN1OctetString(toLowerCase(valueString));
+      nameFormSet.remove(new AttributeValue(rawValue, normValue));
+    }
+  }
+
+
+
+  /**
+   * Creates a new <CODE>Schema</CODE> object that is a duplicate of
+   * this one.  It elements may be added and removed from the
+   * duplicate without impacting this version.
+   *
+   * @return  A new <CODE>Schema</CODE> object that is a duplicate of
+   *          this one.
+   */
+  public final Schema duplicate()
+  {
+    assert debugEnter(CLASS_NAME, "duplicate");
+
+    Schema dupSchema = new Schema();
+
+    dupSchema.attributeTypes.putAll(attributeTypes);
+    dupSchema.objectClasses.putAll(objectClasses);
+    dupSchema.syntaxes.putAll(syntaxes);
+    dupSchema.matchingRules.putAll(matchingRules);
+    dupSchema.approximateMatchingRules.putAll(
+         approximateMatchingRules);
+    dupSchema.equalityMatchingRules.putAll(equalityMatchingRules);
+    dupSchema.orderingMatchingRules.putAll(orderingMatchingRules);
+    dupSchema.substringMatchingRules.putAll(substringMatchingRules);
+    dupSchema.matchingRuleUses.putAll(matchingRuleUses);
+    dupSchema.ditContentRules.putAll(ditContentRules);
+    dupSchema.ditStructureRulesByID.putAll(ditStructureRulesByID);
+    dupSchema.ditStructureRulesByNameForm.putAll(
+         ditStructureRulesByNameForm);
+    dupSchema.nameFormsByOC.putAll(nameFormsByOC);
+    dupSchema.nameFormsByName.putAll(nameFormsByName);
+    dupSchema.syntaxSet.addAll(syntaxSet);
+    dupSchema.attributeTypeSet.addAll(attributeTypeSet);
+    dupSchema.ditContentRuleSet.addAll(ditContentRuleSet);
+    dupSchema.ditStructureRuleSet.addAll(ditStructureRuleSet);
+    dupSchema.matchingRuleSet.addAll(matchingRuleSet);
+    dupSchema.matchingRuleUseSet.addAll(matchingRuleUseSet);
+    dupSchema.nameFormSet.addAll(nameFormSet);
+    dupSchema.objectClassSet.addAll(objectClassSet);
+
+    return dupSchema;
+  }
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/SearchFilter.java b/opendj-sdk/opends/src/server/org/opends/server/types/SearchFilter.java
index 4542e88..7dbd3ca 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/SearchFilter.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/SearchFilter.java
@@ -36,7 +36,6 @@
 import java.util.Set;
 
 import org.opends.server.api.MatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/InProgressOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/InProgressOperation.java
new file mode 100644
index 0000000..2f703c7
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/InProgressOperation.java
@@ -0,0 +1,417 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * plugins for operations that are currently in the middle of their
+ * "core" processing (e.g., for examining search result entries or
+ * references before they are sent to the client).  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface InProgressOperation
+{
+  /**
+   * Retrieves the operation type for this operation.
+   *
+   * @return  The operation type for this operation.
+   */
+  public OperationType getOperationType();
+
+
+
+  /**
+   * Retrieves the client connection with which this operation is
+   * associated.
+   *
+   * @return  The client connection with which this operation is
+   *          associated.
+   */
+  public ClientConnection getClientConnection();
+
+
+
+  /**
+   * Retrieves the unique identifier that is assigned to the client
+   * connection that submitted this operation.
+   *
+   * @return  The unique identifier that is assigned to the client
+   *          connection that submitted this operation.
+   */
+  public long getConnectionID();
+
+
+
+  /**
+   * Retrieves the operation ID for this operation.
+   *
+   * @return  The operation ID for this operation.
+   */
+  public long getOperationID();
+
+
+
+  /**
+   * Retrieves the message ID assigned to this operation.
+   *
+   * @return  The message ID assigned to this operation.
+   */
+  public int getMessageID();
+
+
+
+  /**
+   * Retrieves the set of controls included in the request from the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls included in the request from the
+   *          client.
+   */
+  public List<Control> getRequestControls();
+
+
+
+  /**
+   * Retrieves the set of controls to include in the response to the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls to include in the response to the
+   *          client.
+   */
+  public List<Control> getResponseControls();
+
+
+
+  /**
+   * Adds the provided control to the set of controls to include in
+   * the response to the client.
+   *
+   * @param  control  The control to add to the set of controls to
+   *                  include in the response to the client.
+   */
+  public void addResponseControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of controls to include
+   * in the response to the client.
+   *
+   * @param  control  The control to remove from the set of controls
+   *                  to include in the response to the client.
+   */
+  public void removeResponseControl(Control control);
+
+
+
+  /**
+   * Retrieves the result code for this operation.
+   *
+   * @return  The result code associated for this operation, or
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet
+   *          completed.
+   */
+  public ResultCode getResultCode();
+
+
+
+  /**
+   * Specifies the result code for this operation.
+   *
+   * @param  resultCode  The result code for this operation.
+   */
+  public void setResultCode(ResultCode resultCode);
+
+
+
+  /**
+   * Retrieves the error message for this operation.  Its contents may
+   * be altered by the caller.
+   *
+   * @return  The error message for this operation.
+   */
+  public StringBuilder getErrorMessage();
+
+
+
+  /**
+   * Specifies the error message for this operation.
+   *
+   * @param  errorMessage  The error message for this operation.
+   */
+  public void setErrorMessage(StringBuilder errorMessage);
+
+
+
+  /**
+   * Appends the provided message to the error message buffer.  If the
+   * buffer has not yet been created, then this will create it first
+   * and then add the provided message.
+   *
+   * @param  message  The message to append to the error message
+   *                  buffer.
+   */
+  public void appendErrorMessage(String message);
+
+
+
+  /**
+   * Retrieves the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.  The contents of this buffer may be altered by the
+   * caller.
+   *
+   * @return  The additional log message for this operation.
+   */
+  public StringBuilder getAdditionalLogMessage();
+
+
+
+  /**
+   * Specifies the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.
+   *
+   * @param  additionalLogMessage  The additional log message for this
+   *                               operation.
+   */
+  public void setAdditionalLogMessage(
+                   StringBuilder additionalLogMessage);
+
+
+
+  /**
+   * Appends the provided message to the additional log information
+   * for this operation.
+   *
+   * @param  message  The message that should be appended to the
+   *                  additional log information for this operation.
+   */
+  public void appendAdditionalLogMessage(String message);
+
+
+
+  /**
+   * Retrieves the matched DN for this operation.
+   *
+   * @return  The matched DN for this operation, or <CODE>null</CODE>
+   *          if the operation has not yet completed or does not have
+   *          a matched DN.
+   */
+  public DN getMatchedDN();
+
+
+
+  /**
+   * Specifies the matched DN for this operation.
+   *
+   * @param  matchedDN  The matched DN for this operation.
+   */
+  public void setMatchedDN(DN matchedDN);
+
+
+
+  /**
+   * Retrieves the set of referral URLs for this operation.  Its
+   * contents must not be altered by the caller.
+   *
+   * @return  The set of referral URLs for this operation, or
+   *          <CODE>null</CODE> if the operation is not yet complete
+   *          or does not have a set of referral URLs.
+   */
+  public List<String> getReferralURLs();
+
+
+
+  /**
+   * Specifies the set of referral URLs for this operation.
+   *
+   * @param  referralURLs  The set of referral URLs for this
+   *                       operation.
+   */
+  public void setReferralURLs(List<String> referralURLs);
+
+
+
+  /**
+   * Sets the response elements for this operation based on the
+   * information contained in the provided
+   * <CODE>DirectoryException</CODE> object.
+   *
+   * @param  directoryException  The exception containing the
+   *                             information to use for the response
+   *                             elements.
+   */
+  public void setResponseData(DirectoryException directoryException);
+
+
+
+  /**
+   * Indicates whether this is an internal operation rather than one
+   * that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is an internal operation, or
+   *          <CODE>false</CODE> if it is not.
+   */
+  public boolean isInternalOperation();
+
+
+
+  /**
+   * Indicates whether this is a synchronization operation rather than
+   * one that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is a data synchronization
+   *          operation, or <CODE>false</CODE> if it is not.
+   */
+  public boolean isSynchronizationOperation();
+
+
+
+  /**
+   * Retrieves the authorization DN for this operation.  In many
+   * cases, it will be the same as the DN of the authenticated user
+   * for the underlying connection, or the null DN if no
+   * authentication has been performed on that connection.  However,
+   * it may be some other value if special processing has been
+   * requested (e.g., the operation included a proxied authorization
+   * control).
+   *
+   * @return  The authorization DN for this operation.
+   */
+  public DN getAuthorizationDN();
+
+
+
+  /**
+   * Retrieves the set of attachments defined for this operation, as a
+   * mapping between the attachment name and the associated object.
+   *
+   * @return  The set of attachments defined for this operation.
+   */
+  public Map<String,Object> getAttachments();
+
+
+
+  /**
+   * Retrieves the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to retrieve.  It will
+   *               be treated in a case-sensitive manner.
+   *
+   * @return  The requested attachment object, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object getAttachment(String name);
+
+
+
+  /**
+   * Removes the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to remove.  It will be
+   *               treated in a case-sensitive manner.
+   *
+   * @return  The attachment that was removed, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object removeAttachment(String name);
+
+
+
+  /**
+   * Sets the value of the specified attachment.  If an attachment
+   * already exists with the same name, it will be replaced.
+   * Otherwise, a new attachment will be added.
+   *
+   * @param  name   The name to use for the attachment.
+   * @param  value  The value to use for the attachment.
+   *
+   * @return  The former value held by the attachment with the given
+   *          name, or <CODE>null</CODE> if there was previously no
+   *          such attachment.
+   */
+  public Object setAttachment(String name, Object value);
+
+
+
+  /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves the cancel request that has been issued for this
+   * operation, if there is one.
+   *
+   * @return  The cancel request that has been issued for this
+   *          operation, or <CODE>null</CODE> if there has not been
+   *          any request to cancel.
+   */
+  public CancelRequest getCancelRequest();
+
+
+
+  /**
+   * Retrieves a string representation of this operation.
+   *
+   * @return  A string representation of this operation.
+   */
+  public String toString();
+
+
+
+  /**
+   * Appends a string representation of this operation to the provided
+   * buffer.
+   *
+   * @param  buffer  The buffer into which a string representation of
+   *                 this operation should be appended.
+   */
+  public void toString(StringBuilder buffer);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAbandonOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAbandonOperation.java
new file mode 100644
index 0000000..13510b6
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAbandonOperation.java
@@ -0,0 +1,49 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for abandon operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationAbandonOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the message ID of the operation that should be
+   * abandoned.
+   *
+   * @return  The message ID of the operation that should be
+   *          abandoned.
+   */
+  public int getIDToAbandon();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAddOperation.java
new file mode 100644
index 0000000..8c6dbdb
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationAddOperation.java
@@ -0,0 +1,131 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.protocols.ldap.LDAPAttribute;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ObjectClass;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for add operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationAddOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the DN of the entry to add in a raw, unparsed form as
+   * it was included in the request.  This may or may not actually
+   * contain a valid DN, since no validation will have been performed
+   * on it.
+   *
+   * @return  The DN of the entry in a raw, unparsed form.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the set of attributes in their raw, unparsed form as
+   * read from the client request.  Some of these attributes may be
+   * invalid as no validation will have been performed on them.  The
+   * returned list must not be altered by the caller.
+   *
+   * @return  The set of attributes in their raw, unparsed form as
+   *          read from the client request.
+   */
+  public List<LDAPAttribute> getRawAttributes();
+
+
+
+  /**
+   * Retrieves the DN of the entry to add.
+   *
+   * @return  The DN of the entry to add.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of processed objectclasses for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed objectclasses for the entry to add.
+   */
+  public Map<ObjectClass,String> getObjectClasses();
+
+
+
+  /**
+   * Retrieves the set of processed user attributes for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed user attributes for the entry to
+   *          add.
+   */
+  public Map<AttributeType,List<Attribute>> getUserAttributes();
+
+
+
+  /**
+   * Retrieves the set of processed operational attributes for the
+   * entry to add.  The contents of the returned map must not be
+   * altered by the caller.
+   *
+   * @return  The set of processed operational attributes for the
+   *          entry to add.
+   */
+  public Map<AttributeType,List<Attribute>>
+              getOperationalAttributes();
+
+
+
+  /**
+   * Retrieves the entry to be added to the server.  The contents of
+   * the returned entry must not be altered by the caller.
+   *
+   * @return  The entry to be added to the server.
+   */
+  public Entry getEntryToAdd();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationBindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationBindOperation.java
new file mode 100644
index 0000000..851fa86
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationBindOperation.java
@@ -0,0 +1,197 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.types.AuthenticationType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for bind operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationBindOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the authentication type for this bind operation.
+   *
+   * @return  The authentication type for this bind operation.
+   */
+  public AuthenticationType getAuthenticationType();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed bind DN for this bind operation as
+   * contained in the client request.  The value may not actually
+   * contain a valid DN, as no validation will have been performed.
+   *
+   * @return  The raw, unprocessed bind DN for this bind operation as
+   *          contained in the client request.
+   */
+  public ByteString getRawBindDN();
+
+
+
+  /**
+   * Retrieves the bind DN for this bind operation.
+   *
+   * @return  The bind DN for this bind operation.
+   */
+  public DN getBindDN();
+
+
+
+  /**
+   * Retrieves the simple authentication password for this bind
+   * operation.
+   *
+   * @return  The simple authentication password for this bind
+   *          operation.
+   */
+  public ByteString getSimplePassword();
+
+
+
+  /**
+   * Retrieves the SASL mechanism for this bind operation.
+   *
+   * @return  The SASL mechanism for this bind operation, or
+   *          <CODE>null</CODE> if the bind does not use SASL
+   *          authentication.
+   */
+  public String getSASLMechanism();
+
+
+
+  /**
+   * Retrieves the SASL credentials for this bind operation.
+   *
+   * @return  The SASL credentials for this bind operation, or
+   *          <CODE>null</CODE> if there are none or if the bind does
+   *          not use SASL authentication.
+   */
+  public ASN1OctetString getSASLCredentials();
+
+
+
+  /**
+   * Retrieves the set of server SASL credentials to include in the
+   * bind response.
+   *
+   * @return  The set of server SASL credentials to include in the
+   *          bind response, or <CODE>null</CODE> if there are none.
+   */
+  public ASN1OctetString getServerSASLCredentials();
+
+
+
+  /**
+   * Specifies the set of server SASL credentials to include in the
+   * bind response.
+   *
+   * @param  serverSASLCredentials  The set of server SASL credentials
+   *                                to include in the bind response.
+   */
+  public void setServerSASLCredentials(ASN1OctetString
+                                            serverSASLCredentials);
+
+
+
+  /**
+   * Retrieves the user entry associated with the SASL authentication
+   * attempt.  This should be set by any SASL mechanism in which the
+   * processing was able to get far enough to make this determination,
+   * regardless of whether the authentication was ultimately
+   * successful.
+   *
+   * @return  The user entry associated with the SASL authentication
+   *          attempt, or <CODE>null</CODE> if it was not a SASL
+   *          authentication or the SASL processing was not able to
+   *          map the request to a user.
+   */
+  public Entry getSASLAuthUserEntry();
+
+
+
+  /**
+   * Retrieves a human-readable message providing the reason that the
+   * authentication failed, if available.
+   *
+   * @return  A human-readable message providing the reason that the
+   *          authentication failed, or <CODE>null</CODE> if none is
+   *          available.
+   */
+  public String getAuthFailureReason();
+
+
+
+  /**
+   * Retrieves the unique identifier for the authentication failure
+   * reason, if available.
+   *
+   * @return  The unique identifier for the authentication failure
+   *          reason, or zero if none is available.
+   */
+  public int getAuthFailureID();
+
+
+
+  /**
+   * Specifies the reason that the authentication failed.
+   *
+   * @param  id      The unique identifier for the authentication
+   *                 failure reason.
+   * @param  reason  A human-readable message providing the reason
+   *                 that the authentication failed.
+   */
+  public void setAuthFailureReason(int id, String reason);
+
+
+
+  /**
+   * Retrieves the user entry DN for this bind operation.  It will
+   * only be available if the bind processing has proceeded far enough
+   * to identify the user attempting to authenticate.
+   *
+   * @return  The user entry DN for this bind operation, or
+   *          <CODE>null</CODE> if the bind processing has not
+   *          progressed far enough to identify the user or if the
+   *          user DN could not be determined.
+   */
+  public DN getUserEntryDN();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationCompareOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationCompareOperation.java
new file mode 100644
index 0000000..993a8d4
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationCompareOperation.java
@@ -0,0 +1,101 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for compare operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationCompareOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to compare.
+   *
+   * @return  The DN of the entry to compare.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw attribute type for this compare operation.
+   *
+   * @return  The raw attribute type for this compare operation.
+   */
+  public String getRawAttributeType();
+
+
+
+  /**
+   * Retrieves the attribute type for this compare operation.
+   *
+   * @return  The attribute type for this compare operation.
+   */
+  public AttributeType getAttributeType();
+
+
+
+  /**
+   * Retrieves the assertion value for this compare operation.
+   *
+   * @return  The assertion value for this compare operation.
+   */
+  public ByteString getAssertionValue();
+
+
+
+  /**
+   * Retrieves the entry to target with the compare operation.
+   *
+   * @return  The entry to target with the compare operation.
+   */
+  public Entry getEntryToCompare();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationDeleteOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationDeleteOperation.java
new file mode 100644
index 0000000..7ecd551
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationDeleteOperation.java
@@ -0,0 +1,73 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for delete operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationDeleteOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to delete.
+   *
+   * @return  The DN of the entry to delete.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the entry to be deleted.
+   *
+   * @return  The entry to be deleted.
+   */
+  public Entry getEntryToDelete();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationExtendedOperation.java
new file mode 100644
index 0000000..6b5fe60
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationExtendedOperation.java
@@ -0,0 +1,102 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for extended operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationExtendedOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the OID for the request associated with this extended
+   * operation.
+   *
+   * @return  The OID for the request associated with this extended
+   *          operation.
+   */
+  public String getRequestOID();
+
+
+
+  /**
+   * Retrieves the value for the request associated with this extended
+   * operation.
+   *
+   * @return  The value for the request associated with this extended
+   *          operation.
+   */
+  public ASN1OctetString getRequestValue();
+
+
+
+  /**
+   * Retrieves the OID to include in the response to the client.
+   *
+   * @return  The OID to include in the response to the client.
+   */
+  public String getResponseOID();
+
+
+
+  /**
+   * Specifies the OID to include in the response to the client.
+   *
+   * @param  responseOID  The OID to include in the response to the
+   *                      client.
+   */
+  public void setResponseOID(String responseOID);
+
+
+
+  /**
+   * Retrieves the value to include in the response to the client.
+   *
+   * @return  The value to include in the response to the client.
+   */
+  public ASN1OctetString getResponseValue();
+
+
+
+  /**
+   * Specifies the value to include in the response to the client.
+   *
+   * @param  responseValue  The value to include in the response to
+   *                        the client.
+   */
+  public void setResponseValue(ASN1OctetString responseValue);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyDNOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyDNOperation.java
new file mode 100644
index 0000000..6ea1fc6
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyDNOperation.java
@@ -0,0 +1,184 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+import org.opends.server.types.RDN;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for modify DN operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationModifyDNOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to rename.  This should not be
+   * called by pre-parse plugins because the processed DN will not be
+   * available yet.  Instead, they should call the
+   * <CODE>getRawEntryDN</CODE> method.
+   *
+   * @return  The DN of the entry to rename, or <CODE>null</CODE> if
+   *          the raw entry DN has not yet been processed.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newRDN as included in the request
+   * from the client.  This may or may not contain a valid RDN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newRDN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawNewRDN();
+
+
+
+  /**
+   * Retrieves the new RDN to use for the entry.  This should not be
+   * called by pre-parse plugins, because the processed newRDN will
+   * not yet be available.  Pre-parse plugins should instead use the
+   * <CODE>getRawNewRDN</CODE> method.
+   *
+   * @return  The new RDN to use for the entry, or <CODE>null</CODE>
+   *          if the raw newRDN has not yet been processed.
+   */
+  public RDN getNewRDN();
+
+
+
+  /**
+   * Indicates whether the current RDN value should be removed from
+   * the entry.
+   *
+   * @return  <CODE>true</CODE> if the current RDN value should be
+   *          removed from the entry, or <CODE>false</CODE> if not.
+   */
+  public boolean deleteOldRDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newSuperior from the client
+   * request.  This may or may not contain a valid DN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newSuperior from the client
+   *          request, or <CODE>null</CODE> if there is none.
+   */
+  public ByteString getRawNewSuperior();
+
+
+
+  /**
+   * Retrieves the newSuperior DN for the entry.  This should not be
+   * called by pre-parse plugins, because the processed DN will not
+   * yet be available at that time.  Instead, they should use the
+   * <CODE>getRawNewSuperior</CODE> method.
+   *
+   * @return  The newSuperior DN for the entry, or <CODE>null</CODE>
+   *          if there is no newSuperior DN for this request or if the
+   *          raw newSuperior has not yet been processed.
+   */
+  public DN getNewSuperior();
+
+
+
+  /**
+   * Retrieves the set of modifications applied to attributes of the
+   * target entry in the course of processing this modify DN
+   * operation.  This will include attribute-level changes from the
+   * modify DN itself (e.g., removing old RDN values if deleteOldRDN
+   * is set, or adding new RDN values that don't already exist), but
+   * it may also be used by pre-operation plugins to cause additional
+   * changes in the entry.  In this case, those plugins may add
+   * modifications to this list through the
+   * <CODE>addModification</CODE> method (the list returned from this
+   * method should not be modified directly) if any changes should be
+   * processed in addition to the core modify DN processing.  Backends
+   * may read this list to identify which attribute-level changes were
+   * applied in order to more easily apply updates to attribute
+   * indexes.
+   *
+   * @return  The set of modifications applied to attributes during
+   *          the course of the modify DN processing, or
+   *          <CODE>null</CODE> if that information is not yet
+   *          available (e.g., during pre-parse plugins).
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Retrieves the current entry, before it is renamed.  This will not
+   * be available to pre-parse plugins or during the conflict
+   * resolution portion of the synchronization processing.
+   *
+   * @return  The current entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getOriginalEntry();
+
+
+
+  /**
+   * Retrieves the new entry, as it will appear after it is renamed.
+   * This will not be  available to pre-parse plugins or during the
+   * conflict resolution portion of the synchronization processing.
+   *
+   * @return  The updated entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getUpdatedEntry();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyOperation.java
new file mode 100644
index 0000000..79601b0
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationModifyOperation.java
@@ -0,0 +1,143 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.protocols.ldap.LDAPModification;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for modify operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationModifyOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to modify.
+   *
+   * @return  The DN of the entry to modify.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of raw, unprocessed modifications as included
+   * in the client request.  Note that this may contain one or more
+   * invalid modifications, as no validation will have been performed
+   * on this information.  The list returned must not be altered by
+   * the caller.
+   *
+   * @return  The set of raw, unprocessed modifications as included
+   *          in the client request.
+   */
+  public List<LDAPModification> getRawModifications();
+
+
+
+  /**
+   * Retrieves the set of modifications for this modify operation.
+   Its contents should not be altered.
+   *
+   * @return  The set of modifications for this modify operation.
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Retrieves the current entry before any modifications are applied.
+   * It should not be modified by the caller.
+   *
+   * @return  The current entry before any modifications are applied.
+   */
+  public Entry getCurrentEntry();
+
+
+
+  /**
+   * Retrieves the modified entry that is to be written to the
+   * backend.  It should not be modified by the caller.
+   *
+   * @return  The modified entry that is to be written to the backend.
+   */
+  public Entry getModifiedEntry();
+
+
+
+  /**
+   * Retrieves the set of clear-text current passwords for the user,
+   * if available.  This will only be available if the modify
+   * operation contains one or more delete elements that target the
+   * password attribute and provide the values to delete in the clear.
+   * This list should not be altered by the caller.
+   *
+   * @return  The set of clear-text current password values as
+   *          provided in the modify request, or <CODE>null</CODE> if
+   *          there were none.
+   */
+  public List<AttributeValue> getCurrentPasswords();
+
+
+
+  /**
+   * Retrieves the set of clear-text new passwords for the user, if
+   * available.  This will only be available if the modify operation
+   * contains one or more add or replace elements that target the
+   * password attribute and provide the values in the clear.  This
+   * list should not be altered by the caller.
+   *
+   * @return  The set of clear-text new passwords as provided in the
+   *          modify request, or <CODE>null</CODE> if there were none.
+   */
+  public List<AttributeValue> getNewPasswords();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationOperation.java
new file mode 100644
index 0000000..07b937b
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationOperation.java
@@ -0,0 +1,402 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for all types of operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationOperation
+{
+  /**
+   * Retrieves the operation type for this operation.
+   *
+   * @return  The operation type for this operation.
+   */
+  public OperationType getOperationType();
+
+
+
+  /**
+   * Retrieves the client connection with which this operation is
+   * associated.
+   *
+   * @return  The client connection with which this operation is
+   *          associated.
+   */
+  public ClientConnection getClientConnection();
+
+
+
+  /**
+   * Retrieves the unique identifier that is assigned to the client
+   * connection that submitted this operation.
+   *
+   * @return  The unique identifier that is assigned to the client
+   *          connection that submitted this operation.
+   */
+  public long getConnectionID();
+
+
+
+  /**
+   * Retrieves the operation ID for this operation.
+   *
+   * @return  The operation ID for this operation.
+   */
+  public long getOperationID();
+
+
+
+  /**
+   * Retrieves the message ID assigned to this operation.
+   *
+   * @return  The message ID assigned to this operation.
+   */
+  public int getMessageID();
+
+
+
+  /**
+   * Retrieves the set of controls included in the request from the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls included in the request from the
+   *          client.
+   */
+  public List<Control> getRequestControls();
+
+
+
+  /**
+   * Retrieves the set of controls to include in the response to the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls to include in the response to the
+   *          client.
+   */
+  public List<Control> getResponseControls();
+
+
+
+  /**
+   * Adds the provided control to the set of controls to include in
+   * the response to the client.
+   *
+   * @param  control  The control to add to the set of controls to
+   *                  include in the response to the client.
+   */
+  public void addResponseControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of controls to include
+   * in the response to the client.
+   *
+   * @param  control  The control to remove from the set of controls
+   *                  to include in the response to the client.
+   */
+  public void removeResponseControl(Control control);
+
+
+
+  /**
+   * Retrieves the result code for this operation.
+   *
+   * @return  The result code associated for this operation, or
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet
+   *          completed.
+   */
+  public ResultCode getResultCode();
+
+
+
+  /**
+   * Specifies the result code for this operation.
+   *
+   * @param  resultCode  The result code for this operation.
+   */
+  public void setResultCode(ResultCode resultCode);
+
+
+
+  /**
+   * Retrieves the error message for this operation.  Its contents may
+   * be altered by the caller.
+   *
+   * @return  The error message for this operation.
+   */
+  public StringBuilder getErrorMessage();
+
+
+
+  /**
+   * Specifies the error message for this operation.
+   *
+   * @param  errorMessage  The error message for this operation.
+   */
+  public void setErrorMessage(StringBuilder errorMessage);
+
+
+
+  /**
+   * Appends the provided message to the error message buffer.  If the
+   * buffer has not yet been created, then this will create it first
+   * and then add the provided message.
+   *
+   * @param  message  The message to append to the error message
+   *                  buffer.
+   */
+  public void appendErrorMessage(String message);
+
+
+
+  /**
+   * Retrieves the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.  The contents of this buffer may be altered by the
+   * caller.
+   *
+   * @return  The additional log message for this operation.
+   */
+  public StringBuilder getAdditionalLogMessage();
+
+
+
+  /**
+   * Specifies the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.
+   *
+   * @param  additionalLogMessage  The additional log message for this
+   *                               operation.
+   */
+  public void setAdditionalLogMessage(
+                   StringBuilder additionalLogMessage);
+
+
+
+  /**
+   * Appends the provided message to the additional log information
+   * for this operation.
+   *
+   * @param  message  The message that should be appended to the
+   *                  additional log information for this operation.
+   */
+  public void appendAdditionalLogMessage(String message);
+
+
+
+  /**
+   * Retrieves the matched DN for this operation.
+   *
+   * @return  The matched DN for this operation, or <CODE>null</CODE>
+   *          if the operation has not yet completed or does not have
+   *          a matched DN.
+   */
+  public DN getMatchedDN();
+
+
+
+  /**
+   * Specifies the matched DN for this operation.
+   *
+   * @param  matchedDN  The matched DN for this operation.
+   */
+  public void setMatchedDN(DN matchedDN);
+
+
+
+  /**
+   * Retrieves the set of referral URLs for this operation.  Its
+   * contents must not be altered by the caller.
+   *
+   * @return  The set of referral URLs for this operation, or
+   *          <CODE>null</CODE> if the operation is not yet complete
+   *          or does not have a set of referral URLs.
+   */
+  public List<String> getReferralURLs();
+
+
+
+  /**
+   * Specifies the set of referral URLs for this operation.
+   *
+   * @param  referralURLs  The set of referral URLs for this
+   *                       operation.
+   */
+  public void setReferralURLs(List<String> referralURLs);
+
+
+
+  /**
+   * Sets the response elements for this operation based on the
+   * information contained in the provided
+   * <CODE>DirectoryException</CODE> object.
+   *
+   * @param  directoryException  The exception containing the
+   *                             information to use for the response
+   *                             elements.
+   */
+  public void setResponseData(DirectoryException directoryException);
+
+
+
+  /**
+   * Indicates whether this is an internal operation rather than one
+   * that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is an internal operation, or
+   *          <CODE>false</CODE> if it is not.
+   */
+  public boolean isInternalOperation();
+
+
+
+  /**
+   * Indicates whether this is a synchronization operation rather than
+   * one that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is a data synchronization
+   *          operation, or <CODE>false</CODE> if it is not.
+   */
+  public boolean isSynchronizationOperation();
+
+
+
+  /**
+   * Retrieves the authorization DN for this operation.  In many
+   * cases, it will be the same as the DN of the authenticated user
+   * for the underlying connection, or the null DN if no
+   * authentication has been performed on that connection.  However,
+   * it may be some other value if special processing has been
+   * requested (e.g., the operation included a proxied authorization
+   * control).
+   *
+   * @return  The authorization DN for this operation.
+   */
+  public DN getAuthorizationDN();
+
+
+
+  /**
+   * Retrieves the set of attachments defined for this operation, as a
+   * mapping between the attachment name and the associated object.
+   *
+   * @return  The set of attachments defined for this operation.
+   */
+  public Map<String,Object> getAttachments();
+
+
+
+  /**
+   * Retrieves the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to retrieve.  It will
+   *               be treated in a case-sensitive manner.
+   *
+   * @return  The requested attachment object, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object getAttachment(String name);
+
+
+
+  /**
+   * Removes the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to remove.  It will be
+   *               treated in a case-sensitive manner.
+   *
+   * @return  The attachment that was removed, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object removeAttachment(String name);
+
+
+
+  /**
+   * Sets the value of the specified attachment.  If an attachment
+   * already exists with the same name, it will be replaced.
+   * Otherwise, a new attachment will be added.
+   *
+   * @param  name   The name to use for the attachment.
+   * @param  value  The value to use for the attachment.
+   *
+   * @return  The former value held by the attachment with the given
+   *          name, or <CODE>null</CODE> if there was previously no
+   *          such attachment.
+   */
+  public Object setAttachment(String name, Object value);
+
+
+
+  /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves a string representation of this operation.
+   *
+   * @return  A string representation of this operation.
+   */
+  public String toString();
+
+
+
+  /**
+   * Appends a string representation of this operation to the provided
+   * buffer.
+   *
+   * @param  buffer  The buffer into which a string representation of
+   *                 this operation should be appended.
+   */
+  public void toString(StringBuilder buffer);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationSearchOperation.java
new file mode 100644
index 0000000..7c5ae56
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationSearchOperation.java
@@ -0,0 +1,173 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DN;
+import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchFilter;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for search operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationSearchOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Retrieves the base DN for this search operation.
+   *
+   * @return  The base DN for this search operation.
+   */
+  public DN getBaseDN();
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Retrieves the filter for this search operation.
+   *
+   * @return  The filter for this search operation.
+   */
+  public SearchFilter getFilter();
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+
+
+
+  /**
+   * Retrieves the number of entries sent to the client for this
+   * search operation.
+   *
+   * @return  The number of entries sent to the client for this search
+   *          operation.
+   */
+  public int getEntriesSent();
+
+
+
+  /**
+   * Retrieves the number of search references sent to the client for
+   * this search operation.
+   *
+   * @return  The number of search references sent to the client for
+   *          this search operation.
+   */
+  public int getReferencesSent();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationUnbindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationUnbindOperation.java
new file mode 100644
index 0000000..b7d5196
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostOperationUnbindOperation.java
@@ -0,0 +1,41 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-operation plugins for unbind operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostOperationUnbindOperation
+       extends PostOperationOperation
+{
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseAddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseAddOperation.java
new file mode 100644
index 0000000..f2e09ee
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseAddOperation.java
@@ -0,0 +1,131 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.protocols.ldap.LDAPAttribute;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ObjectClass;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for add operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PostResponseAddOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the DN of the entry to add in a raw, unparsed form as
+   * it was included in the request.  This may or may not actually
+   * contain a valid DN, since no validation will have been performed
+   * on it.
+   *
+   * @return  The DN of the entry in a raw, unparsed form.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the set of attributes in their raw, unparsed form as
+   * read from the client request.  Some of these attributes may be
+   * invalid as no validation will have been performed on them.  The
+   * returned list must not be altered by the caller.
+   *
+   * @return  The set of attributes in their raw, unparsed form as
+   *          read from the client request.
+   */
+  public List<LDAPAttribute> getRawAttributes();
+
+
+
+  /**
+   * Retrieves the DN of the entry to add.
+   *
+   * @return  The DN of the entry to add.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of processed objectclasses for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed objectclasses for the entry to add.
+   */
+  public Map<ObjectClass,String> getObjectClasses();
+
+
+
+  /**
+   * Retrieves the set of processed user attributes for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed user attributes for the entry to
+   *          add.
+   */
+  public Map<AttributeType,List<Attribute>> getUserAttributes();
+
+
+
+  /**
+   * Retrieves the set of processed operational attributes for the
+   * entry to add.  The contents of the returned map must not be
+   * altered by the caller.
+   *
+   * @return  The set of processed operational attributes for the
+   *          entry to add.
+   */
+  public Map<AttributeType,List<Attribute>>
+              getOperationalAttributes();
+
+
+
+  /**
+   * Retrieves the entry to be added to the server.  The contents of
+   * the returned entry must not be altered by the caller.
+   *
+   * @return  The entry to be added to the server.
+   */
+  public Entry getEntryToAdd();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseBindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseBindOperation.java
new file mode 100644
index 0000000..d5b2518
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseBindOperation.java
@@ -0,0 +1,173 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.types.AuthenticationType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for bind operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseBindOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the authentication type for this bind operation.
+   *
+   * @return  The authentication type for this bind operation.
+   */
+  public AuthenticationType getAuthenticationType();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed bind DN for this bind operation as
+   * contained in the client request.  The value may not actually
+   * contain a valid DN, as no validation will have been performed.
+   *
+   * @return  The raw, unprocessed bind DN for this bind operation as
+   *          contained in the client request.
+   */
+  public ByteString getRawBindDN();
+
+
+
+  /**
+   * Retrieves the bind DN for this bind operation.
+   *
+   * @return  The bind DN for this bind operation.
+   */
+  public DN getBindDN();
+
+
+
+  /**
+   * Retrieves the simple authentication password for this bind
+   * operation.
+   *
+   * @return  The simple authentication password for this bind
+   *          operation.
+   */
+  public ByteString getSimplePassword();
+
+
+
+  /**
+   * Retrieves the SASL mechanism for this bind operation.
+   *
+   * @return  The SASL mechanism for this bind operation, or
+   *          <CODE>null</CODE> if the bind does not use SASL
+   *          authentication.
+   */
+  public String getSASLMechanism();
+
+
+
+  /**
+   * Retrieves the SASL credentials for this bind operation.
+   *
+   * @return  The SASL credentials for this bind operation, or
+   *          <CODE>null</CODE> if there are none or if the bind does
+   *          not use SASL authentication.
+   */
+  public ASN1OctetString getSASLCredentials();
+
+
+
+  /**
+   * Retrieves the set of server SASL credentials to include in the
+   * bind response.
+   *
+   * @return  The set of server SASL credentials to include in the
+   *          bind response, or <CODE>null</CODE> if there are none.
+   */
+  public ASN1OctetString getServerSASLCredentials();
+
+
+
+  /**
+   * Retrieves the user entry associated with the SASL authentication
+   * attempt.  This should be set by any SASL mechanism in which the
+   * processing was able to get far enough to make this determination,
+   * regardless of whether the authentication was ultimately
+   * successful.
+   *
+   * @return  The user entry associated with the SASL authentication
+   *          attempt, or <CODE>null</CODE> if it was not a SASL
+   *          authentication or the SASL processing was not able to
+   *          map the request to a user.
+   */
+  public Entry getSASLAuthUserEntry();
+
+
+
+  /**
+   * Retrieves a human-readable message providing the reason that the
+   * authentication failed, if available.
+   *
+   * @return  A human-readable message providing the reason that the
+   *          authentication failed, or <CODE>null</CODE> if none is
+   *          available.
+   */
+  public String getAuthFailureReason();
+
+
+
+  /**
+   * Retrieves the unique identifier for the authentication failure
+   * reason, if available.
+   *
+   * @return  The unique identifier for the authentication failure
+   *          reason, or zero if none is available.
+   */
+  public int getAuthFailureID();
+
+
+
+  /**
+   * Retrieves the user entry DN for this bind operation.  It will
+   * only be available if the bind processing has proceeded far enough
+   * to identify the user attempting to authenticate.
+   *
+   * @return  The user entry DN for this bind operation, or
+   *          <CODE>null</CODE> if the bind processing has not
+   *          progressed far enough to identify the user or if the
+   *          user DN could not be determined.
+   */
+  public DN getUserEntryDN();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseCompareOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseCompareOperation.java
new file mode 100644
index 0000000..33cce57
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseCompareOperation.java
@@ -0,0 +1,101 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for compare operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseCompareOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to compare.
+   *
+   * @return  The DN of the entry to compare.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw attribute type for this compare operation.
+   *
+   * @return  The raw attribute type for this compare operation.
+   */
+  public String getRawAttributeType();
+
+
+
+  /**
+   * Retrieves the attribute type for this compare operation.
+   *
+   * @return  The attribute type for this compare operation.
+   */
+  public AttributeType getAttributeType();
+
+
+
+  /**
+   * Retrieves the assertion value for this compare operation.
+   *
+   * @return  The assertion value for this compare operation.
+   */
+  public ByteString getAssertionValue();
+
+
+
+  /**
+   * Retrieves the entry to target with the compare operation.
+   *
+   * @return  The entry to target with the compare operation.
+   */
+  public Entry getEntryToCompare();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseDeleteOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseDeleteOperation.java
new file mode 100644
index 0000000..f5c7ed7
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseDeleteOperation.java
@@ -0,0 +1,73 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for delete operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseDeleteOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to delete.
+   *
+   * @return  The DN of the entry to delete.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the entry to be deleted.
+   *
+   * @return  The entry to be deleted.
+   */
+  public Entry getEntryToDelete();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseExtendedOperation.java
new file mode 100644
index 0000000..21b148f
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseExtendedOperation.java
@@ -0,0 +1,82 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for extended operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseExtendedOperation
+       extends PostOperationOperation
+{
+  /**
+   * Retrieves the OID for the request associated with this extended
+   * operation.
+   *
+   * @return  The OID for the request associated with this extended
+   *          operation.
+   */
+  public String getRequestOID();
+
+
+
+  /**
+   * Retrieves the value for the request associated with this extended
+   * operation.
+   *
+   * @return  The value for the request associated with this extended
+   *          operation.
+   */
+  public ASN1OctetString getRequestValue();
+
+
+
+  /**
+   * Retrieves the OID to include in the response to the client.
+   *
+   * @return  The OID to include in the response to the client.
+   */
+  public String getResponseOID();
+
+
+
+  /**
+   * Retrieves the value to include in the response to the client.
+   *
+   * @return  The value to include in the response to the client.
+   */
+  public ASN1OctetString getResponseValue();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyDNOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyDNOperation.java
new file mode 100644
index 0000000..580374f
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyDNOperation.java
@@ -0,0 +1,184 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+import org.opends.server.types.RDN;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for modify DN operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseModifyDNOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to rename.  This should not be
+   * called by pre-parse plugins because the processed DN will not be
+   * available yet.  Instead, they should call the
+   * <CODE>getRawEntryDN</CODE> method.
+   *
+   * @return  The DN of the entry to rename, or <CODE>null</CODE> if
+   *          the raw entry DN has not yet been processed.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newRDN as included in the request
+   * from the client.  This may or may not contain a valid RDN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newRDN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawNewRDN();
+
+
+
+  /**
+   * Retrieves the new RDN to use for the entry.  This should not be
+   * called by pre-parse plugins, because the processed newRDN will
+   * not yet be available.  Pre-parse plugins should instead use the
+   * <CODE>getRawNewRDN</CODE> method.
+   *
+   * @return  The new RDN to use for the entry, or <CODE>null</CODE>
+   *          if the raw newRDN has not yet been processed.
+   */
+  public RDN getNewRDN();
+
+
+
+  /**
+   * Indicates whether the current RDN value should be removed from
+   * the entry.
+   *
+   * @return  <CODE>true</CODE> if the current RDN value should be
+   *          removed from the entry, or <CODE>false</CODE> if not.
+   */
+  public boolean deleteOldRDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newSuperior from the client
+   * request.  This may or may not contain a valid DN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newSuperior from the client
+   *          request, or <CODE>null</CODE> if there is none.
+   */
+  public ByteString getRawNewSuperior();
+
+
+
+  /**
+   * Retrieves the newSuperior DN for the entry.  This should not be
+   * called by pre-parse plugins, because the processed DN will not
+   * yet be available at that time.  Instead, they should use the
+   * <CODE>getRawNewSuperior</CODE> method.
+   *
+   * @return  The newSuperior DN for the entry, or <CODE>null</CODE>
+   *          if there is no newSuperior DN for this request or if the
+   *          raw newSuperior has not yet been processed.
+   */
+  public DN getNewSuperior();
+
+
+
+  /**
+   * Retrieves the set of modifications applied to attributes of the
+   * target entry in the course of processing this modify DN
+   * operation.  This will include attribute-level changes from the
+   * modify DN itself (e.g., removing old RDN values if deleteOldRDN
+   * is set, or adding new RDN values that don't already exist), but
+   * it may also be used by pre-operation plugins to cause additional
+   * changes in the entry.  In this case, those plugins may add
+   * modifications to this list through the
+   * <CODE>addModification</CODE> method (the list returned from this
+   * method should not be modified directly) if any changes should be
+   * processed in addition to the core modify DN processing.  Backends
+   * may read this list to identify which attribute-level changes were
+   * applied in order to more easily apply updates to attribute
+   * indexes.
+   *
+   * @return  The set of modifications applied to attributes during
+   *          the course of the modify DN processing, or
+   *          <CODE>null</CODE> if that information is not yet
+   *          available (e.g., during pre-parse plugins).
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Retrieves the current entry, before it is renamed.  This will not
+   * be available to pre-parse plugins or during the conflict
+   * resolution portion of the synchronization processing.
+   *
+   * @return  The current entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getOriginalEntry();
+
+
+
+  /**
+   * Retrieves the new entry, as it will appear after it is renamed.
+   * This will not be  available to pre-parse plugins or during the
+   * conflict resolution portion of the synchronization processing.
+   *
+   * @return  The updated entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getUpdatedEntry();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyOperation.java
new file mode 100644
index 0000000..be3cd6d
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseModifyOperation.java
@@ -0,0 +1,143 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.protocols.ldap.LDAPModification;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for modify operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseModifyOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to modify.
+   *
+   * @return  The DN of the entry to modify.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of raw, unprocessed modifications as included
+   * in the client request.  Note that this may contain one or more
+   * invalid modifications, as no validation will have been performed
+   * on this information.  The list returned must not be altered by
+   * the caller.
+   *
+   * @return  The set of raw, unprocessed modifications as included
+   *          in the client request.
+   */
+  public List<LDAPModification> getRawModifications();
+
+
+
+  /**
+   * Retrieves the set of modifications for this modify operation.
+   Its contents should not be altered.
+   *
+   * @return  The set of modifications for this modify operation.
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Retrieves the current entry before any modifications are applied.
+   * It should not be modified by the caller.
+   *
+   * @return  The current entry before any modifications are applied.
+   */
+  public Entry getCurrentEntry();
+
+
+
+  /**
+   * Retrieves the modified entry that is to be written to the
+   * backend.  It should not be modified by the caller.
+   *
+   * @return  The modified entry that is to be written to the backend.
+   */
+  public Entry getModifiedEntry();
+
+
+
+  /**
+   * Retrieves the set of clear-text current passwords for the user,
+   * if available.  This will only be available if the modify
+   * operation contains one or more delete elements that target the
+   * password attribute and provide the values to delete in the clear.
+   * This list should not be altered by the caller.
+   *
+   * @return  The set of clear-text current password values as
+   *          provided in the modify request, or <CODE>null</CODE> if
+   *          there were none.
+   */
+  public List<AttributeValue> getCurrentPasswords();
+
+
+
+  /**
+   * Retrieves the set of clear-text new passwords for the user, if
+   * available.  This will only be available if the modify operation
+   * contains one or more add or replace elements that target the
+   * password attribute and provide the values in the clear.  This
+   * list should not be altered by the caller.
+   *
+   * @return  The set of clear-text new passwords as provided in the
+   *          modify request, or <CODE>null</CODE> if there were none.
+   */
+  public List<AttributeValue> getNewPasswords();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseOperation.java
new file mode 100644
index 0000000..4209815
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseOperation.java
@@ -0,0 +1,315 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.types.Control;
+import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for all types of operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseOperation
+{
+  /**
+   * Retrieves the operation type for this operation.
+   *
+   * @return  The operation type for this operation.
+   */
+  public OperationType getOperationType();
+
+
+
+  /**
+   * Retrieves the client connection with which this operation is
+   * associated.
+   *
+   * @return  The client connection with which this operation is
+   *          associated.
+   */
+  public ClientConnection getClientConnection();
+
+
+
+  /**
+   * Retrieves the unique identifier that is assigned to the client
+   * connection that submitted this operation.
+   *
+   * @return  The unique identifier that is assigned to the client
+   *          connection that submitted this operation.
+   */
+  public long getConnectionID();
+
+
+
+  /**
+   * Retrieves the operation ID for this operation.
+   *
+   * @return  The operation ID for this operation.
+   */
+  public long getOperationID();
+
+
+
+  /**
+   * Retrieves the message ID assigned to this operation.
+   *
+   * @return  The message ID assigned to this operation.
+   */
+  public int getMessageID();
+
+
+
+  /**
+   * Retrieves the set of controls included in the request from the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls included in the request from the
+   *          client.
+   */
+  public List<Control> getRequestControls();
+
+
+
+  /**
+   * Retrieves the set of controls to include in the response to the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls to include in the response to the
+   *          client.
+   */
+  public List<Control> getResponseControls();
+
+
+
+  /**
+   * Retrieves the result code for this operation.
+   *
+   * @return  The result code associated for this operation, or
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet
+   *          completed.
+   */
+  public ResultCode getResultCode();
+
+
+
+  /**
+   * Retrieves the error message for this operation.  Its contents may
+   * be altered by the caller.
+   *
+   * @return  The error message for this operation.
+   */
+  public StringBuilder getErrorMessage();
+
+
+
+  /**
+   * Retrieves the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.  The contents of this buffer may be altered by the
+   * caller.
+   *
+   * @return  The additional log message for this operation.
+   */
+  public StringBuilder getAdditionalLogMessage();
+
+
+
+  /**
+   * Retrieves the matched DN for this operation.
+   *
+   * @return  The matched DN for this operation, or <CODE>null</CODE>
+   *          if the operation has not yet completed or does not have
+   *          a matched DN.
+   */
+  public DN getMatchedDN();
+
+
+
+  /**
+   * Retrieves the set of referral URLs for this operation.  Its
+   * contents must not be altered by the caller.
+   *
+   * @return  The set of referral URLs for this operation, or
+   *          <CODE>null</CODE> if the operation is not yet complete
+   *          or does not have a set of referral URLs.
+   */
+  public List<String> getReferralURLs();
+
+
+
+  /**
+   * Indicates whether this is an internal operation rather than one
+   * that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is an internal operation, or
+   *          <CODE>false</CODE> if it is not.
+   */
+  public boolean isInternalOperation();
+
+
+
+  /**
+   * Indicates whether this is a synchronization operation rather than
+   * one that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is a data synchronization
+   *          operation, or <CODE>false</CODE> if it is not.
+   */
+  public boolean isSynchronizationOperation();
+
+
+
+  /**
+   * Retrieves the authorization DN for this operation.  In many
+   * cases, it will be the same as the DN of the authenticated user
+   * for the underlying connection, or the null DN if no
+   * authentication has been performed on that connection.  However,
+   * it may be some other value if special processing has been
+   * requested (e.g., the operation included a proxied authorization
+   * control).
+   *
+   * @return  The authorization DN for this operation.
+   */
+  public DN getAuthorizationDN();
+
+
+
+  /**
+   * Retrieves the set of attachments defined for this operation, as a
+   * mapping between the attachment name and the associated object.
+   *
+   * @return  The set of attachments defined for this operation.
+   */
+  public Map<String,Object> getAttachments();
+
+
+
+  /**
+   * Retrieves the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to retrieve.  It will
+   *               be treated in a case-sensitive manner.
+   *
+   * @return  The requested attachment object, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object getAttachment(String name);
+
+
+
+  /**
+   * Removes the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to remove.  It will be
+   *               treated in a case-sensitive manner.
+   *
+   * @return  The attachment that was removed, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object removeAttachment(String name);
+
+
+
+  /**
+   * Sets the value of the specified attachment.  If an attachment
+   * already exists with the same name, it will be replaced.
+   * Otherwise, a new attachment will be added.
+   *
+   * @param  name   The name to use for the attachment.
+   * @param  value  The value to use for the attachment.
+   *
+   * @return  The former value held by the attachment with the given
+   *          name, or <CODE>null</CODE> if there was previously no
+   *          such attachment.
+   */
+  public Object setAttachment(String name, Object value);
+
+
+
+  /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves the time that processing stopped for this operation.
+   * This will actually hold a time immediately before the response
+   * was sent to the client.
+   *
+   * @return  The time that processing stopped for this operation.
+   */
+  public long getProcessingStopTime();
+
+
+
+  /**
+   * Retrieves the length of time in milliseconds that the server
+   * spent processing this operation.
+   *
+   * @return  The length of time in milliseconds that the server spent
+   *          processing this operation.
+   */
+  public long getProcessingTime();
+
+
+
+  /**
+   * Retrieves a string representation of this operation.
+   *
+   * @return  A string representation of this operation.
+   */
+  public String toString();
+
+
+
+  /**
+   * Appends a string representation of this operation to the provided
+   * buffer.
+   *
+   * @param  buffer  The buffer into which a string representation of
+   *                 this operation should be appended.
+   */
+  public void toString(StringBuilder buffer);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseSearchOperation.java
new file mode 100644
index 0000000..ac2636a
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PostResponseSearchOperation.java
@@ -0,0 +1,173 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DN;
+import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchFilter;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * post-response plugins for search operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PostResponseSearchOperation
+       extends PostResponseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Retrieves the base DN for this search operation.
+   *
+   * @return  The base DN for this search operation.
+   */
+  public DN getBaseDN();
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Retrieves the filter for this search operation.
+   *
+   * @return  The filter for this search operation.
+   */
+  public SearchFilter getFilter();
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+
+
+
+  /**
+   * Retrieves the number of entries sent to the client for this
+   * search operation.
+   *
+   * @return  The number of entries sent to the client for this search
+   *          operation.
+   */
+  public int getEntriesSent();
+
+
+
+  /**
+   * Retrieves the number of search references sent to the client for
+   * this search operation.
+   *
+   * @return  The number of search references sent to the client for
+   *          this search operation.
+   */
+  public int getReferencesSent();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationAddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationAddOperation.java
new file mode 100644
index 0000000..21d9f51
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationAddOperation.java
@@ -0,0 +1,189 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.protocols.ldap.LDAPAttribute;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ObjectClass;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for add operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreOperationAddOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the DN of the entry to add in a raw, unparsed form as
+   * it was included in the request.  This may or may not actually
+   * contain a valid DN, since no validation will have been performed
+   * on it.
+   *
+   * @return  The DN of the entry in a raw, unparsed form.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the set of attributes in their raw, unparsed form as
+   * read from the client request.  Some of these attributes may be
+   * invalid as no validation will have been performed on them.  The
+   * returned list must not be altered by the caller.
+   *
+   * @return  The set of attributes in their raw, unparsed form as
+   *          read from the client request.
+   */
+  public List<LDAPAttribute> getRawAttributes();
+
+
+
+  /**
+   * Retrieves the DN of the entry to add.
+   *
+   * @return  The DN of the entry to add.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of processed objectclasses for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed objectclasses for the entry to add.
+   */
+  public Map<ObjectClass,String> getObjectClasses();
+
+
+
+  /**
+   * Adds the provided objectclass to the entry to add.  Note that
+   * pre-operation plugin processing is invoked after access control
+   * and schema validation, so plugins should be careful to only make
+   * changes that will not violate either schema or access control
+   * rules.
+   *
+   * @param  objectClass  The objectclass to add to the entry.
+   * @param  name         The name to use for the objectclass.
+   */
+  public void addObjectClass(ObjectClass objectClass, String name);
+
+
+
+  /**
+   * Removes the provided objectclass from the entry to add.  Note
+   * that pre-operation plugin processing is invoked after access
+   * control and schema validation, so plugins should be careful to
+   * only make changes that will not violate either schema or access
+   * control rules.
+   *
+   * @param  objectClass  The objectclass to remove from the entry.
+   */
+  public void removeObjectClass(ObjectClass objectClass);
+
+
+
+  /**
+   * Retrieves the set of processed user attributes for the entry to
+   * add.  The contents of the returned map must not be altered by the
+   * caller.
+   *
+   * @return  The set of processed user attributes for the entry to
+   *          add.
+   */
+  public Map<AttributeType,List<Attribute>> getUserAttributes();
+
+
+
+  /**
+   * Retrieves the set of processed operational attributes for the
+   * entry to add.  The contents of the returned map must not be
+   * altered by the caller.
+   *
+   * @return  The set of processed operational attributes for the
+   *          entry to add.
+   */
+  public Map<AttributeType,List<Attribute>>
+              getOperationalAttributes();
+
+
+
+  /**
+   * Sets the specified attribute in the entry to add, overwriting any
+   * existing attribute of the specified type if necessary.  Note that
+   * pre-operation plugin processing is invoked after access control
+   * and schema validation, so plugins should be careful to only make
+   * changes that will not violate either schema or access control
+   * rules.
+   *
+   * @param  attributeType  The attribute type for the attribute.
+   * @param  attributeList  The attribute list for the provided
+   *                        attribute type.
+   */
+  public void setAttribute(AttributeType attributeType,
+                           List<Attribute> attributeList);
+
+
+
+  /**
+   * Removes the specified attribute from the entry to add.  Note that
+   * pre-operation processing is invoked after access control and
+   * schema validation, so plugins should be careful to only make
+   * changes that will not violate either schema or access control
+   * rules.
+   *
+   * @param  attributeType  The attribute tyep for the attribute to
+   *                        remove.
+   */
+  public void removeAttribute(AttributeType attributeType);
+
+
+
+  /**
+   * Retrieves the entry to be added to the server.  The contents of
+   * the returned entry must not be altered by the caller.
+   *
+   * @return  The entry to be added to the server.
+   */
+  public Entry getEntryToAdd();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationBindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationBindOperation.java
new file mode 100644
index 0000000..e487acb
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationBindOperation.java
@@ -0,0 +1,146 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.types.AuthenticationType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for bind operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationBindOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the authentication type for this bind operation.
+   *
+   * @return  The authentication type for this bind operation.
+   */
+  public AuthenticationType getAuthenticationType();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed bind DN for this bind operation as
+   * contained in the client request.  The value may not actually
+   * contain a valid DN, as no validation will have been performed.
+   *
+   * @return  The raw, unprocessed bind DN for this bind operation as
+   *          contained in the client request.
+   */
+  public ByteString getRawBindDN();
+
+
+
+  /**
+   * Retrieves the bind DN for this bind operation.
+   *
+   * @return  The bind DN for this bind operation.
+   */
+  public DN getBindDN();
+
+
+
+  /**
+   * Retrieves the simple authentication password for this bind
+   * operation.
+   *
+   * @return  The simple authentication password for this bind
+   *          operation.
+   */
+  public ByteString getSimplePassword();
+
+
+
+  /**
+   * Retrieves the SASL mechanism for this bind operation.
+   *
+   * @return  The SASL mechanism for this bind operation, or
+   *          <CODE>null</CODE> if the bind does not use SASL
+   *          authentication.
+   */
+  public String getSASLMechanism();
+
+
+
+  /**
+   * Retrieves the SASL credentials for this bind operation.
+   *
+   * @return  The SASL credentials for this bind operation, or
+   *          <CODE>null</CODE> if there are none or if the bind does
+   *          not use SASL authentication.
+   */
+  public ASN1OctetString getSASLCredentials();
+
+
+
+  /**
+   * Specifies the set of server SASL credentials to include in the
+   * bind response.
+   *
+   * @param  serverSASLCredentials  The set of server SASL credentials
+   *                                to include in the bind response.
+   */
+  public void setServerSASLCredentials(ASN1OctetString
+                                            serverSASLCredentials);
+
+
+
+  /**
+   * Specifies the reason that the authentication failed.
+   *
+   * @param  id      The unique identifier for the authentication
+   *                 failure reason.
+   * @param  reason  A human-readable message providing the reason
+   *                 that the authentication failed.
+   */
+  public void setAuthFailureReason(int id, String reason);
+
+
+
+  /**
+   * Retrieves the user entry DN for this bind operation.  It will
+   * only be available for simple bind operations (and may be
+   * different than the bind DN from the client request).
+   *
+   * @return  The user entry DN for this bind operation, or
+   *          <CODE>null</CODE> if the bind processing has not
+   *          progressed far enough to identify the user or if the
+   *          user DN could not be determined.
+   */
+  public DN getUserEntryDN();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationCompareOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationCompareOperation.java
new file mode 100644
index 0000000..4e536d0
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationCompareOperation.java
@@ -0,0 +1,111 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for compare operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationCompareOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to compare.
+   *
+   * @return  The DN of the entry to compare.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw attribute type for this compare operation.
+   *
+   * @return  The raw attribute type for this compare operation.
+   */
+  public String getRawAttributeType();
+
+
+
+  /**
+   * Retrieves the attribute type for this compare operation.
+   *
+   * @return  The attribute type for this compare operation.
+   */
+  public AttributeType getAttributeType();
+
+
+
+  /**
+   * Retrieves the assertion value for this compare operation.
+   *
+   * @return  The assertion value for this compare operation.
+   */
+  public ByteString getAssertionValue();
+
+
+
+  /**
+   * Specifies the assertion value for this compare operation.
+   *
+   * @param  assertionValue  The assertion value for this compare
+   *                         operation.
+   */
+  public void setAssertionValue(ByteString assertionValue);
+
+
+
+  /**
+   * Retrieves the entry to target with the compare operation.
+   *
+   * @return  The entry to target with the compare operation.
+   */
+  public Entry getEntryToCompare();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationDeleteOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationDeleteOperation.java
new file mode 100644
index 0000000..1edbb14
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationDeleteOperation.java
@@ -0,0 +1,73 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for delete operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationDeleteOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to delete.
+   *
+   * @return  The DN of the entry to delete.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the entry to be deleted.
+   *
+   * @return  The entry to be deleted.
+   */
+  public Entry getEntryToDelete();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationExtendedOperation.java
new file mode 100644
index 0000000..48eee95
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationExtendedOperation.java
@@ -0,0 +1,84 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for extended operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationExtendedOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the OID for the request associated with this extended
+   * operation.
+   *
+   * @return  The OID for the request associated with this extended
+   *          operation.
+   */
+  public String getRequestOID();
+
+
+
+  /**
+   * Retrieves the value for the request associated with this extended
+   * operation.
+   *
+   * @return  The value for the request associated with this extended
+   *          operation.
+   */
+  public ASN1OctetString getRequestValue();
+
+
+
+  /**
+   * Specifies the OID to include in the response to the client.
+   *
+   * @param  responseOID  The OID to include in the response to the
+   *                      client.
+   */
+  public void setResponseOID(String responseOID);
+
+
+
+  /**
+   * Specifies the value to include in the response to the client.
+   *
+   * @param  responseValue  The value to include in the response to
+   *                        the client.
+   */
+  public void setResponseValue(ASN1OctetString responseValue);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyDNOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyDNOperation.java
new file mode 100644
index 0000000..657f7fc
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyDNOperation.java
@@ -0,0 +1,196 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+import org.opends.server.types.RDN;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for modify DN operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationModifyDNOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to rename.  This should not be
+   * called by pre-parse plugins because the processed DN will not be
+   * available yet.  Instead, they should call the
+   * <CODE>getRawEntryDN</CODE> method.
+   *
+   * @return  The DN of the entry to rename, or <CODE>null</CODE> if
+   *          the raw entry DN has not yet been processed.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newRDN as included in the request
+   * from the client.  This may or may not contain a valid RDN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newRDN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawNewRDN();
+
+
+
+  /**
+   * Retrieves the new RDN to use for the entry.  This should not be
+   * called by pre-parse plugins, because the processed newRDN will
+   * not yet be available.  Pre-parse plugins should instead use the
+   * <CODE>getRawNewRDN</CODE> method.
+   *
+   * @return  The new RDN to use for the entry, or <CODE>null</CODE>
+   *          if the raw newRDN has not yet been processed.
+   */
+  public RDN getNewRDN();
+
+
+
+  /**
+   * Indicates whether the current RDN value should be removed from
+   * the entry.
+   *
+   * @return  <CODE>true</CODE> if the current RDN value should be
+   *          removed from the entry, or <CODE>false</CODE> if not.
+   */
+  public boolean deleteOldRDN();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newSuperior from the client
+   * request.  This may or may not contain a valid DN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newSuperior from the client
+   *          request, or <CODE>null</CODE> if there is none.
+   */
+  public ByteString getRawNewSuperior();
+
+
+
+  /**
+   * Retrieves the newSuperior DN for the entry.  This should not be
+   * called by pre-parse plugins, because the processed DN will not
+   * yet be available at that time.  Instead, they should use the
+   * <CODE>getRawNewSuperior</CODE> method.
+   *
+   * @return  The newSuperior DN for the entry, or <CODE>null</CODE>
+   *          if there is no newSuperior DN for this request or if the
+   *          raw newSuperior has not yet been processed.
+   */
+  public DN getNewSuperior();
+
+
+
+  /**
+   * Retrieves the set of modifications applied to attributes of the
+   * target entry in the course of processing this modify DN
+   * operation.  This will include attribute-level changes from the
+   * modify DN itself (e.g., removing old RDN values if deleteOldRDN
+   * is set, or adding new RDN values that don't already exist), but
+   * it may also be used by pre-operation plugins to cause additional
+   * changes in the entry.  In this case, those plugins may add
+   * modifications to this list through the
+   * <CODE>addModification</CODE> method (the list returned from this
+   * method should not be modified directly) if any changes should be
+   * processed in addition to the core modify DN processing.  Backends
+   * may read this list to identify which attribute-level changes were
+   * applied in order to more easily apply updates to attribute
+   * indexes.
+   *
+   * @return  The set of modifications applied to attributes during
+   *          the course of the modify DN processing, or
+   *          <CODE>null</CODE> if that information is not yet
+   *          available (e.g., during pre-parse plugins).
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Adds the provided modification to the set of modifications to be
+   * applied as part of the update.  This should only be called by
+   * pre-operation plugins.
+   *
+   * @param  modification  The modification to add to the set of
+   *                       modifications to apply to the entry.
+   */
+  public void addModification(Modification modification);
+
+
+
+  /**
+   * Retrieves the current entry, before it is renamed.  This will not
+   * be available to pre-parse plugins or during the conflict
+   * resolution portion of the synchronization processing.
+   *
+   * @return  The current entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getOriginalEntry();
+
+
+
+  /**
+   * Retrieves the new entry, as it will appear after it is renamed.
+   * This will not be  available to pre-parse plugins or during the
+   * conflict resolution portion of the synchronization processing.
+   *
+   * @return  The updated entry, or <CODE>null</CODE> if it is not yet
+   *           available.
+   */
+  public Entry getUpdatedEntry();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyOperation.java
new file mode 100644
index 0000000..aab8f19
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationModifyOperation.java
@@ -0,0 +1,164 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.protocols.ldap.LDAPModification;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.Modification;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for modify operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationModifyOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Retrieves the DN of the entry to modify.
+   *
+   * @return  The DN of the entry to modify.
+   */
+  public DN getEntryDN();
+
+
+
+  /**
+   * Retrieves the set of raw, unprocessed modifications as included
+   * in the client request.  Note that this may contain one or more
+   * invalid modifications, as no validation will have been performed
+   * on this information.  The list returned must not be altered by
+   * the caller.
+   *
+   * @return  The set of raw, unprocessed modifications as included
+   *          in the client request.
+   */
+  public List<LDAPModification> getRawModifications();
+
+
+
+  /**
+   * Retrieves the set of modifications for this modify operation.
+   Its contents should not be altered.
+   *
+   * @return  The set of modifications for this modify operation.
+   */
+  public List<Modification> getModifications();
+
+
+
+  /**
+   * Adds the provided modification to the set of modifications to
+   * this modify operation.  Note that this will be called after the
+   * schema and access control processing, so the caller must be
+   * careful to avoid making any changes that will violate schema or
+   * access control constraints.
+   *
+   * @param  modification  The modification to add to the set of
+   *                       changes for this modify operation.
+   *
+   * @throws  DirectoryException  If an unexpected problem occurs
+   *                              while applying the modification to
+   *                              the entry.
+   */
+  public void addModification(Modification modification)
+         throws DirectoryException;
+
+
+
+  /**
+   * Retrieves the current entry before any modifications are applied.
+   * It should not be modified by the caller.
+   *
+   * @return  The current entry before any modifications are applied.
+   */
+  public Entry getCurrentEntry();
+
+
+
+  /**
+   * Retrieves the modified entry that is to be written to the
+   * backend.  This entry should not be modified directly, but should
+   * only be altered through the <CODE>addModification</CODE> method.
+   *
+   * @return  The modified entry that is to be written to the backend.
+   */
+  public Entry getModifiedEntry();
+
+
+
+  /**
+   * Retrieves the set of clear-text current passwords for the user,
+   * if available.  This will only be available if the modify
+   * operation contains one or more delete elements that target the
+   * password attribute and provide the values to delete in the clear.
+   * This list should not be altered by the caller.
+   *
+   * @return  The set of clear-text current password values as
+   *          provided in the modify request, or <CODE>null</CODE> if
+   *          there were none.
+   */
+  public List<AttributeValue> getCurrentPasswords();
+
+
+
+  /**
+   * Retrieves the set of clear-text new passwords for the user, if
+   * available.  This will only be available if the modify operation
+   * contains one or more add or replace elements that target the
+   * password attribute and provide the values in the clear.  This
+   * list should not be altered by the caller.
+   *
+   * @return  The set of clear-text new passwords as provided in the
+   *          modify request, or <CODE>null</CODE> if there were none.
+   */
+  public List<AttributeValue> getNewPasswords();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationOperation.java
new file mode 100644
index 0000000..90030d7
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationOperation.java
@@ -0,0 +1,415 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for all types of operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationOperation
+{
+  /**
+   * Retrieves the operation type for this operation.
+   *
+   * @return  The operation type for this operation.
+   */
+  public OperationType getOperationType();
+
+
+
+  /**
+   * Retrieves the client connection with which this operation is
+   * associated.
+   *
+   * @return  The client connection with which this operation is
+   *          associated.
+   */
+  public ClientConnection getClientConnection();
+
+
+
+  /**
+   * Retrieves the unique identifier that is assigned to the client
+   * connection that submitted this operation.
+   *
+   * @return  The unique identifier that is assigned to the client
+   *          connection that submitted this operation.
+   */
+  public long getConnectionID();
+
+
+
+  /**
+   * Retrieves the operation ID for this operation.
+   *
+   * @return  The operation ID for this operation.
+   */
+  public long getOperationID();
+
+
+
+  /**
+   * Retrieves the message ID assigned to this operation.
+   *
+   * @return  The message ID assigned to this operation.
+   */
+  public int getMessageID();
+
+
+
+  /**
+   * Retrieves the set of controls included in the request from the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls included in the request from the
+   *          client.
+   */
+  public List<Control> getRequestControls();
+
+
+
+  /**
+   * Retrieves the set of controls to include in the response to the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls to include in the response to the
+   *          client.
+   */
+  public List<Control> getResponseControls();
+
+
+
+  /**
+   * Adds the provided control to the set of controls to include in
+   * the response to the client.
+   *
+   * @param  control  The control to add to the set of controls to
+   *                  include in the response to the client.
+   */
+  public void addResponseControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of controls to include
+   * in the response to the client.
+   *
+   * @param  control  The control to remove from the set of controls
+   *                  to include in the response to the client.
+   */
+  public void removeResponseControl(Control control);
+
+
+
+  /**
+   * Retrieves the result code for this operation.
+   *
+   * @return  The result code associated for this operation, or
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet
+   *          completed.
+   */
+  public ResultCode getResultCode();
+
+
+
+  /**
+   * Specifies the result code for this operation.
+   *
+   * @param  resultCode  The result code for this operation.
+   */
+  public void setResultCode(ResultCode resultCode);
+
+
+
+  /**
+   * Retrieves the error message for this operation.  Its contents may
+   * be altered by the caller.
+   *
+   * @return  The error message for this operation.
+   */
+  public StringBuilder getErrorMessage();
+
+
+
+  /**
+   * Specifies the error message for this operation.
+   *
+   * @param  errorMessage  The error message for this operation.
+   */
+  public void setErrorMessage(StringBuilder errorMessage);
+
+
+
+  /**
+   * Appends the provided message to the error message buffer.  If the
+   * buffer has not yet been created, then this will create it first
+   * and then add the provided message.
+   *
+   * @param  message  The message to append to the error message
+   *                  buffer.
+   */
+  public void appendErrorMessage(String message);
+
+
+
+  /**
+   * Retrieves the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.  The contents of this buffer may be altered by the
+   * caller.
+   *
+   * @return  The additional log message for this operation.
+   */
+  public StringBuilder getAdditionalLogMessage();
+
+
+
+  /**
+   * Specifies the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.
+   *
+   * @param  additionalLogMessage  The additional log message for this
+   *                               operation.
+   */
+  public void setAdditionalLogMessage(
+                   StringBuilder additionalLogMessage);
+
+
+
+  /**
+   * Appends the provided message to the additional log information
+   * for this operation.
+   *
+   * @param  message  The message that should be appended to the
+   *                  additional log information for this operation.
+   */
+  public void appendAdditionalLogMessage(String message);
+
+
+
+  /**
+   * Retrieves the matched DN for this operation.
+   *
+   * @return  The matched DN for this operation, or <CODE>null</CODE>
+   *          if the operation has not yet completed or does not have
+   *          a matched DN.
+   */
+  public DN getMatchedDN();
+
+
+
+  /**
+   * Specifies the matched DN for this operation.
+   *
+   * @param  matchedDN  The matched DN for this operation.
+   */
+  public void setMatchedDN(DN matchedDN);
+
+
+
+  /**
+   * Retrieves the set of referral URLs for this operation.  Its
+   * contents must not be altered by the caller.
+   *
+   * @return  The set of referral URLs for this operation, or
+   *          <CODE>null</CODE> if the operation is not yet complete
+   *          or does not have a set of referral URLs.
+   */
+  public List<String> getReferralURLs();
+
+
+
+  /**
+   * Specifies the set of referral URLs for this operation.
+   *
+   * @param  referralURLs  The set of referral URLs for this
+   *                       operation.
+   */
+  public void setReferralURLs(List<String> referralURLs);
+
+
+
+  /**
+   * Sets the response elements for this operation based on the
+   * information contained in the provided
+   * <CODE>DirectoryException</CODE> object.
+   *
+   * @param  directoryException  The exception containing the
+   *                             information to use for the response
+   *                             elements.
+   */
+  public void setResponseData(DirectoryException directoryException);
+
+
+
+  /**
+   * Indicates whether this is an internal operation rather than one
+   * that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is an internal operation, or
+   *          <CODE>false</CODE> if it is not.
+   */
+  public boolean isInternalOperation();
+
+
+
+  /**
+   * Indicates whether this is a synchronization operation rather than
+   * one that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is a data synchronization
+   *          operation, or <CODE>false</CODE> if it is not.
+   */
+  public boolean isSynchronizationOperation();
+
+
+
+  /**
+   * Retrieves the authorization DN for this operation.  In many
+   * cases, it will be the same as the DN of the authenticated user
+   * for the underlying connection, or the null DN if no
+   * authentication has been performed on that connection.  However,
+   * it may be some other value if special processing has been
+   * requested (e.g., the operation included a proxied authorization
+   * control).
+   *
+   * @return  The authorization DN for this operation.
+   */
+  public DN getAuthorizationDN();
+
+
+
+  /**
+   * Retrieves the set of attachments defined for this operation, as a
+   * mapping between the attachment name and the associated object.
+   *
+   * @return  The set of attachments defined for this operation.
+   */
+  public Map<String,Object> getAttachments();
+
+
+
+  /**
+   * Retrieves the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to retrieve.  It will
+   *               be treated in a case-sensitive manner.
+   *
+   * @return  The requested attachment object, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object getAttachment(String name);
+
+
+
+  /**
+   * Removes the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to remove.  It will be
+   *               treated in a case-sensitive manner.
+   *
+   * @return  The attachment that was removed, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object removeAttachment(String name);
+
+
+
+  /**
+   * Sets the value of the specified attachment.  If an attachment
+   * already exists with the same name, it will be replaced.
+   * Otherwise, a new attachment will be added.
+   *
+   * @param  name   The name to use for the attachment.
+   * @param  value  The value to use for the attachment.
+   *
+   * @return  The former value held by the attachment with the given
+   *          name, or <CODE>null</CODE> if there was previously no
+   *          such attachment.
+   */
+  public Object setAttachment(String name, Object value);
+
+
+
+  /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves the cancel request that has been issued for this
+   * operation, if there is one.
+   *
+   * @return  The cancel request that has been issued for this
+   *          operation, or <CODE>null</CODE> if there has not been
+   *          any request to cancel.
+   */
+  public CancelRequest getCancelRequest();
+
+
+
+  /**
+   * Retrieves a string representation of this operation.
+   *
+   * @return  A string representation of this operation.
+   */
+  public String toString();
+
+
+
+  /**
+   * Appends a string representation of this operation to the provided
+   * buffer.
+   *
+   * @param  buffer  The buffer into which a string representation of
+   *                 this operation should be appended.
+   */
+  public void toString(StringBuilder buffer);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationSearchOperation.java
new file mode 100644
index 0000000..172a0fe
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreOperationSearchOperation.java
@@ -0,0 +1,151 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DN;
+import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchFilter;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-operation plugins for search operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreOperationSearchOperation
+       extends PreOperationOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Retrieves the base DN for this search operation.
+   *
+   * @return  The base DN for this search operation.
+   */
+  public DN getBaseDN();
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Retrieves the filter for this search operation.
+   *
+   * @return  The filter for this search operation.
+   */
+  public SearchFilter getFilter();
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAbandonOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAbandonOperation.java
new file mode 100644
index 0000000..1093576
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAbandonOperation.java
@@ -0,0 +1,49 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for abandon operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseAbandonOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the message ID of the operation that should be
+   * abandoned.
+   *
+   * @return  The message ID of the operation that should be
+   *          abandoned.
+   */
+  public int getIDToAbandon();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAddOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAddOperation.java
new file mode 100644
index 0000000..4fa7bbd
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseAddOperation.java
@@ -0,0 +1,101 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.protocols.ldap.LDAPAttribute;
+import org.opends.server.types.ByteString;
+
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for add operations.  Note that this interface is
+ * intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseAddOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the DN of the entry to add in a raw, unparsed form as
+   * it was included in the request.  This may or may not actually
+   * contain a valid DN, since no validation will have been performed
+   * on it.
+   *
+   * @return  The DN of the entry in a raw, unparsed form.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Specifies the raw entry DN for the entry to add.
+   *
+   * @param  rawEntryDN  The raw entry DN for the entry to add.
+   */
+  public void setRawEntryDN(ByteString rawEntryDN);
+
+
+
+  /**
+   * Retrieves the set of attributes in their raw, unparsed form as
+   * read from the client request.  Some of these attributes may be
+   * invalid as no validation will have been performed on them.  The
+   * returned list must not be altered by the caller.
+   *
+   * @return  The set of attributes in their raw, unparsed form as
+   *          read from the client request.
+   */
+  public List<LDAPAttribute> getRawAttributes();
+
+
+
+  /**
+   * Adds the provided attribute to the set of raw attributes for this
+   * add operation.
+   *
+   * @param  rawAttribute  The attribute to add to the set of raw
+   *                       attributes for this add operation.
+   */
+  public void addRawAttribute(LDAPAttribute rawAttribute);
+
+
+
+  /**
+   * Replaces the set of raw attributes for this add operation.
+   *
+   * @param  rawAttributes  The set of raw attributes for this add
+   *                        operation.
+   */
+  public void setRawAttributes(List<LDAPAttribute> rawAttributes);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseBindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseBindOperation.java
new file mode 100644
index 0000000..c7358a7
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseBindOperation.java
@@ -0,0 +1,157 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.types.AuthenticationType;
+import org.opends.server.types.ByteString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for bind operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreParseBindOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the authentication type for this bind operation.
+   *
+   * @return  The authentication type for this bind operation.
+   */
+  public AuthenticationType getAuthenticationType();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed bind DN for this bind operation as
+   * contained in the client request.  The value may not actually
+   * contain a valid DN, as no validation will have been performed.
+   *
+   * @return  The raw, unprocessed bind DN for this bind operation as
+   *          contained in the client request.
+   */
+  public ByteString getRawBindDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed bind DN for this bind operation.
+   *
+   * @param  rawBindDN  The raw, unprocessed bind DN for this bind
+   *                    operation.
+   */
+  public void setRawBindDN(ByteString rawBindDN);
+
+
+
+  /**
+   * Retrieves the simple authentication password for this bind
+   * operation.
+   *
+   * @return  The simple authentication password for this bind
+   *          operation.
+   */
+  public ByteString getSimplePassword();
+
+
+
+  /**
+   * Specifies the simple authentication password for this bind
+   * operation.
+   *
+   * @param  simplePassword  The simple authentication password for
+   *                         this bind operation.
+   */
+  public void setSimplePassword(ByteString simplePassword);
+
+
+
+  /**
+   * Retrieves the SASL mechanism for this bind operation.
+   *
+   * @return  The SASL mechanism for this bind operation, or
+   *          <CODE>null</CODE> if the bind does not use SASL
+   *          authentication.
+   */
+  public String getSASLMechanism();
+
+
+
+  /**
+   * Retrieves the SASL credentials for this bind operation.
+   *
+   * @return  The SASL credentials for this bind operation, or
+   *          <CODE>null</CODE> if there are none or if the bind does
+   *          not use SASL authentication.
+   */
+  public ASN1OctetString getSASLCredentials();
+
+
+
+  /**
+   * Specifies the SASL credentials for this bind operation.
+   *
+   * @param  saslMechanism    The SASL mechanism for this bind
+   *                          operation.
+   * @param  saslCredentials  The SASL credentials for this bind
+   *                          operation, or <CODE>null</CODE> if there
+   *                          are none.
+   */
+  public void setSASLCredentials(String saslMechanism,
+                                 ASN1OctetString saslCredentials);
+
+
+
+  /**
+   * Specifies the set of server SASL credentials to include in the
+   * bind response.
+   *
+   * @param  serverSASLCredentials  The set of server SASL credentials
+   *                                to include in the bind response.
+   */
+  public void setServerSASLCredentials(ASN1OctetString
+                                            serverSASLCredentials);
+
+
+
+  /**
+   * Specifies the reason that the authentication failed.
+   *
+   * @param  id      The unique identifier for the authentication
+   *                 failure reason.
+   * @param  reason  A human-readable message providing the reason
+   *                 that the authentication failed.
+   */
+  public void setAuthFailureReason(int id, String reason);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseCompareOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseCompareOperation.java
new file mode 100644
index 0000000..ae446b3
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseCompareOperation.java
@@ -0,0 +1,101 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for compare operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseCompareOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @param  rawEntryDN  The raw entry DN for this compare operation.
+   */
+  public void setRawEntryDN(ByteString rawEntryDN);
+
+
+
+  /**
+   * Retrieves the raw attribute type for this compare operation.
+   *
+   * @return  The raw attribute type for this compare operation.
+   */
+  public String getRawAttributeType();
+
+
+
+  /**
+   * Specifies the raw attribute type for this compare operation.
+   *
+   * @param  rawAttributeType  The raw attribute type for this compare
+   *                           operation.
+   */
+  public void setRawAttributeType(String rawAttributeType);
+
+
+
+  /**
+   * Retrieves the assertion value for this compare operation.
+   *
+   * @return  The assertion value for this compare operation.
+   */
+  public ByteString getAssertionValue();
+
+
+
+  /**
+   * Specifies the assertion value for this compare operation.
+   *
+   * @param  assertionValue  The assertion value for this compare
+   *                         operation.
+   */
+  public void setAssertionValue(ByteString assertionValue);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseDeleteOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseDeleteOperation.java
new file mode 100644
index 0000000..45d5fff
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseDeleteOperation.java
@@ -0,0 +1,64 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for delete operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseDeleteOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed entry DN for this delete
+   * operation.
+   *
+   * @param  rawEntryDN  The raw, unprocessed entry DN for this delete
+   *                     operation.
+   */
+  public void setRawEntryDN(ByteString rawEntryDN);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseExtendedOperation.java
new file mode 100644
index 0000000..aaa76e6
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseExtendedOperation.java
@@ -0,0 +1,106 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.protocols.asn1.ASN1OctetString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for extended operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreParseExtendedOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the OID for the request associated with this extended
+   * operation.
+   *
+   * @return  The OID for the request associated with this extended
+   *          operation.
+   */
+  public String getRequestOID();
+
+
+
+  /**
+   * Specifies the OID for the request associated with this extended
+   * operation.
+   *
+   * @param  requestOID  The OID for the request associated with this
+   *                     extended operation.
+   */
+  public void setRequestOID(String requestOID);
+
+
+
+  /**
+   * Retrieves the value for the request associated with this extended
+   * operation.
+   *
+   * @return  The value for the request associated with this extended
+   *          operation.
+   */
+  public ASN1OctetString getRequestValue();
+
+
+
+  /**
+   * Specifies the value for the request associated with this extended
+   * operation.
+   *
+   * @param  requestValue  The value for the request associated with
+   *                       this extended operation.
+   */
+  public void setRequestValue(ASN1OctetString requestValue);
+
+
+
+  /**
+   * Specifies the OID to include in the response to the client.
+   *
+   * @param  responseOID  The OID to include in the response to the
+   *                      client.
+   */
+  public void setResponseOID(String responseOID);
+
+
+
+  /**
+   * Specifies the value to include in the response to the client.
+   *
+   * @param  responseValue  The value to include in the response to
+   *                        the client.
+   */
+  public void setResponseValue(ASN1OctetString responseValue);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyDNOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyDNOperation.java
new file mode 100644
index 0000000..bc5ec6f
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyDNOperation.java
@@ -0,0 +1,135 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import org.opends.server.types.ByteString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for modify DN operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreParseModifyDNOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed entry DN as included in the client
+   * request.  This should only be called by pre-parse plugins.
+   *
+   * @param  rawEntryDN  The raw, unprocessed entry DN as included in
+   *                     the client request.
+   */
+  public void setRawEntryDN(ByteString rawEntryDN);
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newRDN as included in the request
+   * from the client.  This may or may not contain a valid RDN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newRDN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawNewRDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed newRDN as included in the request
+   * from the client.  This should only be called by pre-parse plugins
+   * and should not be used in later stages of processing.
+   *
+   * @param  rawNewRDN  The raw, unprocessed newRDN as included in the
+   *                    request from the client.
+   */
+  public void setRawNewRDN(ByteString rawNewRDN);
+
+
+
+  /**
+   * Indicates whether the current RDN value should be removed from
+   * the entry.
+   *
+   * @return  <CODE>true</CODE> if the current RDN value should be
+   *          removed from the entry, or <CODE>false</CODE> if not.
+   */
+  public boolean deleteOldRDN();
+
+
+
+  /**
+   * Specifies whether the current RDN value should be removed from
+   * the entry.
+   *
+   * @param  deleteOldRDN  Specifies whether the current RDN value
+   *                       should be removed from the entry.
+   */
+  public void setDeleteOldRDN(boolean deleteOldRDN);
+
+
+
+  /**
+   * Retrieves the raw, unprocessed newSuperior from the client
+   * request.  This may or may not contain a valid DN, as no
+   * validation will have been performed on it.
+   *
+   * @return  The raw, unprocessed newSuperior from the client
+   *          request, or <CODE>null</CODE> if there is none.
+   */
+  public ByteString getRawNewSuperior();
+
+
+
+  /**
+   * Specifies the raw, unprocessed newSuperior for this modify DN
+   * operation, as provided in the request from the client.  This
+   * method should only be called by pre-parse plugins.
+   *
+   * @param  rawNewSuperior  The raw, unprocessed newSuperior as
+   *                         provided in the request from the client.
+   */
+  public void setRawNewSuperior(ByteString rawNewSuperior);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyOperation.java
new file mode 100644
index 0000000..c994d73
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseModifyOperation.java
@@ -0,0 +1,105 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+
+import org.opends.server.protocols.ldap.LDAPModification;
+import org.opends.server.types.ByteString;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for modify operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseModifyOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed entry DN as included in the client
+   * request.  The DN that is returned may or may not be a valid DN,
+   * since no validation will have been performed upon it.
+   *
+   * @return  The raw, unprocessed entry DN as included in the client
+   *          request.
+   */
+  public ByteString getRawEntryDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed entry DN as included in the client
+   * request.
+   *
+   * @param  rawEntryDN  The raw, unprocessed entry DN as included in
+   *                     the client request.
+   */
+  public void setRawEntryDN(ByteString rawEntryDN);
+
+
+
+  /**
+   * Retrieves the set of raw, unprocessed modifications as included
+   * in the client request.  Note that this may contain one or more
+   * invalid modifications, as no validation will have been performed
+   * on this information.  The list returned must not be altered by
+   * the caller.
+   *
+   * @return  The set of raw, unprocessed modifications as included
+   *          in the client request.
+   */
+  public List<LDAPModification> getRawModifications();
+
+
+
+  /**
+   * Adds the provided modification to the set of raw modifications
+   * for this modify operation.
+   *
+   * @param  rawModification  The modification to add to the set of
+   *                          raw modifications for this modify
+   *                          operation.
+   */
+  public void addRawModification(LDAPModification rawModification);
+
+
+
+  /**
+   * Specifies the set of raw modifications for this modify operation.
+   *
+   * @param  rawModifications  The raw modifications for this modify
+   *                           operation.
+   */
+  public void setRawModifications(
+                   List<LDAPModification> rawModifications);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseOperation.java
new file mode 100644
index 0000000..1ca15e3
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseOperation.java
@@ -0,0 +1,422 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DN;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for all types of operations.  Note that this
+ * interface is intended only to define an API for use by plugins and
+ * is not intended to be implemented by any custom classes.
+ */
+public interface PreParseOperation
+{
+  /**
+   * Retrieves the operation type for this operation.
+   *
+   * @return  The operation type for this operation.
+   */
+  public OperationType getOperationType();
+
+
+
+  /**
+   * Retrieves the client connection with which this operation is
+   * associated.
+   *
+   * @return  The client connection with which this operation is
+   *          associated.
+   */
+  public ClientConnection getClientConnection();
+
+
+
+  /**
+   * Retrieves the unique identifier that is assigned to the client
+   * connection that submitted this operation.
+   *
+   * @return  The unique identifier that is assigned to the client
+   *          connection that submitted this operation.
+   */
+  public long getConnectionID();
+
+
+
+  /**
+   * Retrieves the operation ID for this operation.
+   *
+   * @return  The operation ID for this operation.
+   */
+  public long getOperationID();
+
+
+
+  /**
+   * Retrieves the message ID assigned to this operation.
+   *
+   * @return  The message ID assigned to this operation.
+   */
+  public int getMessageID();
+
+
+
+  /**
+   * Retrieves the set of controls included in the request from the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls included in the request from the
+   *          client.
+   */
+  public List<Control> getRequestControls();
+
+
+
+  /**
+   * Adds the provided control to the set of request controls for this
+   * operation.
+   *
+   * @param  control  The control to add to the set of request
+   *                  controls for this operation.
+   */
+  public void addRequestControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of request controls for
+   * this operation.
+   *
+   * @param  control  The control to remove from the set of request
+   *                  controls for this operation.
+   */
+  public void removeRequestControl(Control control);
+
+
+
+  /**
+   * Retrieves the set of controls to include in the response to the
+   * client.  The contents of this list must not be altered.
+   *
+   * @return  The set of controls to include in the response to the
+   *          client.
+   */
+  public List<Control> getResponseControls();
+
+
+
+  /**
+   * Adds the provided control to the set of controls to include in
+   * the response to the client.
+   *
+   * @param  control  The control to add to the set of controls to
+   *                  include in the response to the client.
+   */
+  public void addResponseControl(Control control);
+
+
+
+  /**
+   * Removes the provided control from the set of controls to include
+   * in the response to the client.
+   *
+   * @param  control  The control to remove from the set of controls
+   *                  to include in the response to the client.
+   */
+  public void removeResponseControl(Control control);
+
+
+
+  /**
+   * Retrieves the result code for this operation.
+   *
+   * @return  The result code associated for this operation, or
+   *          <CODE>UNDEFINED</CODE> if the operation has not yet
+   *          completed.
+   */
+  public ResultCode getResultCode();
+
+
+
+  /**
+   * Specifies the result code for this operation.
+   *
+   * @param  resultCode  The result code for this operation.
+   */
+  public void setResultCode(ResultCode resultCode);
+
+
+
+  /**
+   * Retrieves the error message for this operation.  Its contents may
+   * be altered by the caller.
+   *
+   * @return  The error message for this operation.
+   */
+  public StringBuilder getErrorMessage();
+
+
+
+  /**
+   * Specifies the error message for this operation.
+   *
+   * @param  errorMessage  The error message for this operation.
+   */
+  public void setErrorMessage(StringBuilder errorMessage);
+
+
+
+  /**
+   * Appends the provided message to the error message buffer.  If the
+   * buffer has not yet been created, then this will create it first
+   * and then add the provided message.
+   *
+   * @param  message  The message to append to the error message
+   *                  buffer.
+   */
+  public void appendErrorMessage(String message);
+
+
+
+  /**
+   * Retrieves the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.  The contents of this buffer may be altered by the
+   * caller.
+   *
+   * @return  The additional log message for this operation.
+   */
+  public StringBuilder getAdditionalLogMessage();
+
+
+
+  /**
+   * Specifies the additional log message for this operation, which
+   * should be written to the log but not included in the response to
+   * the client.
+   *
+   * @param  additionalLogMessage  The additional log message for this
+   *                               operation.
+   */
+  public void setAdditionalLogMessage(
+                   StringBuilder additionalLogMessage);
+
+
+
+  /**
+   * Appends the provided message to the additional log information
+   * for this operation.
+   *
+   * @param  message  The message that should be appended to the
+   *                  additional log information for this operation.
+   */
+  public void appendAdditionalLogMessage(String message);
+
+
+
+  /**
+   * Retrieves the matched DN for this operation.
+   *
+   * @return  The matched DN for this operation, or <CODE>null</CODE>
+   *          if the operation has not yet completed or does not have
+   *          a matched DN.
+   */
+  public DN getMatchedDN();
+
+
+
+  /**
+   * Specifies the matched DN for this operation.
+   *
+   * @param  matchedDN  The matched DN for this operation.
+   */
+  public void setMatchedDN(DN matchedDN);
+
+
+
+  /**
+   * Retrieves the set of referral URLs for this operation.  Its
+   * contents must not be altered by the caller.
+   *
+   * @return  The set of referral URLs for this operation, or
+   *          <CODE>null</CODE> if the operation is not yet complete
+   *          or does not have a set of referral URLs.
+   */
+  public List<String> getReferralURLs();
+
+
+
+  /**
+   * Specifies the set of referral URLs for this operation.
+   *
+   * @param  referralURLs  The set of referral URLs for this
+   *                       operation.
+   */
+  public void setReferralURLs(List<String> referralURLs);
+
+
+
+  /**
+   * Sets the response elements for this operation based on the
+   * information contained in the provided
+   * <CODE>DirectoryException</CODE> object.
+   *
+   * @param  directoryException  The exception containing the
+   *                             information to use for the response
+   *                             elements.
+   */
+  public void setResponseData(DirectoryException directoryException);
+
+
+
+  /**
+   * Indicates whether this is an internal operation rather than one
+   * that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is an internal operation, or
+   *          <CODE>false</CODE> if it is not.
+   */
+  public boolean isInternalOperation();
+
+
+
+  /**
+   * Indicates whether this is a synchronization operation rather than
+   * one that was requested by an external client.
+   *
+   * @return  <CODE>true</CODE> if this is a data synchronization
+   *          operation, or <CODE>false</CODE> if it is not.
+   */
+  public boolean isSynchronizationOperation();
+
+
+
+  /**
+   * Retrieves the set of attachments defined for this operation, as a
+   * mapping between the attachment name and the associated object.
+   *
+   * @return  The set of attachments defined for this operation.
+   */
+  public Map<String,Object> getAttachments();
+
+
+
+  /**
+   * Retrieves the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to retrieve.  It will
+   *               be treated in a case-sensitive manner.
+   *
+   * @return  The requested attachment object, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object getAttachment(String name);
+
+
+
+  /**
+   * Removes the attachment with the specified name.
+   *
+   * @param  name  The name for the attachment to remove.  It will be
+   *               treated in a case-sensitive manner.
+   *
+   * @return  The attachment that was removed, or <CODE>null</CODE> if
+   *          it does not exist.
+   */
+  public Object removeAttachment(String name);
+
+
+
+  /**
+   * Sets the value of the specified attachment.  If an attachment
+   * already exists with the same name, it will be replaced.
+   * Otherwise, a new attachment will be added.
+   *
+   * @param  name   The name to use for the attachment.
+   * @param  value  The value to use for the attachment.
+   *
+   * @return  The former value held by the attachment with the given
+   *          name, or <CODE>null</CODE> if there was previously no
+   *          such attachment.
+   */
+  public Object setAttachment(String name, Object value);
+
+
+
+  /**
+   * Retrieves the time that processing started for this operation.
+   *
+   * @return  The time that processing started for this operation.
+   */
+  public long getProcessingStartTime();
+
+
+
+  /**
+   * Retrieves the cancel request that has been issued for this
+   * operation, if there is one.
+   *
+   * @return  The cancel request that has been issued for this
+   *          operation, or <CODE>null</CODE> if there has not been
+   *          any request to cancel.
+   */
+  public CancelRequest getCancelRequest();
+
+
+
+  /**
+   * Retrieves a string representation of this operation.
+   *
+   * @return  A string representation of this operation.
+   */
+  public String toString();
+
+
+
+  /**
+   * Appends a string representation of this operation to the provided
+   * buffer.
+   *
+   * @param  buffer  The buffer into which a string representation of
+   *                 this operation should be appended.
+   */
+  public void toString(StringBuilder buffer);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseSearchOperation.java
new file mode 100644
index 0000000..c1ae12f
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseSearchOperation.java
@@ -0,0 +1,209 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.SearchScope;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for search operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseSearchOperation
+       extends PreParseOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Specifies the raw, unprocessed base DN for this search operation.
+   *
+   * @param  rawBaseDN  The raw, unprocessed base DN for this search
+                        operation.
+   */
+  public void setRawBaseDN(ByteString rawBaseDN);
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Specifies the scope for this search operation.
+   *
+   * @param  scope  The scope for this search operation.
+   */
+  public void setScope(SearchScope scope);
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Specifies the alias dereferencing policy for this search
+   * operation.
+   *
+   * @param  derefPolicy  The alias dereferencing policy for this
+   *                      search operation.
+   */
+  public void setDerefPolicy(DereferencePolicy derefPolicy);
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Specifies the size limit for this search operation.
+   *
+   * @param  sizeLimit  The size limit for this search operation.
+   */
+  public void setSizeLimit(int sizeLimit);
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Specifies the time limit for this search operation.
+   *
+   * @param  timeLimit  The time limit for this search operation.
+   */
+  public void setTimeLimit(int timeLimit);
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Specifies the typesOnly flag for this search operation.
+   *
+   * @param  typesOnly  The typesOnly flag for this search operation.
+   */
+  public void setTypesOnly(boolean typesOnly);
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Specifies the raw, unprocessed search filter as included in the
+   * request from the client.
+   *
+   * @param  rawFilter  The raw, unprocessed search filter.
+   */
+  public void setRawFilter(LDAPFilter rawFilter);
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+
+
+
+  /**
+   * Specifies the set of requested attributes for this search
+   * operation.
+   *
+   * @param  attributes  The set of requested attributes for this
+   *                     search operation.
+   */
+  public void setAttributes(LinkedHashSet<String> attributes);
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseUnbindOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseUnbindOperation.java
new file mode 100644
index 0000000..a483090
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/PreParseUnbindOperation.java
@@ -0,0 +1,41 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * pre-parse plugins for unbind operations.  Note that this interface
+ * is intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface PreParseUnbindOperation
+       extends PreParseOperation
+{
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchEntrySearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchEntrySearchOperation.java
new file mode 100644
index 0000000..6744d26
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchEntrySearchOperation.java
@@ -0,0 +1,151 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DN;
+import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchFilter;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * search result entry plugins.  Note that this interface is intended
+ * only to define an API for use by plugins and is not intended to be
+ * implemented by any custom classes.
+ */
+public interface SearchEntrySearchOperation
+       extends InProgressOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Retrieves the base DN for this search operation.
+   *
+   * @return  The base DN for this search operation.
+   */
+  public DN getBaseDN();
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Retrieves the filter for this search operation.
+   *
+   * @return  The filter for this search operation.
+   */
+  public SearchFilter getFilter();
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchReferenceSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchReferenceSearchOperation.java
new file mode 100644
index 0000000..b2c75a4
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/SearchReferenceSearchOperation.java
@@ -0,0 +1,151 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+package org.opends.server.types.operation;
+
+
+
+import java.util.LinkedHashSet;
+
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.DN;
+import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchFilter;
+
+
+
+/**
+ * This class defines a set of methods that are available for use by
+ * search result reference plugins.  Note that this interface is
+ * intended only to define an API for use by plugins and is not
+ * intended to be implemented by any custom classes.
+ */
+public interface SearchReferenceSearchOperation
+       extends InProgressOperation
+{
+  /**
+   * Retrieves the raw, unprocessed base DN as included in the request
+   * from the client.  This may or may not contain a valid DN, as no
+   * validation will have been performed.
+   *
+   * @return  The raw, unprocessed base DN as included in the request
+   *          from the client.
+   */
+  public ByteString getRawBaseDN();
+
+
+
+  /**
+   * Retrieves the base DN for this search operation.
+   *
+   * @return  The base DN for this search operation.
+   */
+  public DN getBaseDN();
+
+
+
+  /**
+   * Retrieves the scope for this search operation.
+   *
+   * @return  The scope for this search operation.
+   */
+  public SearchScope getScope();
+
+
+
+  /**
+   * Retrieves the alias dereferencing policy for this search
+   * operation.
+   *
+   * @return  The alias dereferencing policy for this search
+   *          operation.
+   */
+  public DereferencePolicy getDerefPolicy();
+
+
+
+  /**
+   * Retrieves the size limit for this search operation.
+   *
+   * @return  The size limit for this search operation.
+   */
+  public int getSizeLimit();
+
+
+
+  /**
+   * Retrieves the time limit for this search operation.
+   *
+   * @return  The time limit for this search operation.
+   */
+  public int getTimeLimit();
+
+
+
+  /**
+   * Retrieves the typesOnly flag for this search operation.
+   *
+   * @return  The typesOnly flag for this search operation.
+   */
+  public boolean getTypesOnly();
+
+
+
+  /**
+   * Retrieves the raw, unprocessed search filter as included in the
+   * request from the client.  It may or may not contain a valid
+   * filter (e.g., unsupported attribute types or values with an
+   * invalid syntax) because no validation will have been performed on
+   * it.
+   *
+   * @return  The raw, unprocessed search filter as included in the
+   *          request from the client.
+   */
+  public LDAPFilter getRawFilter();
+
+
+
+  /**
+   * Retrieves the filter for this search operation.
+   *
+   * @return  The filter for this search operation.
+   */
+  public SearchFilter getFilter();
+
+
+
+  /**
+   * Retrieves the set of requested attributes for this search
+   * operation.  Its contents should not be be altered.
+   *
+   * @return  The set of requested attributes for this search
+   *          operation.
+   */
+  public LinkedHashSet<String> getAttributes();
+}
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/operation/package-info.java b/opendj-sdk/opends/src/server/org/opends/server/types/operation/package-info.java
new file mode 100644
index 0000000..4772704
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/operation/package-info.java
@@ -0,0 +1,43 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006 Sun Microsystems, Inc.
+ */
+
+
+
+/**
+ * Contains a number of interfaces that are implemented by the various
+ * types of Directory Server operations.  These interfaces are used to
+ * define the methods that should be available for use at various
+ * times during the operation processing (e.g., what methods are
+ * available for pre-parse versus pre-operation versus post-operation
+ * versus post-response plugins).
+ * <BR><BR>
+ * Note that none of the interfaces defined in this package are
+ * intended to be implemented by any custom code.  They should be
+ * implemented only by the core Directory Server operation types.
+ */
+package org.opends.server.types.operation;
+
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java b/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
index ed42f27..8b0574e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/LDIFReader.java
@@ -47,7 +47,6 @@
 import java.util.List;
 
 import org.opends.server.api.plugin.LDIFPluginResult;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.PluginConfigManager;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -56,6 +55,7 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogSeverity;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index 5d9e7bf..082aa90 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -40,12 +40,12 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.config.ConfigFileHandler;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.loggers.Error;
 import org.opends.server.loggers.Debug;
 import org.opends.server.plugins.InvocationCounterPlugin;
 import org.opends.server.types.DN;
 import org.opends.server.types.FilePermission;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.OperatingSystem;
 
 import static org.testng.Assert.*;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
index 938f53f..0624757 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -32,7 +32,7 @@
 import org.opends.server.TestCaseUtils;
 import org.opends.server.api.Backend;
 import org.opends.server.config.ConfigEntry;
-import org.opends.server.core.DirectoryException;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDIFImportConfig;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/changelog/UpdateComparatorTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/changelog/UpdateComparatorTest.java
index 106b630..12f0a47 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/changelog/UpdateComparatorTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/changelog/UpdateComparatorTest.java
@@ -34,12 +34,12 @@
 
 
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.synchronization.ChangeNumber;
 import org.opends.server.synchronization.DeleteContext;
 import org.opends.server.synchronization.DeleteMsg;
 import org.opends.server.synchronization.UpdateMessage;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.util.TimeThread;
 
@@ -60,7 +60,7 @@
     ChangeNumber cn1 = new ChangeNumber(1, (short) 0, (short) 1);
     ChangeNumber cn2 = new ChangeNumber(TimeThread.getTime(),
                                        (short) 123, (short) 45);
-    
+
     //
     // Create the update messgae
     InternalClientConnection connection = new InternalClientConnection();
@@ -80,7 +80,7 @@
     op.setAttachment(SYNCHROCONTEXT, new DeleteContext(cn2, "uniqueid 2"));
     DeleteMsg msg2 = new DeleteMsg(op);
 
-    
+
     return new Object[][] {
        {msg1, msg1, 0},
        {msg1, msg2, -1},
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
index a81c501..5bbb1c6 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
@@ -67,6 +67,8 @@
 import org.opends.server.protocols.ldap.ModifyDNResponseProtocolOp;
 import org.opends.server.protocols.ldap.SearchRequestProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultDoneProtocolOp;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.Control;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.Entry;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java
index 38c01d7..6714e0b 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java
@@ -61,6 +61,7 @@
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.ResultCode;
 
 import static org.testng.Assert.*;
@@ -353,32 +354,18 @@
 
 
   /**
-   * Tests the <CODE>getBindDN</CODE> and <CODE>setBindDN</CODE> methods on bind
-   * operations using simple authentication.
+   * Tests the <CODE>getBindDN</CODE> method on bind operations using simple
+   * authentication.
    *
    * @param  o  The bind operation to be tested.
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
   @Test(dataProvider = "simpleBinds")
-  public void testGetAndSetBindDNSimple(BindOperation o)
+  public void testGetBindDNSimple(BindOperation o)
          throws Exception
   {
-    DN originalDN = o.getBindDN();
-
-    o.setBindDN(null);
-    assertNull(o.getBindDN());
-
-    o.setBindDN(new DN());
-    assertNotNull(o.getBindDN());
-    assertTrue(o.getBindDN().isNullDN());
-
-    o.setBindDN(DN.decode("cn=Directory Manager"));
-    assertNotNull(o.getBindDN());
-    assertEquals(o.getBindDN(), DN.decode("cn=Directory Manager"));
-
-    o.setBindDN(originalDN);
-    assertEquals(o.getBindDN(), originalDN);
+    o.getBindDN();
   }
 
 
@@ -904,6 +891,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -943,6 +931,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -983,6 +972,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -1023,6 +1013,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -1062,6 +1053,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1101,6 +1093,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1141,6 +1134,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1181,6 +1175,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1220,6 +1215,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
@@ -1260,6 +1256,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
@@ -1301,6 +1298,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
@@ -1342,6 +1340,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
@@ -1384,6 +1383,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -1418,6 +1418,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString(), 3,
@@ -1453,6 +1454,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1487,6 +1489,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     BindRequestProtocolOp bindRequest =
          new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
@@ -1521,6 +1524,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
@@ -1556,6 +1560,7 @@
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
     ASN1Writer w = new ASN1Writer(s);
+    r.setIOTimeout(6000);
 
     ASN1OctetString saslCreds =
          new ASN1OctetString("\u0000dn:cn=Directory Manager\u0000password");
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/PasswordPolicyTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/PasswordPolicyTestCase.java
index 8f0c31f..6b54dd5 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/PasswordPolicyTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/PasswordPolicyTestCase.java
@@ -48,6 +48,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestAbsoluteSubtreeSpecification.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestAbsoluteSubtreeSpecification.java
index 090d8ea..4829bba 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestAbsoluteSubtreeSpecification.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestAbsoluteSubtreeSpecification.java
@@ -29,6 +29,7 @@
 import static org.testng.AssertJUnit.assertEquals;
 
 import org.opends.server.api.SubtreeSpecification;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.testng.annotations.Test;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandlerTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandlerTestCase.java
index e88550c..64054b0 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandlerTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandlerTestCase.java
@@ -41,7 +41,6 @@
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.BindOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.tools.LDAPSearch;
@@ -49,6 +48,7 @@
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.testng.Assert.*;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandlerTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandlerTestCase.java
index 56f7546..436375b 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandlerTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandlerTestCase.java
@@ -42,7 +42,6 @@
 import org.opends.server.core.BindOperation;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.tools.LDAPSearch;
@@ -50,6 +49,7 @@
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 
 import static org.testng.Assert.*;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java
index 303b454..56fd41a 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java
@@ -39,10 +39,10 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.AccountStatusNotificationType;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.testng.Assert.*;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExactMatchIdentityMapperTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExactMatchIdentityMapperTestCase.java
index 77943f7..05df703 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExactMatchIdentityMapperTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExactMatchIdentityMapperTestCase.java
@@ -40,9 +40,7 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.ldap.LDAPAttribute;
@@ -51,8 +49,10 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.ModificationType;
 import org.opends.server.types.ResultCode;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExternalSASLMechanismHandlerTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExternalSASLMechanismHandlerTestCase.java
index 9023107..87764be 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExternalSASLMechanismHandlerTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ExternalSASLMechanismHandlerTestCase.java
@@ -44,7 +44,6 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.asn1.ASN1Reader;
@@ -57,6 +56,7 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedKeyManagerProviderTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedKeyManagerProviderTestCase.java
index a13b4b9..2a6f6b8 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedKeyManagerProviderTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedKeyManagerProviderTestCase.java
@@ -41,9 +41,9 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.testng.Assert.*;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedTrustManagerProviderTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedTrustManagerProviderTestCase.java
index 3f2b4e0..c20b003 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedTrustManagerProviderTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileBasedTrustManagerProviderTestCase.java
@@ -41,9 +41,9 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.testng.Assert.*;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/LengthBasedPasswordValidatorTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/LengthBasedPasswordValidatorTestCase.java
index c417664..3c57f29 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/LengthBasedPasswordValidatorTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/LengthBasedPasswordValidatorTestCase.java
@@ -39,7 +39,6 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.internal.InternalClientConnection;
@@ -47,6 +46,7 @@
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
index 17bb73b..03bbdfa 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
@@ -42,7 +42,6 @@
 import org.opends.server.core.BindOperation;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.InitializationException;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -59,6 +58,7 @@
 import org.opends.server.types.Control;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
 import org.opends.server.types.ResultCode;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
index 9d33825..ab3ce55 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
@@ -35,12 +35,12 @@
 import org.opends.server.TestCaseUtils;
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.config.ConfigEntry;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.schema.AuthPasswordSyntax;
 import org.opends.server.schema.UserPasswordSyntax;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 
 import static org.testng.Assert.*;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/RandomPasswordGeneratorTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/RandomPasswordGeneratorTestCase.java
index a56cc7c..598dc9a 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/RandomPasswordGeneratorTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/RandomPasswordGeneratorTestCase.java
@@ -38,9 +38,9 @@
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.InitializationException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 
 import static org.testng.Assert.*;
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
index 4801e4d..ff130f3 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
@@ -37,21 +37,13 @@
 import org.opends.server.api.plugin.PreOperationPluginResult;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.BindOperation;
-import org.opends.server.core.CompareOperation;
-import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.Operation;
-import org.opends.server.core.SearchOperation;
 import org.opends.server.protocols.asn1.ASN1Long;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.Control;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.*;
 
 
 
@@ -125,7 +117,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
     return doPreOperationInternal(addOperation);
   }
@@ -136,7 +129,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(BindOperation bindOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationBindOperation bindOperation)
   {
     return doPreOperationInternal(bindOperation);
   }
@@ -147,8 +141,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(CompareOperation
-                                                      compareOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationCompareOperation compareOperation)
   {
     return doPreOperationInternal(compareOperation);
   }
@@ -159,8 +153,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(DeleteOperation
-                                                      deleteOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationDeleteOperation deleteOperation)
   {
     return doPreOperationInternal(deleteOperation);
   }
@@ -171,8 +165,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ExtendedOperation
-                                                      extendedOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationExtendedOperation extendedOperation)
   {
     return doPreOperationInternal(extendedOperation);
   }
@@ -183,8 +177,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
     return doPreOperationInternal(modifyOperation);
   }
@@ -195,8 +189,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyDNOperation
-                                                      modifyDNOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
     return doPreOperationInternal(modifyDNOperation);
   }
@@ -207,8 +201,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(SearchOperation
-                                                      searchOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationSearchOperation searchOperation)
   {
     return doPreOperationInternal(searchOperation);
   }
@@ -225,7 +219,8 @@
    *
    * @return  The result of the plugin processing.
    */
-  private PreOperationPluginResult doPreOperationInternal(Operation operation)
+  private PreOperationPluginResult
+       doPreOperationInternal(PreOperationOperation operation)
   {
     long delayDuration = 0L;
     List<Control> requestControls = operation.getRequestControls();
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
index bea935b..fb80627 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
@@ -32,6 +32,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.opends.server.api.ClientConnection;
 import org.opends.server.api.plugin.DirectoryServerPlugin;
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.api.plugin.PostOperationPluginResult;
@@ -40,22 +41,12 @@
 import org.opends.server.api.plugin.PreParsePluginResult;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AbandonOperation;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.BindOperation;
-import org.opends.server.core.CompareOperation;
-import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.Operation;
-import org.opends.server.core.SearchOperation;
-import org.opends.server.core.UnbindOperation;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.Control;
 import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.operation.*;
 
 
 
@@ -166,9 +157,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AbandonOperation abandonOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseAbandonOperation abandonOperation)
   {
-    if (disconnectInternal(abandonOperation, "PreParse"))
+    if (disconnectInternal(abandonOperation.getClientConnection(),
+                           abandonOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -184,9 +177,10 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AddOperation addOperation)
+  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
   {
-    if (disconnectInternal(addOperation, "PreParse"))
+    if (disconnectInternal(addOperation.getClientConnection(),
+                           addOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -202,9 +196,10 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(BindOperation bindOperation)
+  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
   {
-    if (disconnectInternal(bindOperation, "PreParse"))
+    if (disconnectInternal(bindOperation.getClientConnection(),
+                           bindOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -220,9 +215,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(CompareOperation compareOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseCompareOperation compareOperation)
   {
-    if (disconnectInternal(compareOperation, "PreParse"))
+    if (disconnectInternal(compareOperation.getClientConnection(),
+                           compareOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -238,9 +235,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(DeleteOperation deleteOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseDeleteOperation deleteOperation)
   {
-    if (disconnectInternal(deleteOperation, "PreParse"))
+    if (disconnectInternal(deleteOperation.getClientConnection(),
+                           deleteOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -256,9 +255,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ExtendedOperation extendedOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseExtendedOperation extendedOperation)
   {
-    if (disconnectInternal(extendedOperation, "PreParse"))
+    if (disconnectInternal(extendedOperation.getClientConnection(),
+                           extendedOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -274,9 +275,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyOperation modifyOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyOperation modifyOperation)
   {
-    if (disconnectInternal(modifyOperation, "PreParse"))
+    if (disconnectInternal(modifyOperation.getClientConnection(),
+                           modifyOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -292,9 +295,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyDNOperation modifyDNOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyDNOperation modifyDNOperation)
   {
-    if (disconnectInternal(modifyDNOperation, "PreParse"))
+    if (disconnectInternal(modifyDNOperation.getClientConnection(),
+                           modifyDNOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -310,9 +315,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(SearchOperation searchOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseSearchOperation searchOperation)
   {
-    if (disconnectInternal(searchOperation, "PreParse"))
+    if (disconnectInternal(searchOperation.getClientConnection(),
+                           searchOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -328,9 +335,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(UnbindOperation unbindOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseUnbindOperation unbindOperation)
   {
-    if (disconnectInternal(unbindOperation, "PreParse"))
+    if (disconnectInternal(unbindOperation.getClientConnection(),
+                           unbindOperation.getRequestControls(), "PreParse"))
     {
       return new PreParsePluginResult(true, false, false);
     }
@@ -346,9 +355,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
-    if (disconnectInternal(addOperation, "PreOperation"))
+    if (disconnectInternal(addOperation.getClientConnection(),
+                           addOperation.getRequestControls(), "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -364,9 +375,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(BindOperation bindOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationBindOperation bindOperation)
   {
-    if (disconnectInternal(bindOperation, "PreOperation"))
+    if (disconnectInternal(bindOperation.getClientConnection(),
+                           bindOperation.getRequestControls(), "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -382,10 +395,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(CompareOperation
-                                                      compareOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationCompareOperation compareOperation)
   {
-    if (disconnectInternal(compareOperation, "PreOperation"))
+    if (disconnectInternal(compareOperation.getClientConnection(),
+                           compareOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -401,10 +416,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(DeleteOperation
-                                                      deleteOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationDeleteOperation deleteOperation)
   {
-    if (disconnectInternal(deleteOperation, "PreOperation"))
+    if (disconnectInternal(deleteOperation.getClientConnection(),
+                           deleteOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -420,10 +437,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ExtendedOperation
-                                                      extendedOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationExtendedOperation extendedOperation)
   {
-    if (disconnectInternal(extendedOperation, "PreOperation"))
+    if (disconnectInternal(extendedOperation.getClientConnection(),
+                           extendedOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -439,10 +458,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
-    if (disconnectInternal(modifyOperation, "PreOperation"))
+    if (disconnectInternal(modifyOperation.getClientConnection(),
+                           modifyOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -458,10 +479,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyDNOperation
-                                                      modifyDNOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
-    if (disconnectInternal(modifyDNOperation, "PreOperation"))
+    if (disconnectInternal(modifyDNOperation.getClientConnection(),
+                           modifyDNOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -477,10 +500,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(SearchOperation
-                                                      searchOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationSearchOperation searchOperation)
   {
-    if (disconnectInternal(searchOperation, "PreOperation"))
+    if (disconnectInternal(searchOperation.getClientConnection(),
+                           searchOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PreOperationPluginResult(true, false, false);
     }
@@ -496,10 +521,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(AbandonOperation
-                                                        abandonOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationAbandonOperation abandonOperation)
   {
-    if (disconnectInternal(abandonOperation, "PreOperation"))
+    if (disconnectInternal(abandonOperation.getClientConnection(),
+                           abandonOperation.getRequestControls(),
+                           "PreOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -515,9 +542,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(AddOperation addOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationAddOperation addOperation)
   {
-    if (disconnectInternal(addOperation, "PostOperation"))
+    if (disconnectInternal(addOperation.getClientConnection(),
+                           addOperation.getRequestControls(), "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -533,9 +562,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(BindOperation bindOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationBindOperation bindOperation)
   {
-    if (disconnectInternal(bindOperation, "PostOperation"))
+    if (disconnectInternal(bindOperation.getClientConnection(),
+                           bindOperation.getRequestControls(), "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -551,10 +582,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(CompareOperation
-                                                        compareOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationCompareOperation compareOperation)
   {
-    if (disconnectInternal(compareOperation, "PostOperation"))
+    if (disconnectInternal(compareOperation.getClientConnection(),
+                           compareOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -570,10 +603,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(DeleteOperation
-                                                        deleteOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationDeleteOperation deleteOperation)
   {
-    if (disconnectInternal(deleteOperation, "PostOperation"))
+    if (disconnectInternal(deleteOperation.getClientConnection(),
+                           deleteOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -589,10 +624,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ExtendedOperation
-                                                        extendedOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationExtendedOperation extendedOperation)
   {
-    if (disconnectInternal(extendedOperation, "PostOperation"))
+    if (disconnectInternal(extendedOperation.getClientConnection(),
+                           extendedOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -608,10 +645,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ModifyOperation
-                                                        modifyOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationModifyOperation modifyOperation)
   {
-    if (disconnectInternal(modifyOperation, "PostOperation"))
+    if (disconnectInternal(modifyOperation.getClientConnection(),
+                           modifyOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -627,10 +666,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ModifyDNOperation
-                                                        modifyDNOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationModifyDNOperation modifyDNOperation)
   {
-    if (disconnectInternal(modifyDNOperation, "PostOperation"))
+    if (disconnectInternal(modifyDNOperation.getClientConnection(),
+                           modifyDNOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -646,10 +687,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(SearchOperation
-                                                        searchOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationSearchOperation searchOperation)
   {
-    if (disconnectInternal(searchOperation, "PostOperation"))
+    if (disconnectInternal(searchOperation.getClientConnection(),
+                           searchOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -665,10 +708,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(UnbindOperation
-                                                        unbindOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationUnbindOperation unbindOperation)
   {
-    if (disconnectInternal(unbindOperation, "PostOperation"))
+    if (disconnectInternal(unbindOperation.getClientConnection(),
+                           unbindOperation.getRequestControls(),
+                           "PostOperation"))
     {
       return new PostOperationPluginResult(true, false);
     }
@@ -684,9 +729,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(AddOperation addOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseAddOperation addOperation)
   {
-    if (disconnectInternal(addOperation, "PostResponse"))
+    if (disconnectInternal(addOperation.getClientConnection(),
+                           addOperation.getRequestControls(), "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -702,9 +749,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(BindOperation bindOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseBindOperation bindOperation)
   {
-    if (disconnectInternal(bindOperation, "PostResponse"))
+    if (disconnectInternal(bindOperation.getClientConnection(),
+                           bindOperation.getRequestControls(), "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -720,10 +769,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(CompareOperation
-                                                        compareOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseCompareOperation compareOperation)
   {
-    if (disconnectInternal(compareOperation, "PostResponse"))
+    if (disconnectInternal(compareOperation.getClientConnection(),
+                           compareOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -739,10 +790,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(DeleteOperation
-                                                        deleteOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseDeleteOperation deleteOperation)
   {
-    if (disconnectInternal(deleteOperation, "PostResponse"))
+    if (disconnectInternal(deleteOperation.getClientConnection(),
+                           deleteOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -758,10 +811,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ExtendedOperation
-                                                        extendedOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseExtendedOperation extendedOperation)
   {
-    if (disconnectInternal(extendedOperation, "PostResponse"))
+    if (disconnectInternal(extendedOperation.getClientConnection(),
+                           extendedOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -777,10 +832,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ModifyOperation
-                                                        modifyOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseModifyOperation modifyOperation)
   {
-    if (disconnectInternal(modifyOperation, "PostResponse"))
+    if (disconnectInternal(modifyOperation.getClientConnection(),
+                           modifyOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -796,10 +853,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ModifyDNOperation
-                                                        modifyDNOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
   {
-    if (disconnectInternal(modifyDNOperation, "PostResponse"))
+    if (disconnectInternal(modifyDNOperation.getClientConnection(),
+                           modifyDNOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -815,10 +874,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(SearchOperation
-                                                        searchOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseSearchOperation searchOperation)
   {
-    if (disconnectInternal(searchOperation, "PostResponse"))
+    if (disconnectInternal(searchOperation.getClientConnection(),
+                           searchOperation.getRequestControls(),
+                           "PostResponse"))
     {
       return new PostResponsePluginResult(true, false);
     }
@@ -840,9 +901,10 @@
    * @return  <CODE>true</CODE> if the client connection was terminated, or
    *          <CODE>false</CODE> if it was not.
    */
-  private boolean disconnectInternal(Operation operation, String section)
+  private boolean disconnectInternal(ClientConnection clientConnection,
+                                     List<Control> requestControls,
+                                     String section)
   {
-    List<Control> requestControls = operation.getRequestControls();
     if (requestControls != null)
     {
       for (Control c : requestControls)
@@ -851,8 +913,7 @@
         {
           if (c.getValue().stringValue().equalsIgnoreCase(section))
           {
-            operation.getClientConnection().disconnect(
-                 DisconnectReason.CLOSED_BY_PLUGIN, true,
+            clientConnection.disconnect(DisconnectReason.CLOSED_BY_PLUGIN, true,
                  "Closed by disconnect client plugin (section " + section + ")",
                  -1);
 
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java
index 800e9e7..123b6ab 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java
@@ -48,18 +48,7 @@
 import org.opends.server.api.plugin.SearchReferencePluginResult;
 import org.opends.server.api.plugin.StartupPluginResult;
 import org.opends.server.config.ConfigEntry;
-import org.opends.server.core.AbandonOperation;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.BindOperation;
-import org.opends.server.core.CompareOperation;
-import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.Operation;
-import org.opends.server.core.SearchOperation;
-import org.opends.server.core.UnbindOperation;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.Entry;
 import org.opends.server.types.IntermediateResponse;
@@ -67,6 +56,7 @@
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchResultReference;
+import org.opends.server.types.operation.*;
 
 
 
@@ -143,7 +133,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AbandonOperation abandonOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseAbandonOperation abandonOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -155,7 +146,7 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AddOperation addOperation)
+  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -167,7 +158,7 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(BindOperation bindOperation)
+  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -179,7 +170,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(CompareOperation compareOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseCompareOperation compareOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -191,7 +183,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(DeleteOperation deleteOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseDeleteOperation deleteOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -203,7 +196,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ExtendedOperation extendedOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseExtendedOperation extendedOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -215,7 +209,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyOperation modifyOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyOperation modifyOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -227,7 +222,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyDNOperation modifyDNOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyDNOperation modifyDNOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -239,7 +235,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(SearchOperation searchOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseSearchOperation searchOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -251,7 +248,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(UnbindOperation unbindOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseUnbindOperation unbindOperation)
   {
     preParseCounter.incrementAndGet();
     return new PreParsePluginResult();
@@ -289,7 +287,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -301,7 +300,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(BindOperation bindOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationBindOperation bindOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -313,8 +313,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(CompareOperation
-                                                      compareOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationCompareOperation compareOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -326,8 +326,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(DeleteOperation
-                                                      deleteOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationDeleteOperation deleteOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -339,8 +339,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ExtendedOperation
-                                                      extendedOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationExtendedOperation extendedOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -352,8 +352,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -365,8 +365,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyDNOperation
-                                                      modifyDNOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -378,8 +378,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(SearchOperation
-                                                      searchOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationSearchOperation searchOperation)
   {
     preOperationCounter.incrementAndGet();
     return new PreOperationPluginResult();
@@ -417,8 +417,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(AbandonOperation
-                                                        abandonOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationAbandonOperation abandonOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -430,7 +430,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(AddOperation addOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationAddOperation addOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -442,7 +443,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(BindOperation bindOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationBindOperation bindOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -454,8 +456,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(CompareOperation
-                                                        compareOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationCompareOperation compareOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -467,8 +469,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(DeleteOperation
-                                                        deleteOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationDeleteOperation deleteOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -480,8 +482,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ExtendedOperation
-                                                        extendedOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationExtendedOperation extendedOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -493,8 +495,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ModifyOperation
-                                                        modifyOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationModifyOperation modifyOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -506,8 +508,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(ModifyDNOperation
-                                                        modifyDNOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationModifyDNOperation modifyDNOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -519,8 +521,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(SearchOperation
-                                                        searchOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationSearchOperation searchOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -532,8 +534,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostOperationPluginResult doPostOperation(UnbindOperation
-                                                        unbindOperation)
+  public PostOperationPluginResult
+       doPostOperation(PostOperationUnbindOperation unbindOperation)
   {
     postOperationCounter.incrementAndGet();
     return new PostOperationPluginResult();
@@ -571,7 +573,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(AddOperation addOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseAddOperation addOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -583,7 +586,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(BindOperation bindOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseBindOperation bindOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -595,8 +599,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(CompareOperation
-                                                        compareOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseCompareOperation compareOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -608,8 +612,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(DeleteOperation
-                                                        deleteOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseDeleteOperation deleteOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -621,8 +625,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ExtendedOperation
-                                                        extendedOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseExtendedOperation extendedOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -634,8 +638,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ModifyOperation
-                                                        modifyOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseModifyOperation modifyOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -647,8 +651,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(ModifyDNOperation
-                                                        modifyDNOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -660,8 +664,8 @@
    * {@inheritDoc}
    */
   @Override()
-  public PostResponsePluginResult doPostResponse(SearchOperation
-                                                        searchOperation)
+  public PostResponsePluginResult
+       doPostResponse(PostResponseSearchOperation searchOperation)
   {
     postResponseCounter.incrementAndGet();
     return new PostResponsePluginResult();
@@ -699,9 +703,9 @@
    * {@inheritDoc}
    */
   @Override()
-  public SearchEntryPluginResult processSearchEntry(
-                                      SearchOperation searchOperation,
-                                      SearchResultEntry searchEntry)
+  public SearchEntryPluginResult
+       processSearchEntry(SearchEntrySearchOperation searchOperation,
+                          SearchResultEntry searchEntry)
   {
     searchEntryCounter.incrementAndGet();
     return new SearchEntryPluginResult();
@@ -740,9 +744,9 @@
    * {@inheritDoc}
    */
   @Override()
-  public SearchReferencePluginResult processSearchReference(
-                                          SearchOperation searchOperation,
-                                          SearchResultReference searchReference)
+  public SearchReferencePluginResult
+       processSearchReference(SearchReferenceSearchOperation searchOperation,
+                              SearchResultReference searchReference)
   {
     searchReferenceCounter.incrementAndGet();
     return new SearchReferencePluginResult();
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
index 33c0bd5..bb0a654 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
@@ -38,18 +38,7 @@
 import org.opends.server.api.plugin.PreParsePluginResult;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AbandonOperation;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.BindOperation;
-import org.opends.server.core.CompareOperation;
-import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ExtendedOperation;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.Operation;
-import org.opends.server.core.SearchOperation;
-import org.opends.server.core.UnbindOperation;
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1Enumerated;
 import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -57,6 +46,7 @@
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.types.Control;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.*;
 
 
 
@@ -139,9 +129,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AbandonOperation abandonOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseAbandonOperation abandonOperation)
   {
-    int resultCode = shortCircuitInternal(abandonOperation, "PreParse");
+    int resultCode = shortCircuitInternal(abandonOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       abandonOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -160,9 +152,10 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(AddOperation addOperation)
+  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
   {
-    int resultCode = shortCircuitInternal(addOperation, "PreParse");
+    int resultCode = shortCircuitInternal(addOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       addOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -181,9 +174,10 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(BindOperation bindOperation)
+  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
   {
-    int resultCode = shortCircuitInternal(bindOperation, "PreParse");
+    int resultCode = shortCircuitInternal(bindOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       bindOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -202,9 +196,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(CompareOperation compareOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseCompareOperation compareOperation)
   {
-    int resultCode = shortCircuitInternal(compareOperation, "PreParse");
+    int resultCode = shortCircuitInternal(compareOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       compareOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -223,9 +219,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(DeleteOperation deleteOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseDeleteOperation deleteOperation)
   {
-    int resultCode = shortCircuitInternal(deleteOperation, "PreParse");
+    int resultCode = shortCircuitInternal(deleteOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       deleteOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -244,9 +242,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ExtendedOperation extendedOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseExtendedOperation extendedOperation)
   {
-    int resultCode = shortCircuitInternal(extendedOperation, "PreParse");
+    int resultCode =
+             shortCircuitInternal(extendedOperation.getRequestControls(),
+                                  "PreParse");
     if (resultCode >= 0)
     {
       extendedOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -265,9 +266,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyOperation modifyOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyOperation modifyOperation)
   {
-    int resultCode = shortCircuitInternal(modifyOperation, "PreParse");
+    int resultCode = shortCircuitInternal(modifyOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       modifyOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -286,9 +289,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(ModifyDNOperation modifyDNOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseModifyDNOperation modifyDNOperation)
   {
-    int resultCode = shortCircuitInternal(modifyDNOperation, "PreParse");
+    int resultCode =
+             shortCircuitInternal(modifyDNOperation.getRequestControls(),
+                                  "PreParse");
     if (resultCode >= 0)
     {
       modifyDNOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -307,9 +313,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(SearchOperation searchOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseSearchOperation searchOperation)
   {
-    int resultCode = shortCircuitInternal(searchOperation, "PreParse");
+    int resultCode = shortCircuitInternal(searchOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       searchOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -328,9 +336,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreParsePluginResult doPreParse(UnbindOperation unbindOperation)
+  public PreParsePluginResult
+       doPreParse(PreParseUnbindOperation unbindOperation)
   {
-    int resultCode = shortCircuitInternal(unbindOperation, "PreParse");
+    int resultCode = shortCircuitInternal(unbindOperation.getRequestControls(),
+                                          "PreParse");
     if (resultCode >= 0)
     {
       unbindOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -349,9 +359,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(AddOperation addOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationAddOperation addOperation)
   {
-    int resultCode = shortCircuitInternal(addOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(addOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       addOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -370,9 +382,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(BindOperation bindOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationBindOperation bindOperation)
   {
-    int resultCode = shortCircuitInternal(bindOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(bindOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       bindOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -391,10 +405,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(CompareOperation
-                                                      compareOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationCompareOperation compareOperation)
   {
-    int resultCode = shortCircuitInternal(compareOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(compareOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       compareOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -413,10 +428,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(DeleteOperation
-                                                      deleteOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationDeleteOperation deleteOperation)
   {
-    int resultCode = shortCircuitInternal(deleteOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(deleteOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       deleteOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -435,10 +451,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ExtendedOperation
-                                                      extendedOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationExtendedOperation extendedOperation)
   {
-    int resultCode = shortCircuitInternal(extendedOperation, "PreOperation");
+    int resultCode =
+             shortCircuitInternal(extendedOperation.getRequestControls(),
+                                  "PreOperation");
     if (resultCode >= 0)
     {
       extendedOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -457,10 +475,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyOperation
-                                                      modifyOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyOperation modifyOperation)
   {
-    int resultCode = shortCircuitInternal(modifyOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(modifyOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       modifyOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -479,10 +498,12 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(ModifyDNOperation
-                                                      modifyDNOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
   {
-    int resultCode = shortCircuitInternal(modifyDNOperation, "PreOperation");
+    int resultCode =
+             shortCircuitInternal(modifyDNOperation.getRequestControls(),
+                                  "PreOperation");
     if (resultCode >= 0)
     {
       modifyDNOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -501,10 +522,11 @@
    * {@inheritDoc}
    */
   @Override()
-  public PreOperationPluginResult doPreOperation(SearchOperation
-                                                      searchOperation)
+  public PreOperationPluginResult
+       doPreOperation(PreOperationSearchOperation searchOperation)
   {
-    int resultCode = shortCircuitInternal(searchOperation, "PreOperation");
+    int resultCode = shortCircuitInternal(searchOperation.getRequestControls(),
+                                          "PreOperation");
     if (resultCode >= 0)
     {
       searchOperation.setResultCode(ResultCode.valueOf(resultCode));
@@ -529,9 +551,9 @@
    * @return  The result code that should be immediately sent to the client, or
    *          -1 if operation processing should continue as normal.
    */
-  private int shortCircuitInternal(Operation operation, String section)
+  private int shortCircuitInternal(List<Control> requestControls,
+                                   String section)
   {
-    List<Control> requestControls = operation.getRequestControls();
     if (requestControls != null)
     {
       for (Control c : requestControls)
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
index dfe9116..ed229f7 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
@@ -41,8 +41,6 @@
 import org.opends.server.api.ConnectionSecurityProvider;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.BindOperation;
-import org.opends.server.core.CancelRequest;
-import org.opends.server.core.CancelResult;
 import org.opends.server.core.CompareOperation;
 import org.opends.server.core.DeleteOperation;
 import org.opends.server.core.DirectoryServer;
@@ -56,6 +54,8 @@
 import org.opends.server.protocols.ldap.LDAPModification;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AuthenticationInfo;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.DN;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/EqualityMatchingRuleTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/EqualityMatchingRuleTest.java
index a939589..0abe9ee 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/EqualityMatchingRuleTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/EqualityMatchingRuleTest.java
@@ -27,12 +27,12 @@
 package org.opends.server.schema;
 
 import org.opends.server.api.EqualityMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AcceptRejectWarn;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.ConditionResult;
+import org.opends.server.types.DirectoryException;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -62,7 +62,7 @@
 
   /**
    * Get an instance of the matching rule.
-   * 
+   *
    * @return An instance of the matching rule to test.
    */
   public abstract EqualityMatchingRule getRule();
@@ -86,7 +86,7 @@
     assertEquals(result, liveResult);
   }
 
-  
+
   /**
    * Generate data for the EqualityMatching Rule test in warn mode.
    *
@@ -97,9 +97,9 @@
   {
     return new Object[][] {};
   }
-  
+
   /**
-   * Test the normalization and the comparison in the warning mode 
+   * Test the normalization and the comparison in the warning mode
    */
   @Test(dataProvider= "warnmodeEqualityMatchingRule")
   public void warnmodeEqualityMatchingRules(
@@ -108,14 +108,14 @@
   {
     AcceptRejectWarn accept = DirectoryServer.getSyntaxEnforcementPolicy();
     DirectoryServer.setSyntaxEnforcementPolicy(AcceptRejectWarn.WARN);
-    try 
+    try
     {
       equalityMatchingRules(value1, value2, result);
     }
     finally
     {
       DirectoryServer.setSyntaxEnforcementPolicy(accept);
-    } 
+    }
   }
 
   /**
@@ -142,7 +142,7 @@
            " should detect that value \"" + value + "\" is invalid");
     }
   }
-  
+
   /**
    * Generate data for the EqualityMatching Rule test.
    *
@@ -153,7 +153,7 @@
   {
     return new Object[][] {};
   }
-  
+
   /**
    * Test the valuesMatch method used for extensible filters.
    */
@@ -175,7 +175,7 @@
       assertEquals(ConditionResult.TRUE, liveResult);
     else
       assertEquals(ConditionResult.FALSE, liveResult);
-    
+
   }
 
 }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/OrderingMatchingRuleTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/OrderingMatchingRuleTest.java
index 57d930e..9d3c926 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/OrderingMatchingRuleTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/OrderingMatchingRuleTest.java
@@ -29,11 +29,11 @@
 import static org.testng.Assert.*;
 
 import org.opends.server.api.OrderingMatchingRule;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.types.AcceptRejectWarn;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.DirectoryException;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -166,33 +166,33 @@
 
   private void dummy ()
   {
-  
+
        Object a = new Object[][] {
-        
-  
-  
-      
-  
-           
-  
-          
-  
-         
+
+
+
+
+
+
+
+
+
+
       };
-  
+
   }
 
 
   private Object dummy_invalid()
   {
     return new Object[][] {
-      
 
 
 
 
 
-        
+
+
     };
   }
 }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ServerStateTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ServerStateTest.java
index 40ab358..3e303fa 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ServerStateTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ServerStateTest.java
@@ -41,7 +41,6 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyOperation;
@@ -53,6 +52,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
@@ -67,7 +67,7 @@
  */
 public class ServerStateTest extends SynchronizationTestCase
 {
- 
+
   /**
    * Create ChangeNumber Data
    */
@@ -89,14 +89,14 @@
     // Check constructor
     DN dn = DN.decode("cn=com");
     ServerState serverState = new ServerState(dn) ;
-    
+
     // Check Load
     // serverState.loadState() ;
     // TODO Check result
-    
+
     // Check getServerStateDn()
     DN returned_DN = serverState.getServerStateDn();
-    // TODO Check the returned DN  
+    // TODO Check the returned DN
 
     // Check update
     assertFalse(serverState.update(null));
@@ -106,29 +106,29 @@
     cn1 = new ChangeNumber(cn.getTime()+1,cn.getSeqnum(),cn.getServerId());
     cn2 = new ChangeNumber(cn1.getTime(),cn1.getSeqnum()+1,cn1.getServerId());
     cn3 = new ChangeNumber(cn2.getTime(),cn2.getSeqnum(),(short)(cn2.getServerId()+1));
-    
+
     assertTrue(serverState.update(cn1)) ;
     assertTrue(serverState.update(cn2)) ;
     assertTrue(serverState.update(cn3)) ;
-    
+
     // Check toStringSet
     ChangeNumber[] cns = {cn2,cn3};
     Set<String> stringSet = serverState.toStringSet();
-    assertEquals(cns.length, stringSet.size()); 
+    assertEquals(cns.length, stringSet.size());
     // TODO Check the value
-    
+
     // Check getMaxChangeNumber
     assertEquals(cn2.compareTo(serverState.getMaxChangeNumber(cn2.getServerId())),0);
     assertEquals(cn3.compareTo(serverState.getMaxChangeNumber(cn3.getServerId())),0);
-    
+
     // Check the toString
     String stringRep = serverState.toString() ;
     // TODO Check the value
-    
+
     // Check getBytes
     byte[] b = serverState.getBytes();
     ServerState generatedServerState = new ServerState(b,0,b.length -1) ;
     assertEquals(b, generatedServerState.getBytes()) ;
-    
+
   }
 }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
index 3296cdb..e3d33f1 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SynchronizationMsgTest.java
@@ -39,7 +39,6 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyOperation;
@@ -49,6 +48,7 @@
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
@@ -138,7 +138,7 @@
     ModifyMsg msg = new ModifyMsg(changeNumber, dn, mods, "fakeuniqueid");
     ModifyMsg generatedMsg = (ModifyMsg) SynchronizationMessage
         .generateMsg(msg.getBytes());
-    
+
 
     assertEquals(msg.getChangeNumber(), generatedMsg.getChangeNumber());
 
@@ -147,7 +147,7 @@
 
     assertEquals(op.getClass(), ModifyOperation.class);
     assertEquals(generatedOperation.getClass(), ModifyOperation.class);
-    
+
     ModifyOperation mod1 = (ModifyOperation) op;
     ModifyOperation mod2 = (ModifyOperation) generatedOperation;
 
@@ -161,7 +161,7 @@
     // Check pending change
     testPendingChange(changeNumber,op,msg);
   }
-  
+
   /**
    * Create a Update Message from the data provided above.
    * The call getBytes() to test the encoding of the Msg and
@@ -176,37 +176,37 @@
     DN dn = DN.decode(rawdn);
     InternalClientConnection connection = new InternalClientConnection();
     ModifyMsg msg = new ModifyMsg(changeNumber, dn, mods, "fakeuniqueid");;
-    
+
     // Check uuid
     assertEquals("fakeuniqueid", msg.getUniqueId());
-    
+
     // Check isAssured
     assertFalse(msg.isAssured());
     msg.setAssured();
     assertTrue(msg.isAssured());
-    
+
     // Check equals
     ModifyMsg generatedMsg = (ModifyMsg) SynchronizationMessage
         .generateMsg(msg.getBytes());
     assertFalse(msg.equals(null));
     assertFalse(msg.equals(new Object()));
     assertTrue(msg.equals(generatedMsg));
-    
+
     // Check hashCode
     assertEquals(msg.hashCode(), generatedMsg.hashCode());
-    
+
     // Check compareTo
     assertEquals(msg.compareTo(generatedMsg), 0);
-    
+
     // Check Get / Set DN
     assertTrue(dn.equals(DN.decode(msg.getDn())));
-    
+
     String fakeDN = "cn=fake cn";
     msg.setDn(fakeDN) ;
     assertEquals(msg.getDn(), fakeDN) ;
 
   }
-  
+
   /**
    * Build some data for the DeleteMsg test below.
    * @throws DirectoryException
@@ -238,7 +238,7 @@
     DeleteMsg msg = new DeleteMsg(op);
     DeleteMsg generatedMsg = (DeleteMsg) SynchronizationMessage
         .generateMsg(msg.getBytes());
-    
+
     assertEquals(msg.toString(), generatedMsg.toString());
 
     assertEquals(msg.getChangeNumber(), generatedMsg.getChangeNumber());
@@ -250,7 +250,7 @@
     DeleteOperation mod2 = (DeleteOperation) generatedOperation;
 
     assertEquals(op.getRawEntryDN(), mod2.getRawEntryDN());
-    
+
     // Create an update message from this op
     DeleteMsg updateMsg = (DeleteMsg) UpdateMessage.generateMsg(op, true);
     assertEquals(msg.getChangeNumber(), updateMsg.getChangeNumber());
@@ -295,7 +295,7 @@
     assertEquals(op.getRawNewRDN(), mod2.getRawNewRDN());
     assertEquals(op.deleteOldRDN(), mod2.deleteOldRDN());
     assertEquals(op.getRawNewSuperior(), mod2.getRawNewSuperior());
-    
+
     // Create an update message from this op
     ModifyDNMsg updateMsg = (ModifyDNMsg) UpdateMessage.generateMsg(op, true);
     assertEquals(msg.getChangeNumber(), updateMsg.getChangeNumber());
@@ -320,7 +320,7 @@
     Attribute objectClass =
       new Attribute(DirectoryServer.getObjectClassAttributeType(),
         "objectClass", ocValues);
-    HashMap<ObjectClass,String> objectClassList= 
+    HashMap<ObjectClass,String> objectClassList=
       new HashMap<ObjectClass,String>();
     objectClassList.put(DirectoryServer.getObjectClass("organization"),
         "organization");
@@ -331,7 +331,7 @@
     values.add(new AttributeValue(org, "com"));
     Attribute attr = new Attribute(org, "o", values);
     userAttributes.add(attr);
-    HashMap<AttributeType,List<Attribute>> userAttList= 
+    HashMap<AttributeType,List<Attribute>> userAttList=
       new HashMap<AttributeType,List<Attribute>>();
     userAttList.put(org,userAttributes);
 
@@ -342,7 +342,7 @@
     values.add(new AttributeValue(org, "dc=creator"));
     attr = new Attribute(org, "creatorsname", values);
     operationalAttributes.add(attr);
-    HashMap<AttributeType,List<Attribute>> opList= 
+    HashMap<AttributeType,List<Attribute>> opList=
       new HashMap<AttributeType,List<Attribute>>();
     opList.put(org,operationalAttributes);
 
@@ -357,17 +357,17 @@
     assertEquals(msg.getBytes(), generatedMsg.getBytes());
     assertEquals(msg.toString(), generatedMsg.toString());
     // TODO : should test that generated attributes match original attributes.
-    
+
     // Create an new Add Operation from the current addMsg
     InternalClientConnection connection = new InternalClientConnection();
     AddOperation addOp = msg.createOperation(connection, rawDN) ;
     // TODO : should test that generated attributes match original attributes.
     // List<LDAPAttribute> rawAtt = addOp.getRawAttributes();
-    
-    
+
+
     assertEquals(msg.getBytes(), generatedMsg.getBytes());
     assertEquals(msg.toString(), generatedMsg.toString());
-    
+
     //Create an Add operation and generate and Add msg from it
     DN dn = DN.decode(rawDN);
 
@@ -376,18 +376,18 @@
     OperationContext opCtx = new AddContext(cn, "thisIsaUniqueID",
         "parentUniqueId");
     addOp.setAttachment(SYNCHROCONTEXT, opCtx);
-    
+
     generatedMsg = new AddMsg(addOp);
     assertEquals(msg.getBytes(), generatedMsg.getBytes());
     assertEquals(msg.toString(), generatedMsg.toString());
     // TODO : should test that generated attributes match original attributes.
-    
-    
+
+
     // Create an update message from this op
     AddMsg updateMsg = (AddMsg) UpdateMessage.generateMsg(addOp, true);
     assertEquals(msg.getChangeNumber(), updateMsg.getChangeNumber());
 
-    
+
   }
 
   /**
@@ -439,7 +439,7 @@
     // Check that retrieved CN is OK
     msg2 = (AckMessage) SynchronizationMessage.generateMsg(msg1.getBytes());
   }
-  
+
   /**
    * Test PendingChange
    */
@@ -451,23 +451,23 @@
     }
     UpdateMessage updateMsg = (UpdateMessage) msg;
     PendingChange pendingChange = new PendingChange(cn,null,null);
-    
+
     pendingChange.setCommitted(false);
     assertFalse(pendingChange.isCommitted()) ;
     pendingChange.setCommitted(true);
     assertTrue(pendingChange.isCommitted()) ;
-    
+
 
     assertTrue(cn.compareTo(pendingChange.getChangeNumber()) == 0);
-    
+
     assertEquals(pendingChange.getMsg(), null) ;
     pendingChange.setMsg(updateMsg);
     assertEquals(updateMsg.getBytes(), pendingChange.getMsg().getBytes());
-    
+
     assertEquals(pendingChange.getOp(), null) ;
     pendingChange.setOp(op);
     assertEquals(op.getClass(), op.getClass());
-    
+
   }
 
 }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/UpdateOperationTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/UpdateOperationTest.java
index a499602..34e7dff 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/UpdateOperationTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/UpdateOperationTest.java
@@ -47,7 +47,6 @@
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.Operation;
-import org.opends.server.core.OperationType;
 
 import org.opends.server.protocols.internal.InternalClientConnection;
 
@@ -58,6 +57,7 @@
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
 import org.opends.server.types.ModificationType;
+import org.opends.server.types.OperationType;
 import org.opends.server.types.RDN;
 import org.opends.server.types.ResultCode;
 
@@ -111,11 +111,11 @@
    * schema check flag
    */
   private boolean schemaCheck;
-  
+
 
   // WORKAROUND FOR BUG #639 - BEGIN -
   /**
-   * 
+   *
    */
   MultimasterSynchronization mms;
 
@@ -125,7 +125,7 @@
   /**
    * Set up the environment for performing the tests in this Class.
    * synchronization
-   * 
+   *
    * @throws Exception
    *         If the environment could not be set up.
    */
@@ -135,14 +135,14 @@
   {
     // This test suite depends on having the schema available.
     TestCaseUtils.startServer();
-    
+
     // Disable schema check
     schemaCheck = DirectoryServer.checkSchema();
     DirectoryServer.setCheckSchema(false);
-    
+
     // Create an internal connection
     connection = new InternalClientConnection();
-    
+
     // Create backend top level entries
     String[] topEntries = new String[2];
     topEntries[0] = "dn: dc=example,dc=com\n" + "objectClass: top\n"
@@ -177,7 +177,7 @@
         + "ds-cfg-synchronization-provider-enabled: true\n"
         + "ds-cfg-synchronization-provider-class: org.opends.server.synchronization.MultimasterSynchronization\n";
     synchroPluginEntry = TestCaseUtils.entryFromLdifString(synchroPluginLdif);
-    
+
     // Change log
     changeLogStringDN = "cn=Changelog Server, " + synchroPluginStringDN;
     String changeLogLdif = "dn: " + changeLogStringDN + "\n"
@@ -219,7 +219,7 @@
 
   /**
    * Clean up the environment. return null;
-   * 
+   *
    * @throws Exception
    *         If the environment could not be set up.
    */
@@ -229,7 +229,7 @@
 
     DirectoryServer.setCheckSchema(schemaCheck);
     DeleteOperation op;
-    
+
     //  WORKAROUND FOR BUG #639 - BEGIN -
     DirectoryServer.deregisterSynchronizationProvider(mms);
     mms.finalizeSynchronizationProvider();
@@ -258,14 +258,14 @@
   @Test()
   public void updateOperations() throws Exception
   {
-    // 
+    //
     // Add the Multimaster synchronization plugin
     DirectoryServer.getConfigHandler().addEntry(synchroPluginEntry, null);
     entryList.add(synchroPluginEntry);
     assertNotNull(DirectoryServer.getConfigEntry(DN
         .decode(synchroPluginStringDN)),
         "Unable to add the Multimaster synchronization plugin");
-    
+
     // WORKAROUND FOR BUG #639 - BEGIN -
     DN dn = DN.decode(synchroPluginStringDN);
     ConfigEntry mmsConfigEntry = DirectoryServer.getConfigEntry(dn);
@@ -302,7 +302,7 @@
     ServerState ss = MultimasterSynchronization
         .getServerState(synchroServerDN);
     // TODO Check server state field
-    
+
     //
     // Be Client of the Change log
     // We will check that the Chanlog server send us messages
@@ -322,7 +322,7 @@
     SynchronizationDomain syncDomain2 = new SynchronizationDomain(
         newConfigEntry);
 
-    // 
+    //
     // Create an Entry (add operation)
     AddOperation addOp = new AddOperation(connection,
         InternalClientConnection.nextOperationID(), InternalClientConnection
@@ -333,7 +333,7 @@
     entryList.add(personEntry);
     assertNotNull(DirectoryServer.getEntry(personEntry.getDN()),
         "The Add Entry operation fails");
-    
+
     // Check if the client has receive the msg
     UpdateMessage msg = syncDomain2.receive() ;
     Operation receivedOp = msg.createOperation(connection);
@@ -360,7 +360,7 @@
     modOp.setInternalOperation(true);
     modOp.run();
     // TODO Check the telephoneNumber attribute
-    
+
     //  See if the client has receive the msg
     msg = syncDomain2.receive() ;
     receivedOp = msg.createOperation(connection);
@@ -383,7 +383,7 @@
     assertNull(DirectoryServer.getEntry(personEntry.getDN()),
         "The MOD_DN operation didn't delete the old person entry");
     entryList.add(DirectoryServer.getEntry(newDN));
-    
+
     //  See if the client has receive the msg
     msg = syncDomain2.receive() ;
     receivedOp = msg.createOperation(connection);
@@ -391,7 +391,7 @@
         "The received synchronization message is not a MODIFY_DN msg");
     assertTrue(DN.decode(msg.getDn()).compareTo(personEntry.getDN()) == 0,
         "The received MODIFY_DN synchronization message is not for the excepted DN");
-    
+
 
     // Delete the entry
     Entry newPersonEntry = DirectoryServer.getEntry(newDN) ;
@@ -403,7 +403,7 @@
     assertNull(DirectoryServer.getEntry(newDN),
         "Unable to delete the new person Entry");
     entryList.remove(newPersonEntry);
-    
+
     //  See if the client has receive the msg
     msg = syncDomain2.receive() ;
     receivedOp = msg.createOperation(connection);
@@ -412,15 +412,15 @@
     assertTrue(DN.decode(msg.getDn()).compareTo(DN
         .decode("uid= new person,ou=People,dc=example,dc=com")) == 0,
         "The received DELETE synchronization message is not for the excepted DN");
-    
+
     // Purge the client
     syncDomain2.shutdown() ;
-    
+
     //
     // Be new Client of the Change log
     // We will check that when we send message to the Chanlog server
     // the synchronization domain apply those changes.
-    
+
     // Create a new synchronization domain
     String synchroServerLdif3 = "dn: cn=example3, " + synchroPluginStringDN + "\n"
         + "objectClass: top\n"
@@ -436,8 +436,8 @@
         .getConfigEntry(DN.decode(synchroPluginStringDN)));
     SynchronizationDomain syncDomain3 = new SynchronizationDomain(
         newConfigEntry);
-    
-    // 
+
+    //
     // Message to Create the Entry
     addOp = new AddOperation(connection,
         InternalClientConnection.nextOperationID(), InternalClientConnection
@@ -447,7 +447,7 @@
     syncDomain3.doPreOperation(addOp);
     addOp.setResultCode(ResultCode.SUCCESS) ;
     syncDomain3.synchronize(addOp);
-    
+
     // Wait no more than 1 second (synchro operation has to be sent,
     // received and replay)
     Entry newEntry = null ;
@@ -462,9 +462,9 @@
     assertNotNull(newEntry,
         "The send ADD synchronization message was not applied");
     entryList.add(newEntry);
-    
+
     // Message to Modify the new created entry
-    
+
     // Unable to test it: the doPreOperation operation use
     // modifyOperation.getModifiedEntry() which cannot be set the
     // the public level.
@@ -479,10 +479,10 @@
     syncDomain3.synchronize(modOp);
     //  TODO Check the telephoneNumber attribute
      */
-    
+
     //  Purge the message sender
     syncDomain3.shutdown() ;
-    
+
 
     // Check synchronization monitoring
     SynchronizationDomain syncDomain = new SynchronizationDomain(
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/LdifFileWriter.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/LdifFileWriter.java
index 9dac152..3ee67c0 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/LdifFileWriter.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/LdifFileWriter.java
@@ -31,11 +31,11 @@
 import org.opends.server.tools.makeldif.MakeLDIFException;
 import org.opends.server.tools.makeldif.TemplateFile;
 import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.ExistingFileBehavior;
 import org.opends.server.util.LDIFWriter;
 import org.opends.server.util.LDIFException;
-import org.opends.server.core.InitializationException;
 
 import java.io.IOException;
 import java.util.Random;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DirectoryExceptionTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/DirectoryExceptionTestCase.java
similarity index 98%
rename from opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DirectoryExceptionTestCase.java
rename to opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/DirectoryExceptionTestCase.java
index 6686a62..30ba356 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DirectoryExceptionTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/DirectoryExceptionTestCase.java
@@ -24,7 +24,7 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
@@ -35,8 +35,6 @@
 import org.testng.annotations.Test;
 
 import org.opends.server.TestCaseUtils;
-import org.opends.server.types.DN;
-import org.opends.server.types.ResultCode;
 
 import static org.testng.Assert.*;
 
@@ -46,7 +44,7 @@
  * A set of generic test cases for the directory exception class.
  */
 public class DirectoryExceptionTestCase
-       extends CoreTestCase
+       extends TypesTestCase
 {
   /**
    * Retrieves the set of result codes that may be used by the server.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/InitializationExceptionTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/InitializationExceptionTestCase.java
similarity index 98%
rename from opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/InitializationExceptionTestCase.java
rename to opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/InitializationExceptionTestCase.java
index 8dc4b1e..af9950d 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/InitializationExceptionTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/InitializationExceptionTestCase.java
@@ -24,7 +24,7 @@
  *
  *      Portions Copyright 2006 Sun Microsystems, Inc.
  */
-package org.opends.server.core;
+package org.opends.server.types;
 
 
 
@@ -40,7 +40,7 @@
  * A set of generic test cases for the initialization exception class.
  */
 public class InitializationExceptionTestCase
-       extends CoreTestCase
+       extends TypesTestCase
 {
   /**
    * Tests the first constructor, which takes int and String arguments.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
index 93359fc..6490cd2 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
@@ -29,7 +29,6 @@
 import static org.testng.Assert.*;
 
 import org.opends.server.TestCaseUtils;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestEntry.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestEntry.java
index 87920f3..cca595a 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestEntry.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestEntry.java
@@ -35,7 +35,6 @@
 
 import org.opends.server.TestCaseUtils;
 import org.opends.server.api.SubtreeSpecificationSet;
-import org.opends.server.core.DirectoryException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.RFC3672SubtreeSpecification;
 import org.opends.server.protocols.asn1.ASN1OctetString;

--
Gitblit v1.10.0