From a63b9397ad57e521df4bc418005fe0cc0122b9dc Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 07 Feb 2014 10:10:50 +0000
Subject: [PATCH] OPENDJ-1307 Migrate server ASN1 classes to SDK 

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/GetEffectiveRightsRequestControl.java                                      |   29 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskTool.java                                                           |   11 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PersistentSearchControl.java                                               |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawModification.java                                                          |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangelogNotificationControl.java                                     |    9 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPAuthenticationHandler.java                                                |  170 +-
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPPasswordModify.java                                                       |   86 -
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileStack.java                                                  |   12 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchResultEntryProtocolOp.java         |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java                             |   11 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JECompressedSchema.java                                                |   52 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java                                                       |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyRequestControl.java                                          |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ID2Entry.java                                                          |   42 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java                                |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPOutputStream.java                                    |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteRequestProtocolOp.java             |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfilerThread.java                                                |   12 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPMessage.java                                                     |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordControlTest.java                           |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVResponseControl.java                                                    |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindResponseProtocolOp.java              |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPModify.java                                                               |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPToolUtils.java                                                            |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultEntryProtocolOp.java                                     |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CertificateSyntax.java                                                       |   48 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReaderTestCase.java           |  304 +++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPCompare.java                                                              |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteResponseProtocolOp.java            |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadResponseControl.java                                           |    7 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java                           |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadRequestControl.java                                            |    5 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/MatchedValuesControlTest.java                      |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteRequestProtocolOp.java                                         |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyDNMsg.java                                               |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddResponseProtocolOp.java               |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNRequestProtocolOp.java           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableRequestControl.java                                           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangeNotificationControl.java                                        |   12 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareResponseProtocolOp.java           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyRequestProtocolOp.java                                         |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java                                       |    8 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestLDAPFilter.java                          |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchRequestProtocolOp.java                                         |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/ChangeNumberControlPlugin.java                                              |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AbandonRequestProtocolOp.java                                        |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultDoneProtocolOp.java                                      |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPReader.java                                                               |   10 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PagedResultsControl.java                                                   |    6 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java                                                     |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableResponseControl.java                                          |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java                   |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPInputStream.java                                     |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java             |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubtreeDeleteControl.java                                                  |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/IntermediateResponseProtocolOp.java                                  |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java                                           |   22 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesControl.java                                                  |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReader.java                                           |  575 +++++++++++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteResponseProtocolOp.java                                        |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV2Control.java                                                  |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNResponseProtocolOp.java                                      |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/GetConnectionIDExtendedOperation.java                                    |   12 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV1Control.java                                                  |    9 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/VLVControlTestCase.java                            |   27 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/ReplicationRepairRequestControl.java                             |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/LDAPUpdateMsg.java                                             |   25 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPControl.java                                                     |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiredControl.java                                                |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java                                              |    8 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ExternalChangelogControlTest.java                  |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestUnbindRequestProtocolOp.java             |    6 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLDeleteOperation.java                                                       |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultReferenceProtocolOp.java                                 |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java                                     |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedResponseProtocolOp.java                                      |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyResponseProtocolOp.java            |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java                                            |   50 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ProtocolOp.java                                                      |    3 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV1ControlTestCase.java                  |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/MonitorMsg.java                                                |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiringControl.java                                               |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyResponseProtocolOp.java                                        |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyRequestProtocolOp.java             |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedRequestProtocolOp.java                                       |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortRequestControl.java                                          |    8 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadRequestControl.java                                             |    5 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPAssertionRequestControl.java                                           |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindRequestProtocolOp.java               |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java                    |   15 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileViewer.java                                                 |   13 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareRequestProtocolOp.java                                        |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/common/ServerState.java                                                 |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddResponseProtocolOp.java                                           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ExternalChangelogRequestControl.java                                       |    9 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareResponseProtocolOp.java                                       |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddRequestProtocolOp.java                                            |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNRequestProtocolOp.java                                       |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyFactory.java                          |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPReader.java                                                      |   28 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageTasks.java                                                              |   10 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/UnbindRequestProtocolOp.java                                         |    2 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyDNOperation.java                                                     |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/core/DefaultCompressedSchema.java                                                   |   20 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java                                          |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindRequestProtocolOp.java                                           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesFilter.java                                                   |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawFilter.java                                                                |    2 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java                                                               |    9 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/CancelExtendedOperation.java                                             |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPWriter.java                                                               |   39 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLCompareOperation.java                                                      |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAbandonRequestProtocolOp.java            |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubentriesControl.java                                                     |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareRequestProtocolOp.java            |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVRequestControl.java                                                     |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/Control.java                                                                  |    3 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPSearch.java                                                               |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPDelete.java                                                               |    4 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyOperation.java                                                       |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageAccount.java                                                            |    2 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java     |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/AddMsg.java                                                    |   17 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/StartSessionMsg.java                                           |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java                         |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyMsg.java                                                 |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskClient.java                                                         |   18 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV2ControlTestCase.java                  |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java                               |   10 
 opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLAddOperation.java                                                          |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ReaderTestCase.java                      |  853 ++++++++++++++++
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddRequestProtocolOp.java                |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadResponseControl.java                                            |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java                                         |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/StopDS.java                                                                   |   16 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/SambaPasswordPluginTestCase.java                    |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/crypto/GetSymmetricKeyExtendedOperation.java                                        |   17 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortResponseControl.java                                         |    6 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNResponseProtocolOp.java          |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawAttribute.java                                                             |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AuthorizationIdentityResponseControl.java                                  |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindResponseProtocolOp.java                                          |    2 
 143 files changed, 2,305 insertions(+), 724 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLAddOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLAddOperation.java
index 36f26f6..4f22a1e 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLAddOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLAddOperation.java
@@ -33,7 +33,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.AddRequestProtocolOp;
 import org.opends.server.protocols.ldap.AddResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPAttribute;
@@ -79,13 +79,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public LDAPResult doOperation(ObjectFactory objFactory,
         AddRequest addRequest,
         List<org.opends.server.types.Control> controls)
-    throws IOException, LDAPException, ASN1Exception
+    throws IOException, LDAPException, DecodeException
   {
     LDAPResult addResponse = objFactory.createLDAPResult();
     addResponse.setRequestID(addRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLCompareOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLCompareOperation.java
index 69f579a..20de860 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLCompareOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLCompareOperation.java
@@ -32,7 +32,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.CompareRequestProtocolOp;
 import org.opends.server.protocols.ldap.CompareResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -76,13 +76,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public LDAPResult doOperation(ObjectFactory objFactory,
         CompareRequest compareRequest,
         List<org.opends.server.types.Control> controls)
-    throws IOException, LDAPException, ASN1Exception
+    throws IOException, LDAPException, DecodeException
   {
     LDAPResult compareResponse = objFactory.createLDAPResult();
     compareResponse.setRequestID(compareRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLDeleteOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLDeleteOperation.java
index 5c5cbe1..6cf21a5 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLDeleteOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLDeleteOperation.java
@@ -32,7 +32,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
 import org.opends.server.protocols.ldap.DeleteResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -81,13 +81,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public LDAPResult doOperation(ObjectFactory objFactory,
         DelRequest deleteRequest,
         List<org.opends.server.types.Control> controls)
-    throws IOException, LDAPException, ASN1Exception
+    throws IOException, LDAPException, DecodeException
   {
     LDAPResult delResponse = objFactory.createLDAPResult();
     delResponse.setRequestID(deleteRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
index aa7bab5..089f1cf 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
@@ -33,7 +33,7 @@
 import java.util.Set;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.ExtendedRequestProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -98,13 +98,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public ExtendedResponse doOperation(ObjectFactory objFactory,
               ExtendedRequest extendedRequest,
               List<org.opends.server.types.Control> controls)
-    throws IOException, LDAPException, ASN1Exception
+    throws IOException, LDAPException, DecodeException
   {
     ExtendedResponse extendedResponse = objFactory.createExtendedResponse();
     extendedResponse.setRequestID(extendedRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyDNOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyDNOperation.java
index 8f2d859..d5d3972 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyDNOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyDNOperation.java
@@ -33,7 +33,7 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.tools.LDAPConnection;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.protocols.ldap.ModifyDNRequestProtocolOp;
 import org.opends.server.protocols.ldap.ModifyDNResponseProtocolOp;
@@ -77,13 +77,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public LDAPResult doOperation(ObjectFactory objFactory,
         ModifyDNRequest modifyDNRequest,
         List<org.opends.server.types.Control> controls)
-    throws IOException, LDAPException, ASN1Exception
+    throws IOException, LDAPException, DecodeException
   {
     LDAPResult modDNResponse = objFactory.createLDAPResult();
     modDNResponse.setRequestID(modifyDNRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyOperation.java
index 99b1179..70606e0 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLModifyOperation.java
@@ -33,7 +33,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.protocols.ldap.LDAPModification;
@@ -81,13 +81,13 @@
    * @throws  LDAPException  If an error occurs while interacting with an LDAP
    *                         element.
    *
-   * @throws  ASN1Exception  If an error occurs while interacting with an ASN.1
+   * @throws  DecodeException  If an error occurs while interacting with an ASN.1
    *                         element.
    */
   public LDAPResult doOperation(ObjectFactory objFactory,
         ModifyRequest modifyRequest,
         List<org.opends.server.types.Control> controls)
-        throws IOException, LDAPException, ASN1Exception
+        throws IOException, LDAPException, DecodeException
   {
     LDAPResult modResponse = objFactory.createLDAPResult();
     modResponse.setRequestID(modifyRequest.getRequestID());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
index 760a1cd..cf91b70 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
@@ -37,7 +37,7 @@
 import javax.xml.bind.JAXBElement;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.protocols.ldap.LDAPConstants;
 import org.opends.server.protocols.ldap.LDAPFilter;
@@ -623,7 +623,7 @@
       while (opType != LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE);
 
     }
-    catch (ASN1Exception ae)
+    catch (DecodeException ae)
     {
       ae.printStackTrace();
       throw new IOException(ae.getMessage());
diff --git a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
index 57f1537..869be4d 100644
--- a/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
+++ b/opendj-sdk/opendj3-server-dev/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
@@ -69,7 +69,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.controls.ProxiedAuthV2Control;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.LDAPConstants;
 import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -300,11 +300,10 @@
       LocalizableMessage m = INFO_RESULT_CLIENT_SIDE_ENCODING_ERROR.get();
       throw new LDAPConnectionException(m, CLIENT_SIDE_CONNECT_ERROR, null, le);
     }
-    catch (ASN1Exception ae)
+    catch (DecodeException ae)
     {
       LocalizableMessage m = INFO_RESULT_CLIENT_SIDE_ENCODING_ERROR.get();
-      throw new LDAPConnectionException(m, CLIENT_SIDE_CONNECT_ERROR, null,
-          ae);
+      throw new LDAPConnectionException(m, CLIENT_SIDE_CONNECT_ERROR, null, ae);
     }
     catch (IOException ie)
     {
@@ -621,7 +620,7 @@
    * @return a JAXBElement that contains an ErrorResponse
    */
   private JAXBElement<ErrorResponse> createErrorResponse(Throwable t) {
-    // potential exceptions are IOException, LDAPException, ASN1Exception
+    // potential exceptions are IOException, LDAPException, DecodeException
 
     ErrorResponse errorResponse = objFactory.createErrorResponse();
     errorResponse.setMessage(String.valueOf(t));
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ID2Entry.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ID2Entry.java
index 683339b..bad9434 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ID2Entry.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ID2Entry.java
@@ -26,25 +26,20 @@
  */
 package org.opends.server.backends.jeb;
 
-import org.forgerock.i18n.LocalizableMessage;
-
-import static org.opends.server.core.DirectoryServer.getMaxInternalBufferSize;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-
-import static org.opends.messages.JebMessages.*;
-
-import static org.forgerock.util.Utils.closeSilently;
-import com.sleepycat.je.*;
-
-import org.opends.server.types.*;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.api.CompressedSchema;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.Entry;
+import org.opends.server.types.LDAPException;
+
+import com.sleepycat.je.*;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -52,6 +47,10 @@
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterOutputStream;
 
+import static org.forgerock.util.Utils.*;
+import static org.opends.messages.JebMessages.*;
+import static org.opends.server.core.DirectoryServer.*;
+
 /**
  * Represents the database containing the LDAP entries. The database key is
  * the entry ID and the value is the entry contents.
@@ -114,22 +113,21 @@
 
     private void release()
     {
-      closeSilently(writer); // Clears encodedBuffer as well.
+      closeSilently(writer);
+      encodedBuffer.clearAndTruncate(maxBufferSize, BUFFER_INIT_SIZE);
       entryBuffer.clearAndTruncate(maxBufferSize, BUFFER_INIT_SIZE);
       compressedEntryBuffer.clearAndTruncate(maxBufferSize, BUFFER_INIT_SIZE);
     }
 
     private Entry decode(ByteString bytes, CompressedSchema compressedSchema)
-        throws DirectoryException, ASN1Exception, LDAPException,
+        throws DirectoryException, DecodeException, LDAPException,
         DataFormatException, IOException
     {
       // Get the format version.
       byte formatVersion = bytes.byteAt(0);
       if(formatVersion != JebFormat.FORMAT_VERSION)
       {
-        LocalizableMessage message =
-            ERR_JEB_INCOMPATIBLE_ENTRY_VERSION.get(formatVersion);
-        throw new ASN1Exception(message);
+        throw DecodeException.error(ERR_JEB_INCOMPATIBLE_ENTRY_VERSION.get(formatVersion));
       }
 
       // Read the ASN1 sequence.
@@ -296,7 +294,7 @@
    * @param bytes A byte array containing the encoded database value.
    * @param compressedSchema The compressed schema manager to use when decoding.
    * @return The decoded entry.
-   * @throws ASN1Exception If the data is not in the expected ASN.1 encoding
+   * @throws DecodeException If the data is not in the expected ASN.1 encoding
    * format.
    * @throws LDAPException If the data is not in the expected ASN.1 encoding
    * format.
@@ -307,7 +305,7 @@
    */
   public static Entry entryFromDatabase(ByteString bytes,
       CompressedSchema compressedSchema) throws DirectoryException,
-      ASN1Exception, LDAPException, DataFormatException, IOException
+      DecodeException, LDAPException, DataFormatException, IOException
   {
     EntryCodec codec = acquireEntryCodec();
     try
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JECompressedSchema.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
index 2e575ac..d6ce8e8 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JECompressedSchema.java
@@ -38,13 +38,13 @@
 import org.opends.server.api.CompressedSchema;
 import org.opends.server.core.DirectoryServer;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
+import org.opends.server.util.StaticUtils;
 
 import com.sleepycat.je.Cursor;
 import com.sleepycat.je.Database;
@@ -77,13 +77,13 @@
   private static final String DB_NAME_OC = "compressed_object_classes";
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
-  // The compressed attribute description schema database.
+  /** The compressed attribute description schema database. */
   private Database adDatabase;
 
-  // The environment in which the databases are held.
+  /** The environment in which the databases are held. */
   private Environment environment;
 
-  // The compresesd object class set schema database.
+  /** The compressed object class set schema database. */
   private Database ocDatabase;
 
   private final ByteStringBuilder storeAttributeWriterBuffer =
@@ -134,14 +134,7 @@
       // Ignore.
     }
 
-    try
-    {
-      adDatabase.close();
-    }
-    catch (final Exception e)
-    {
-      // Ignore.
-    }
+    StaticUtils.close(adDatabase);
 
     try
     {
@@ -152,14 +145,7 @@
       // Ignore.
     }
 
-    try
-    {
-      ocDatabase.close();
-    }
-    catch (final Exception e)
-    {
-      // Ignore.
-    }
+    StaticUtils.close(ocDatabase);
 
     adDatabase = null;
     ocDatabase = null;
@@ -282,13 +268,11 @@
             LockMode.READ_UNCOMMITTED);
       }
     }
-    catch (final ASN1Exception ae)
+    catch (final IOException e)
     {
-      logger.traceException(ae);
-
-      final LocalizableMessage m = ERR_JEB_COMPSCHEMA_CANNOT_DECODE_OC_TOKEN.get(ae
-          .getMessage());
-      throw new InitializationException(m, ae);
+      logger.traceException(e);
+      throw new InitializationException(
+          ERR_JEB_COMPSCHEMA_CANNOT_DECODE_OC_TOKEN.get(e.getMessage()), e);
     }
     finally
     {
@@ -321,13 +305,11 @@
             LockMode.READ_UNCOMMITTED);
       }
     }
-    catch (final ASN1Exception ae)
+    catch (final IOException e)
     {
-      logger.traceException(ae);
-
-      final LocalizableMessage m = ERR_JEB_COMPSCHEMA_CANNOT_DECODE_AD_TOKEN.get(ae
-          .getMessage());
-      throw new InitializationException(m, ae);
+      logger.traceException(e);
+      throw new InitializationException(
+          ERR_JEB_COMPSCHEMA_CANNOT_DECODE_AD_TOKEN.get(e.getMessage()), e);
     }
     finally
     {
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableRequestControl.java
index 9f8c148..e183428 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableRequestControl.java
@@ -29,7 +29,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableResponseControl.java
index 757392e..bb58d3e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AccountUsableResponseControl.java
@@ -30,9 +30,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -391,7 +389,7 @@
    * @throws IOException If a problem occurs while writing to the stream.
    */
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     if(isUsable)
     {
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AuthorizationIdentityResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AuthorizationIdentityResponseControl.java
index a52c7b4..fd71bfa 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AuthorizationIdentityResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/AuthorizationIdentityResponseControl.java
@@ -29,7 +29,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ProtocolMessages.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangeNotificationControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangeNotificationControl.java
index 895ca28..43ee4ed 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangeNotificationControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangeNotificationControl.java
@@ -30,11 +30,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_INTEGER_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -83,7 +79,7 @@
         changeType = PersistentSearchChangeType.valueOf(changeTypeValue);
 
         if(reader.hasNextElement() &&
-            reader.peekType() == UNIVERSAL_OCTET_STRING_TYPE)
+            reader.peekType() == ASN1.UNIVERSAL_OCTET_STRING_TYPE)
         {
           if (changeType != PersistentSearchChangeType.MODIFY_DN)
           {
@@ -94,7 +90,7 @@
           previousDN = DN.valueOf(reader.readOctetStringAsString());
         }
         if(reader.hasNextElement() &&
-            reader.peekType() == UNIVERSAL_INTEGER_TYPE)
+            reader.peekType() == ASN1.UNIVERSAL_INTEGER_TYPE)
         {
           changeNumber = reader.readInteger();
         }
@@ -240,7 +236,7 @@
    * @throws IOException If a problem occurs while writing to the stream.
    */
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeEnumerated(changeType.intValue());
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangelogNotificationControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangelogNotificationControl.java
index a7c73fb..57b1417 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangelogNotificationControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/EntryChangelogNotificationControl.java
@@ -27,7 +27,6 @@
 package org.opends.server.controls;
 import static org.opends.messages.ProtocolMessages.ERR_ECLN_CANNOT_DECODE_VALUE;
 import static org.opends.messages.ProtocolMessages.ERR_ECLN_NO_CONTROL_VALUE;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.getExceptionMessage;
 
@@ -35,9 +34,9 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
@@ -133,7 +132,7 @@
    * @throws IOException If a problem occurs while writing to the stream.
    */
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeStartSequence();
     writer.writeOctetString(cookie.toString());
     writer.writeEndSequence();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ExternalChangelogRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ExternalChangelogRequestControl.java
index bb5ebbf..3b7036d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ExternalChangelogRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ExternalChangelogRequestControl.java
@@ -26,16 +26,15 @@
  */
 package org.opends.server.controls;
 import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.getExceptionMessage;
 
 import java.io.IOException;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.replication.common.MultiDomainServerState;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
@@ -155,7 +154,7 @@
   protected void writeValue(ASN1Writer writer)
       throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeOctetString(this.cookie.toString());
     writer.writeEndSequence();
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/GetEffectiveRightsRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/GetEffectiveRightsRequestControl.java
index b3fd2f5..eca79d9 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/GetEffectiveRightsRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/GetEffectiveRightsRequestControl.java
@@ -26,21 +26,22 @@
  */
 
 package org.opends.server.controls;
+
 import org.forgerock.i18n.LocalizableMessage;
-
-import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ByteString;
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
-import static org.opends.server.util.ServerConstants.OID_GET_EFFECTIVE_RIGHTS;
-import org.opends.server.core.DirectoryServer;
-import static org.opends.messages.ProtocolMessages.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.ldap.ByteString;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.*;
 
-import java.util.List;
-import java.util.LinkedList;
+import static org.opends.messages.ProtocolMessages.*;
+import static org.opends.server.util.ServerConstants.*;
+
 import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * This class partially implements the geteffectiverights control as defined
@@ -73,7 +74,7 @@
 public class GetEffectiveRightsRequestControl extends Control
 {
   /**
-   * ControlDecoder implentation to decode this control from a ByteString.
+   * ControlDecoder implementation to decode this control from a ByteString.
    */
   private static final class Decoder
       implements ControlDecoder<GetEffectiveRightsRequestControl>
@@ -126,7 +127,7 @@
             reader.readEndSequence();
           }
           reader.readEndSequence();
-        } catch (ASN1Exception e) {
+        } catch (IOException e) {
           logger.traceException(e);
 
           LocalizableMessage message =
@@ -223,7 +224,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     if(authzDN != null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPAssertionRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPAssertionRequestControl.java
index beedc79..7bda100 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPAssertionRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPAssertionRequestControl.java
@@ -28,9 +28,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
@@ -137,7 +135,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     rawFilter.write(writer);
     writer.writeEndSequence();
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadRequestControl.java
index 0633e52..0d48727 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadRequestControl.java
@@ -35,10 +35,9 @@
 import java.util.Set;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 
 import static org.opends.server.plugins.LDAPADListPlugin.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
@@ -193,7 +192,7 @@
   @Override
   public void writeValue(ASN1Writer writer) throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     {
       writer.writeStartSequence();
       if (rawAttributes != null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadResponseControl.java
index 9837318..149197b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPostReadResponseControl.java
@@ -28,10 +28,9 @@
 import org.forgerock.i18n.LocalizableMessage;
 
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.*;
+import org.opends.server.protocols.ldap.LDAPReader;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -153,7 +152,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     SearchResultEntryProtocolOp protocolOp =
         new SearchResultEntryProtocolOp(searchEntry);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadRequestControl.java
index bef96d0..d2aa818 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadRequestControl.java
@@ -35,10 +35,9 @@
 import java.util.Set;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 
 import static org.opends.server.plugins.LDAPADListPlugin.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -163,7 +162,7 @@
   @Override
   public void writeValue(ASN1Writer writer) throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     {
       writer.writeStartSequence();
       if (rawAttributes != null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadResponseControl.java
index 27b873e..6ca6c2f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/LDAPPreReadResponseControl.java
@@ -28,9 +28,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.SearchResultEntryProtocolOp;
 import org.opends.server.protocols.ldap.LDAPReader;
 import org.opends.server.types.*;
@@ -156,7 +154,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     SearchResultEntryProtocolOp protocolOp =
         new SearchResultEntryProtocolOp(searchEntry);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesControl.java
index db2f689..887b68b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesControl.java
@@ -32,9 +32,7 @@
 import java.util.ArrayList;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -157,7 +155,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     for (MatchedValuesFilter f : filters)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesFilter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesFilter.java
index 29aea93..6b10e9c 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesFilter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/MatchedValuesFilter.java
@@ -40,7 +40,7 @@
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.forgerock.util.Reject;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PagedResultsControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PagedResultsControl.java
index eb5535c..6aaf6db 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PagedResultsControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PagedResultsControl.java
@@ -31,9 +31,7 @@
 import static org.opends.messages.ProtocolMessages.*;
 import static org.opends.server.util.ServerConstants.OID_PAGED_RESULTS_CONTROL;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import java.io.IOException;
@@ -187,7 +185,7 @@
    */
   @Override
   public void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeInteger(size);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiredControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiredControl.java
index 2f09715..9d877dd 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiredControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiredControl.java
@@ -29,7 +29,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiringControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiringControl.java
index f4bb32c..c8c31f3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiringControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordExpiringControl.java
@@ -29,7 +29,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyRequestControl.java
index e06f19c..c965b11 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyRequestControl.java
@@ -29,7 +29,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
index 52fdb6e..aebb5cd 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
@@ -31,9 +31,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
@@ -247,7 +245,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     if (warningType != null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PersistentSearchControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PersistentSearchControl.java
index b79a0aa..cd2a8c5 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PersistentSearchControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/PersistentSearchControl.java
@@ -31,9 +31,7 @@
 import java.util.Set;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
@@ -190,7 +188,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeInteger(
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV1Control.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
index d733006..2200683 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
@@ -34,13 +34,12 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.PasswordPolicyState;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -208,7 +207,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeOctetString(rawAuthorizationDN);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV2Control.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
index 39e42b2..3875b23 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
@@ -35,9 +35,9 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.PasswordPolicyState;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ProtocolMessages.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
index 87f5bac..161726a 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
@@ -35,9 +35,7 @@
 
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
@@ -496,7 +494,7 @@
 
   private void writeValueFromString(ASN1Writer writer) throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     for(String[] strs : decodedKeyList)
@@ -523,7 +521,7 @@
 
   private void writeValueFromSortOrder(ASN1Writer writer) throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     for (SortKey sortKey : sortOrder.getSortKeys())
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortResponseControl.java
index acfbe6d..30ef818 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/ServerSideSortResponseControl.java
@@ -30,9 +30,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
 import org.forgerock.opendj.ldap.ByteString;
@@ -219,7 +217,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeEnumerated(resultCode);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubentriesControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubentriesControl.java
index 5f5dfbe..1c8e07e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubentriesControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubentriesControl.java
@@ -29,13 +29,11 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -125,7 +123,7 @@
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException
   {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeBoolean(visibility);
     writer.writeEndSequence();
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubtreeDeleteControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubtreeDeleteControl.java
index fca09de..2949d4d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubtreeDeleteControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/SubtreeDeleteControl.java
@@ -34,7 +34,7 @@
 import java.io.IOException;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVRequestControl.java
index ba40298..5722698 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVRequestControl.java
@@ -30,9 +30,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
 import org.forgerock.opendj.ldap.ByteString;
@@ -412,7 +410,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeInteger(beforeCount);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVResponseControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVResponseControl.java
index 98e0838..fa94025 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVResponseControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/controls/VLVResponseControl.java
@@ -30,9 +30,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.
-    UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ProtocolMessages.*;
@@ -243,7 +241,7 @@
    */
   @Override
   protected void writeValue(ASN1Writer writer) throws IOException {
-    writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     writer.writeInteger(targetPosition);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/core/DefaultCompressedSchema.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/core/DefaultCompressedSchema.java
index 4180405..03ffd8c 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/core/DefaultCompressedSchema.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/core/DefaultCompressedSchema.java
@@ -30,7 +30,7 @@
 
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
+import static org.opends.server.util.StaticUtils.*;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -43,9 +43,9 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.api.CompressedSchema;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.DirectoryException;
 
@@ -297,17 +297,7 @@
       }
       finally
       {
-        try
-        {
-          if (outputStream != null)
-          {
-            outputStream.close();
-          }
-        }
-        catch (final Exception e)
-        {
-          logger.traceException(e);
-        }
+        close(outputStream);
       }
     }
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/crypto/GetSymmetricKeyExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/crypto/GetSymmetricKeyExtendedOperation.java
index 53de4ad..cac2722 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/crypto/GetSymmetricKeyExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/crypto/GetSymmetricKeyExtendedOperation.java
@@ -36,10 +36,10 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ExtendedOperation;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -129,13 +129,10 @@
       }
       reader.readEndSequence();
     }
-    catch (ASN1Exception ae)
+    catch (DecodeException e)
     {
-      logger.traceException(ae);
-
-      LocalizableMessage message = ERR_GET_SYMMETRIC_KEY_ASN1_DECODE_EXCEPTION.get(
-           ae.getMessage());
-      operation.appendErrorMessage(message);
+      logger.traceException(e);
+      operation.appendErrorMessage(ERR_GET_SYMMETRIC_KEY_ASN1_DECODE_EXCEPTION.get(e.getMessage()));
       return;
     }
     catch (Exception e)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/CancelExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/CancelExtendedOperation.java
index 6df0c25..9c7c518 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/CancelExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/CancelExtendedOperation.java
@@ -33,8 +33,8 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.ExtendedOperation;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ExtensionMessages.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/GetConnectionIDExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/GetConnectionIDExtendedOperation.java
index 0a79f1e..048397c 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/GetConnectionIDExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/GetConnectionIDExtendedOperation.java
@@ -32,10 +32,10 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.ExtendedOperation;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -118,11 +118,11 @@
    *
    * @return  The connection ID decoded from the provided response value.
    *
-   * @throws ASN1Exception  If an error occurs while trying to decode the
+   * @throws DecodeException  If an error occurs while trying to decode the
    *                         response value.
    */
   public static long decodeResponseValue(ByteString responseValue)
-         throws ASN1Exception
+         throws DecodeException
   {
     ASN1Reader reader = ASN1.getReader(responseValue);
     try
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyFactory.java
index 34fdb89..392f2a8 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyFactory.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyFactory.java
@@ -47,7 +47,7 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.ldap.*;
 import org.opends.server.schema.GeneralizedTimeSyntax;
@@ -1158,7 +1158,7 @@
         {
           responseMessage = reader.readMessage();
         }
-        catch (final ASN1Exception e)
+        catch (final DecodeException e)
         {
           // ASN1 layer hides all underlying IO exceptions.
           if (e.getCause() instanceof SocketTimeoutException)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
index dcf0e57..d0da92f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
@@ -46,9 +46,9 @@
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.PasswordPolicyState;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.schema.AuthPasswordSyntax;
 import org.opends.server.schema.UserPasswordSyntax;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
index e9e2126..b0d5397 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
@@ -40,9 +40,9 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.schema.GeneralizedTimeSyntax;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/ChangeNumberControlPlugin.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/ChangeNumberControlPlugin.java
index 914e7f9..d8a77c7 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/ChangeNumberControlPlugin.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/ChangeNumberControlPlugin.java
@@ -42,7 +42,7 @@
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.config.ConfigException;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.protocol.OperationContext;
 import org.opends.server.types.ConfigChangeResult;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileStack.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileStack.java
index dab4953..8f0648b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileStack.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileStack.java
@@ -26,14 +26,11 @@
  */
 package org.opends.server.plugins.profiler;
 
-
-
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
-
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 
 /**
  * This class defines a data structure that may be used to hold information
@@ -324,10 +321,9 @@
    *                 information from.
    *
    * @return  The decoded profile stack.
-   * @throws ASN1Exception If the element could not be decoded for some reason.
-   *
+   * @throws IOException If the element could not be decoded for some reason.
    */
-  public static ProfileStack decode(ASN1Reader reader) throws ASN1Exception
+  public static ProfileStack decode(ASN1Reader reader) throws IOException
   {
     reader.readStartSequence();
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileViewer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileViewer.java
index c69bfd9..6ca78ee 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileViewer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfileViewer.java
@@ -25,9 +25,6 @@
  *      Portions Copyright 2012-2014 ForgeRock AS
  */
 package org.opends.server.plugins.profiler;
-import org.forgerock.i18n.LocalizableMessage;
-
-
 
 import java.awt.BorderLayout;
 import java.awt.Container;
@@ -49,7 +46,9 @@
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import com.forgerock.opendj.cli.ArgumentException;
 import com.forgerock.opendj.cli.ArgumentParser;
 import com.forgerock.opendj.cli.BooleanArgument;
@@ -220,12 +219,8 @@
    *
    * @throws  IOException  If a problem occurs while trying to read from the
    *                       data file.
-   *
-   * @throws  ASN1Exception  If an error occurs while trying to decode the
-   *                         contents of the file into profile stack objects.
    */
-  public void processDataFile(String filename)
-         throws IOException, ASN1Exception
+  public void processDataFile(String filename) throws IOException
   {
     // Try to open the file for reading.
     ASN1Reader reader = ASN1.getReader(new FileInputStream(filename));
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfilerThread.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfilerThread.java
index 3549acb..9902702 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfilerThread.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/plugins/profiler/ProfilerThread.java
@@ -26,19 +26,16 @@
  */
 package org.opends.server.plugins.profiler;
 
-
-
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.opends.server.api.DirectoryThread;
-import org.opends.server.protocols.asn1.*;
-
+import org.forgerock.opendj.io.*;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 
-
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a thread that may be used to actually perform
@@ -218,7 +215,8 @@
   {
     // Open the capture file for writing.  We'll use an ASN.1 writer to write
     // the data.
-    ASN1Writer writer = ASN1.getWriter(new FileOutputStream(filename));
+    FileOutputStream fos = new FileOutputStream(filename);
+    ASN1Writer writer = ASN1.getWriter(fos);
 
 
     try
@@ -254,7 +252,7 @@
     finally
     {
       // Make sure to close the file when we're done.
-      writer.close();
+      close(writer, fos);
     }
   }
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPInputStream.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPInputStream.java
index c0db00b..29f3c3a 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPInputStream.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPInputStream.java
@@ -32,8 +32,8 @@
 import java.io.InputStream;
 import java.util.concurrent.ArrayBlockingQueue;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.forgerock.opendj.ldap.ByteSequenceReader;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPOutputStream.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPOutputStream.java
index 1628b4e..013cdc8 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPOutputStream.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/internal/InternalLDAPOutputStream.java
@@ -35,8 +35,8 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.core.*;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.protocols.ldap.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReader.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReader.java
new file mode 100644
index 0000000..39e2e39
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReader.java
@@ -0,0 +1,575 @@
+/*
+ * 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 legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * 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 legal-notices/CDDLv1_0.txt.
+ * 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
+ *
+ *
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2011-2014 ForgeRock AS.
+ */
+package org.opends.server.protocols.ldap;
+
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.ldap.ByteSequenceReader;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import java.nio.ByteBuffer;
+import java.nio.channels.IllegalBlockingModeException;
+import java.nio.channels.ReadableByteChannel;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * This class is for reading ASN.1 elements from a readable byte
+ * channel. It will handle all partial element reads from the channel
+ * and save any unread ASN.1 elements if required. All data read from
+ * the channel will be ready to be read as ASN.1 elements no matter
+ * how many times the channel is read. However, to minimize the the
+ * amount of memory used by this reader, the client should read ASN.1
+ * elements as soon as they are read off the channel.
+ * <p>
+ * {@code ASN1ByteChannelReader}s are created using the factory
+ * methods in {@link ASN1}.
+ * <p>
+ * The client should use this class in the following manner:
+ *<p>
+ * When NIO signals new data is available in the channel, the client
+ * should call {@link #processChannelData()}.
+ *<p>
+ * If bytes are read from the channel, the client should call
+ * {@link #elementAvailable()} to see if a complete element is ready to
+ * be read. However, if no data is actually read, the client should
+ * wait for the next signal and try again.
+ * <p>
+ * As long as a complete element is ready, the client should read the
+ * appropriate ASN.1 element(s). Once no more complete elements are
+ * available, the client should call {@link #processChannelData()}
+ * again to read more data (if available).
+ * <p>
+ * <b>NOTE:</b> Since this reader is non blocking, reading ASN.1
+ * elements before making sure they are ready could result in
+ * {@link IllegalBlockingModeException}s being thrown while reading
+ * ASN.1 elements. Once an exception is thrown, the state of the reader
+ * is no longer stable and can not be used again.
+ */
+final class ASN1ByteChannelReader implements ASN1Reader
+{
+  // The byte channel to read from.
+  private final ReadableByteChannel byteChannel;
+
+  // The wrapped ASN.1 reader.
+  private final ASN1Reader reader;
+
+  // The NIO ByteStringBuilder that stores any immediate data read off
+  // the channel.
+  private final ByteBuffer byteBuffer;
+
+  // The save buffer used to store any unprocessed data waiting
+  // to be read as ASN.1 elements. (Usually due to reading
+  // incomplete elements from the channel).
+  private final ByteStringBuilder saveBuffer;
+
+  // The save buffer reader.
+  private final ByteSequenceReader saveBufferReader;
+
+  /**
+   * An adaptor class for reading from a save buffer and the NIO byte buffer
+   * sequentially using the InputStream interface.
+   *
+   * Since the NIO byte buffer is re-used when reading off the channel, any
+   * unused data will be appended to the save buffer before reading off the
+   * channel again. This reader will always read the save buffer first before
+   * the actual NIO byte buffer to ensure bytes are read in the same order
+   * as they are received.
+   *
+   * The read methods of this stream will throw an IllegalBlockingModeException
+   * if invoked when there are no data to read from the save buffer or the
+   * channel buffer.
+   *
+   * The stream will not support the mark or reset methods.
+   */
+  private final class CombinedBufferInputStream extends InputStream
+  {
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int available()
+    {
+      // The number of available bytes is the sum of the save buffer
+      // and the last read data in the NIO ByteStringBuilder.
+      return saveBufferReader.remaining() + byteBuffer.remaining();
+    }
+
+    /**
+     * Reads the next byte of data from the save buffer or channel buffer.
+     * The value byte is returned as an int in the range 0 to 255.
+     * If no byte is available in the save buffer or channel buffer,
+     * IllegalBlockingModeException will be thrown.
+     *
+     * @return the next byte of data.
+     * @throws IllegalBlockingModeException if there are more bytes available.
+     */
+    @Override
+    public int read()
+    {
+      if(saveBufferReader.remaining() > 0)
+      {
+        // Try saved buffer first
+        return 0xFF & saveBufferReader.get();
+      }
+      if(byteBuffer.remaining() > 0)
+      {
+        // Must still be on the channel buffer
+        return 0xFF & byteBuffer.get();
+      }
+
+      throw new IllegalBlockingModeException();
+    }
+
+    /**
+     * Reads up to len bytes of data from the save buffer or channel buffer
+     * into an array of bytes. An attempt is made to read as many as len bytes,
+     * but a smaller number may be read. The number of bytes actually read is
+     * returned as an integer.
+     *
+     * If b is null, a NullPointerException is thrown.
+     *
+     * If the length of b is zero, then no bytes are read and 0 is returned;
+     * otherwise, there is an attempt to read at least one byte. If no byte is
+     * available in the save buffer or channel buffer,
+     * IllegalBlockingModeException will be thrown; otherwise, at least one
+     * byte is read and stored into b.
+     *
+     * The first byte read is stored into element b[0], the next one into
+     * b[o1], and so on. The number of bytes read is, at most, equal to the
+     * length of b. Let k be the number of bytes actually read; these bytes
+     * will be stored in elements b[0] through b[k-1], leaving elements b[k]
+     * through b[b.length-1] unaffected.
+     *
+     * @return the total number of bytes read into the buffer.
+     * @throws IllegalBlockingModeException if there are more bytes available.
+     */
+    @Override
+    public int read(byte[] b)
+    {
+      return read(b, 0, b.length);
+    }
+
+    /**
+     * Reads up to len bytes of data from the save buffer or channel buffer
+     * into an array of bytes. An attempt is made to read as many as len bytes,
+     * but a smaller number may be read. The number of bytes actually read is
+     * returned as an integer.
+     *
+     * If b is null, a NullPointerException is thrown.
+     *
+     * If off is negative, or len is negative, or off+len is greater than the
+     * length of the array b, then an IndexOutOfBoundsException is thrown.
+     *
+     * If len is zero, then no bytes are read and 0 is returned; otherwise,
+     * there is an attempt to read at least one byte. If no byte is available
+     * in the save buffer or channel buffer, IllegalBlockingModeException will
+     * be thrown; otherwise, at least one byte is read and stored into b.
+     *
+     * The first byte read is stored into element b[off], the next one into
+     * b[off+1], and so on. The number of bytes read is, at most, equal to len.
+     * Let k be the number of bytes actually read; these bytes will be stored
+     * in elements b[off] through b[off+k-1], leaving elements b[off+k]
+     * through b[off+len-1] unaffected.
+     *
+     * In every case, elements b[0] through b[off] and elements b[off+len]
+     * through b[b.length-1] are unaffected.
+     *
+     * @return the total number of bytes read into the buffer.
+     * @throws IllegalBlockingModeException if there are more bytes available.
+     */
+    @Override
+    public int read(byte[] b, int off, int len)
+    {
+      if ((off < 0) || (len < 0) || (off + len > b.length))
+      {
+        throw new IndexOutOfBoundsException();
+      }
+
+      if(len == 0)
+      {
+        return 0;
+      }
+
+      int bytesCopied=0;
+      int getLen;
+      if(saveBufferReader.remaining() > 0)
+      {
+        // Copy out of the last saved buffer first
+        getLen = Math.min(saveBufferReader.remaining(), len);
+        saveBufferReader.get(b, off, getLen);
+        bytesCopied += getLen;
+      }
+      if(bytesCopied < len && byteBuffer.remaining() > 0)
+      {
+        // Copy out of the channel buffer if we haven't got
+        // everything we needed.
+        getLen = Math.min(byteBuffer.remaining(), len - bytesCopied);
+        byteBuffer.get(b, off + bytesCopied, getLen);
+        bytesCopied += getLen;
+      }
+      if(bytesCopied < len)
+      {
+        throw new IllegalBlockingModeException();
+      }
+
+      return bytesCopied;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public long skip(long length)
+    {
+      int bytesSkipped=0;
+      int len;
+      if(saveBufferReader.remaining() > 0)
+      {
+        // Skip in the last saved buffer first
+        len = Math.min(saveBufferReader.remaining(), (int)length);
+        saveBufferReader.position(saveBufferReader.position() + len);
+        bytesSkipped += len;
+      }
+      if(bytesSkipped < length && byteBuffer.remaining() > 0)
+      {
+        //Skip in the channel buffer if we haven't skipped enough.
+        len = Math.min(byteBuffer.remaining(), (int)length - bytesSkipped);
+        byteBuffer.position(byteBuffer.position() + len);
+        bytesSkipped += len;
+      }
+      if(bytesSkipped < length)
+      {
+        throw new IllegalBlockingModeException();
+      }
+
+      return bytesSkipped;
+    }
+  }
+
+  /**
+   * Creates a new ASN.1 byte channel reader whose source is the
+   * provided readable byte channel, having a user defined buffer
+   * size, and user defined maximum BER element size.
+   *
+   * @param channel
+   *          The readable byte channel to use.
+   * @param bufferSize
+   *          The buffer size to use when reading from the channel.
+   * @param maxElementSize
+   *          The max ASN.1 element size this reader will read.
+   */
+  ASN1ByteChannelReader(ReadableByteChannel channel, int bufferSize,
+      int maxElementSize)
+  {
+    this.byteChannel = channel;
+    this.byteBuffer = ByteBuffer.allocate(bufferSize);
+    this.byteBuffer.flip();
+    this.saveBuffer = new ByteStringBuilder();
+    this.saveBufferReader = saveBuffer.asReader();
+
+    CombinedBufferInputStream bufferStream = new CombinedBufferInputStream();
+    this.reader = ASN1.getReader(bufferStream, maxElementSize);
+  }
+
+  /**
+   * Process any new data on the channel so they can be read as ASN.1
+   * elements. This method should only be called when there are no
+   * more complete elements in the reader. Calling this method when
+   * there are complete elements still in the reader will result in
+   * unnecessary memory allocations to store any unread data. This
+   * method will perform the following operations:
+   * <ul>
+   * <li>Clear the save buffer if everything was read.
+   * <li>Append any unread data from the NIO byte buffer to the save
+   * buffer.
+   * <li>Clear the NIO byte buffer and read from the channel.
+   * </ul>
+   *
+   * @return The number of bytes read from the channel or -1 if
+   *         channel is closed.
+   * @throws IOException
+   *           If an exception occurs while reading from the channel.
+   */
+  public int processChannelData() throws IOException
+  {
+    // Clear the save buffer if we have read all of it
+    if (saveBufferReader.remaining() == 0)
+    {
+      saveBuffer.clear();
+      saveBufferReader.rewind();
+    }
+
+    // Append any unused data in the channel buffer to the save buffer
+    if (byteBuffer.remaining() > 0)
+    {
+      saveBuffer.append(byteBuffer, byteBuffer.remaining());
+    }
+
+    byteBuffer.clear();
+    try
+    {
+      int read = byteChannel.read(byteBuffer);
+      return read;
+    }
+    finally
+    {
+      // Make sure that the buffer is flipped even if the read fails in order to
+      // ensure that subsequent calls which query the remaining data return
+      // valid results.
+      byteBuffer.flip();
+    }
+  }
+
+  /**
+   * Determines if a complete ASN.1 element is ready to be read from
+   * channel.
+   *
+   * @return <code>true</code> if another complete element is available or
+   *         <code>false</code> otherwise.
+   * @throws IOException If an error occurs while trying to decode
+   *                       an ASN1 element.
+   */
+  @Override
+  public boolean elementAvailable() throws IOException
+  {
+    return reader.elementAvailable();
+  }
+
+  /**
+   * Determines if the channel contains at least one ASN.1 element to be read.
+   *
+   * @return <code>true</code> if another element is available or
+   *         <code>false</code> otherwise.
+   * @throws IOException If an error occurs while trying to decode
+   *                       an ASN1 element.
+   */
+  @Override
+  public boolean hasNextElement() throws IOException {
+    return reader.hasNextElement();
+  }
+
+  /**
+   * Returns {@code true} if this ASN.1 reader contains unread data.
+   *
+   * @return {@code true} if this ASN.1 reader contains unread data.
+   */
+  public boolean hasRemainingData()
+  {
+    return (saveBufferReader.remaining() != 0) || (byteBuffer.remaining() != 0);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public int peekLength() throws IOException {
+    return reader.peekLength();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public byte peekType() throws IOException {
+    return reader.peekType();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public boolean readBoolean() throws IOException {
+    return reader.readBoolean();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public boolean readBoolean(byte type) throws IOException {
+    return reader.readBoolean(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void readEndExplicitTag() throws IOException {
+//    reader.readEndExplicitTag(); // TODO
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void readEndSequence() throws IOException {
+    reader.readEndSequence();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void readEndSet() throws IOException {
+    reader.readEndSet();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public int readEnumerated() throws IOException {
+    return reader.readEnumerated();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public int readEnumerated(byte type) throws IOException {
+    return reader.readEnumerated(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public long readInteger() throws IOException {
+    return reader.readInteger();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public long readInteger(byte type) throws IOException {
+    return reader.readInteger(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void readNull() throws IOException {
+    reader.readNull();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public void readNull(byte type) throws IOException {
+    reader.readNull(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public ByteString readOctetString() throws IOException {
+    return reader.readOctetString();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public ByteString readOctetString(byte type) throws IOException {
+    return readOctetString(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public ByteStringBuilder readOctetString(ByteStringBuilder buffer) throws IOException {
+    return reader.readOctetString(buffer);
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public ByteStringBuilder readOctetString(byte type, ByteStringBuilder builder) throws IOException {
+    return readOctetString(type, builder);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String readOctetStringAsString() throws IOException {
+    return reader.readOctetStringAsString();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public String readOctetStringAsString(byte type) throws IOException {
+    return readOctetStringAsString(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void readStartExplicitTag() throws IOException {
+//    reader.readStartExplicitTag();// TODO
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void readStartSequence() throws IOException {
+    reader.readStartSequence();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public void readStartSequence(byte type) throws IOException {
+    reader.readStartSequence(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void readStartSet() throws IOException {
+    reader.readStartSet();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public void readStartSet(byte type) throws IOException {
+    reader.readStartSet(type);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void close() throws IOException {
+    reader.close();
+    byteChannel.close();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public ASN1Reader skipElement() throws IOException {
+    reader.skipElement();
+    return this;
+  }
+}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AbandonRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AbandonRequestProtocolOp.java
index 655f2d9..8d958c6 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AbandonRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AbandonRequestProtocolOp.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddRequestProtocolOp.java
index d02e210..69df0b1 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddRequestProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.RawAttribute;
 import org.opends.server.util.Base64;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddResponseProtocolOp.java
index 1f5a03f..22ecbee 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/AddResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindRequestProtocolOp.java
index 53e4492..2216339 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindRequestProtocolOp.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.AuthenticationType;
 import org.forgerock.opendj.ldap.ByteString;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindResponseProtocolOp.java
index 0f25325..6a4d6ac 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/BindResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 import org.forgerock.opendj.ldap.ByteString;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareRequestProtocolOp.java
index 83f63e0..14633cc 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareRequestProtocolOp.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.forgerock.opendj.ldap.ByteString;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareResponseProtocolOp.java
index 30447e9..f6dd6b4 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/CompareResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteRequestProtocolOp.java
index d4540ec..8ffbf07 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteRequestProtocolOp.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteResponseProtocolOp.java
index e3496dc..09e2871 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/DeleteResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedRequestProtocolOp.java
index f11c9b7..e49b25f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedRequestProtocolOp.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.forgerock.opendj.ldap.ByteString;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedResponseProtocolOp.java
index fe2fb47..fc45952 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ExtendedResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 import org.forgerock.opendj.ldap.ByteString;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/IntermediateResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/IntermediateResponseProtocolOp.java
index e0548d5..9a029ad 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/IntermediateResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/IntermediateResponseProtocolOp.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.forgerock.opendj.ldap.ByteString;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
index 7a59b05..62d151f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -28,14 +28,7 @@
 
 
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.core.DirectoryServer.*;
-import static org.opends.server.loggers.AccessLogger.*;
-import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
+import java.io.Closeable;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
@@ -54,6 +47,11 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.ConnectionHandler;
 import org.opends.server.core.*;
@@ -62,16 +60,18 @@
 import org.opends.server.extensions.RedirectingByteChannel;
 import org.opends.server.extensions.TLSByteChannel;
 import org.opends.server.extensions.TLSCapableConnection;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1ByteChannelReader;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.opends.server.util.StaticUtils;
 import org.opends.server.util.TimeThread;
 
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.messages.ProtocolMessages.*;
+import static org.opends.server.core.DirectoryServer.*;
+import static org.opends.server.loggers.AccessLogger.*;
+import static org.opends.server.protocols.ldap.LDAPConstants.*;
+import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
+
 
 /**
  * This class defines an LDAP client connection, which is a type of
@@ -90,13 +90,13 @@
   private static final class ConnectionFinalizerJob implements Runnable
   {
     /** The client connection ASN1 reader. */
-    private final ASN1Reader asn1Reader;
+    private final ASN1ByteChannelReader asn1Reader;
 
     /** The client connection socket channel. */
     private final SocketChannel socketChannel;
 
     /** Creates a new connection finalizer job. */
-    private ConnectionFinalizerJob(ASN1Reader asn1Reader,
+    private ConnectionFinalizerJob(ASN1ByteChannelReader asn1Reader,
         SocketChannel socketChannel)
     {
       this.asn1Reader = asn1Reader;
@@ -308,7 +308,7 @@
   /**
    * Thread local ASN1Writer and buffer.
    */
-  private static final class ASN1WriterHolder
+  private static final class ASN1WriterHolder implements Closeable
   {
     private final ASN1Writer writer;
     private final ByteStringBuilder buffer;
@@ -320,6 +320,14 @@
       this.maxBufferSize = getMaxInternalBufferSize();
       this.writer = ASN1.getWriter(buffer, maxBufferSize);
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public void close() throws IOException
+    {
+      StaticUtils.close(writer);
+      buffer.clearAndTruncate(maxBufferSize, maxBufferSize);
+    }
   }
 
   /**
@@ -503,9 +511,7 @@
             timeoutClientChannel);
     saslChannel =
         RedirectingByteChannel.getRedirectingByteChannel(tlsChannel);
-    this.asn1Reader =
-        ASN1.getReader(saslChannel, bufferSize, connectionHandler
-            .getMaxRequestSize());
+    this.asn1Reader = new ASN1ByteChannelReader(saslChannel, bufferSize, connectionHandler.getMaxRequestSize());
 
     if (connectionHandler.useSSL())
     {
@@ -1004,7 +1010,7 @@
       // Clear and reset all of the internal buffers ready for the next usage.
       // The ASN1Writer is based on a ByteStringBuilder so closing will cause
       // the internal buffers to be resized if needed.
-      close(holder.writer);
+      close(holder);
     }
  }
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPControl.java
index b12109f..a3bde1e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPControl.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.Control;
 import org.forgerock.opendj.ldap.ByteString;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPMessage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPMessage.java
index 7330500..8d95694 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPMessage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPMessage.java
@@ -33,7 +33,7 @@
 import java.io.IOException;
 
 import org.opends.server.api.ProtocolElement;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.Control;
 
 import static org.opends.server.protocols.ldap.LDAPConstants.
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPReader.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPReader.java
index 0f1e7cc..08ffdd4 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPReader.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPReader.java
@@ -26,22 +26,20 @@
  */
 package org.opends.server.protocols.ldap;
 
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 import static org.opends.server.protocols.ldap.LDAPResultCode.*;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
-
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 
-
 /**
  * Utility class used to decode LDAP messages from an ASN1Reader.
  */
@@ -742,9 +740,9 @@
         }
       }
     }
-    catch(ASN1Exception asn1e)
+    catch(IOException e)
     {
-      logger.traceException(asn1e);
+      logger.traceException(e);
     }
 
     try
@@ -1348,9 +1346,9 @@
         }
       }
     }
-    catch(ASN1Exception asn1e)
+    catch(IOException e)
     {
-      logger.traceException(asn1e);
+      logger.traceException(e);
     }
 
     try
@@ -1440,9 +1438,9 @@
         }
       }
     }
-    catch(ASN1Exception asn1e)
+    catch(IOException e)
     {
-      logger.traceException(asn1e);
+      logger.traceException(e);
     }
 
     try
@@ -2452,7 +2450,7 @@
     try
     {
       if(reader.hasNextElement() &&
-          reader.peekType() == UNIVERSAL_BOOLEAN_TYPE)
+          reader.peekType() == ASN1.UNIVERSAL_BOOLEAN_TYPE)
       {
         try
         {
@@ -2467,7 +2465,7 @@
         }
       }
       if(reader.hasNextElement() &&
-          reader.peekType() == UNIVERSAL_OCTET_STRING_TYPE)
+          reader.peekType() == ASN1.UNIVERSAL_OCTET_STRING_TYPE)
       {
         try
         {
@@ -2482,9 +2480,9 @@
         }
       }
     }
-    catch(ASN1Exception asn1e)
+    catch(IOException e)
     {
-      logger.traceException(asn1e);
+      logger.traceException(e);
     }
 
     try
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
index 8d02e21..33fd48b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
@@ -48,8 +48,8 @@
 import org.opends.server.api.ServerShutdownListener;
 import org.opends.server.core.DirectoryServer;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1ByteChannelReader;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.types.DisconnectReason;
 import org.opends.server.types.InitializationException;
 import org.opends.server.types.LDAPException;
@@ -172,7 +172,7 @@
       {
         try
         {
-          ASN1ByteChannelReader asn1Reader = readyConnection.getASN1Reader();
+          ASN1Reader asn1Reader = readyConnection.getASN1Reader();
           boolean ldapMessageProcessed = false;
           while (true)
           {
@@ -205,7 +205,7 @@
             }
           }
         }
-        catch (ASN1Exception e)
+        catch (DecodeException e)
         {
           logger.traceException(e);
           readyConnection.disconnect(DisconnectReason.PROTOCOL_ERROR, true,
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNRequestProtocolOp.java
index c5934fe..c75f699 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNRequestProtocolOp.java
@@ -29,7 +29,7 @@
 
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.forgerock.opendj.ldap.ByteString;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNResponseProtocolOp.java
index 938b63b..275cd15 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyDNResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyRequestProtocolOp.java
index b4283a3..2eb436f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyRequestProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.RawModification;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyResponseProtocolOp.java
index ca60fbe..4159a85 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ModifyResponseProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ProtocolOp.java
index 953b466..0320cf1 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/ProtocolOp.java
@@ -22,10 +22,11 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.protocols.ldap;
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 
 import java.io.IOException;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchRequestProtocolOp.java
index 5771bd0..582e1f3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchRequestProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.Set;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.RawFilter;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultDoneProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultDoneProtocolOp.java
index cc434e0..2388eef 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultDoneProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultDoneProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.List;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.DN;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultEntryProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultEntryProtocolOp.java
index e6cf8af..49c2b2a 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultEntryProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultEntryProtocolOp.java
@@ -41,7 +41,7 @@
 import java.util.Map;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeBuilder;
 import org.opends.server.types.AttributeType;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultReferenceProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultReferenceProtocolOp.java
index 51b3b5f..5fd0c3e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultReferenceProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/SearchResultReferenceProtocolOp.java
@@ -32,7 +32,7 @@
 import java.util.Iterator;
 import java.io.IOException;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.SearchResultReference;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/UnbindRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/UnbindRequestProtocolOp.java
index 5a1a6bc..da50405 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/UnbindRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/protocols/ldap/UnbindRequestProtocolOp.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/common/ServerState.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/common/ServerState.java
index 7920de5..0a901d2 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/common/ServerState.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/common/ServerState.java
@@ -34,7 +34,7 @@
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.zip.DataFormatException;
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.replication.protocol.ProtocolVersion;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.util.Utils;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index 2703a1b..7312145 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -40,6 +40,7 @@
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.IsolationPolicy;
 import org.opends.server.admin.std.server.ExternalChangelogDomainCfg;
@@ -51,7 +52,6 @@
 import org.opends.server.backends.task.Task;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.*;
-import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchListener;
 import org.opends.server.protocols.internal.InternalSearchOperation;
@@ -2435,7 +2435,7 @@
           replayErrorMsg = message.toString();
           updateError(csn);
         }
-      } catch (ASN1Exception e)
+      } catch (DecodeException e)
       {
         replayErrorMsg = logDecodingOperationError(msg, e);
       } catch (LDAPException e)
@@ -3133,10 +3133,10 @@
    *
    * @param msg            The conflicting Add Operation.
    *
-   * @throws ASN1Exception When an encoding error happened manipulating the
+   * @throws DecodeException When an encoding error happened manipulating the
    *                       msg.
    */
-  private void addConflict(AddMsg msg) throws ASN1Exception
+  private void addConflict(AddMsg msg) throws DecodeException
   {
     String normalizedDN = msg.getDN().toNormalizedString();
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/ReplicationRepairRequestControl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/ReplicationRepairRequestControl.java
index a02ac36..34b949f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/ReplicationRepairRequestControl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/plugin/ReplicationRepairRequestControl.java
@@ -31,7 +31,7 @@
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.controls.ControlDecoder;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 
 import java.io.IOException;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/AddMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/AddMsg.java
index cd4fb84..2b00b17 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/AddMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/AddMsg.java
@@ -35,9 +35,9 @@
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.AddOperationBasis;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.replication.common.CSN;
@@ -174,7 +174,7 @@
   @Override
   public AddOperation createOperation(
       InternalClientConnection connection, DN newDN)
-  throws LDAPException, ASN1Exception
+  throws LDAPException, DecodeException
   {
     List<RawAttribute> attr = decodeRawAttributes(encodedAttributes);
 
@@ -520,10 +520,9 @@
    *
    * @param name  The name of the attribute to add.
    * @param value The value of the attribute to add.
-   * @throws ASN1Exception When this Msg is not valid.
+   * @throws DecodeException When this Msg is not valid.
    */
-  public void addAttribute(String name, String value)
-         throws ASN1Exception
+  public void addAttribute(String name, String value) throws DecodeException
   {
     ByteStringBuilder byteBuilder = new ByteStringBuilder();
     byteBuilder.append(encodedAttributes);
@@ -545,10 +544,10 @@
   /**
    * Get the attributes of this add msg.
    * @throws LDAPException In case of LDAP decoding exception
-   * @throws ASN1Exception In case of ASN1 decoding exception
+   * @throws DecodeException In case of ASN1 decoding exception
    * @return the list of attributes
    */
-  public List<Attribute> getAttributes() throws LDAPException, ASN1Exception
+  public List<Attribute> getAttributes() throws LDAPException, DecodeException
   {
     return decodeAttributes(encodedAttributes);
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/LDAPUpdateMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/LDAPUpdateMsg.java
index 7a58d32..64d6412 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/LDAPUpdateMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/LDAPUpdateMsg.java
@@ -26,15 +26,16 @@
  */
 package org.opends.server.replication.protocol;
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.zip.DataFormatException;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.replication.common.AssuredMode;
@@ -178,11 +179,11 @@
    * @param   conn connection to use when creating the message
    * @return  the created Operation
    * @throws  LDAPException In case of LDAP decoding exception.
-   * @throws  ASN1Exception In case of ASN1 decoding exception.
+   * @throws  IOException In case of ASN1 decoding exception.
    * @throws DataFormatException In case of bad msg format.
    */
   public Operation createOperation(InternalClientConnection conn)
-      throws LDAPException, ASN1Exception, DataFormatException
+      throws LDAPException, IOException, DataFormatException
   {
     return createOperation(conn, dn);
   }
@@ -195,11 +196,11 @@
    * @param   newDN the DN to use when creating the operation.
    * @return  the created Operation.
    * @throws  LDAPException In case of LDAP decoding exception.
-   * @throws  ASN1Exception In case of ASN1 decoding exception.
+   * @throws  IOException In case of ASN1 decoding exception.
    * @throws DataFormatException In case of bad msg format.
    */
   public abstract Operation createOperation(InternalClientConnection conn,
-      DN newDN) throws LDAPException, ASN1Exception, DataFormatException;
+      DN newDN) throws LDAPException, IOException, DataFormatException;
 
 
   // ============
@@ -614,10 +615,10 @@
    * @param in The provided byte array.
    * @return The list of RawAttribute objects.
    * @throws LDAPException when it occurs.
-   * @throws ASN1Exception when it occurs.
+   * @throws DecodeException when it occurs.
    */
   public ArrayList<RawAttribute> decodeRawAttributes(byte[] in)
-  throws LDAPException, ASN1Exception
+  throws LDAPException, DecodeException
   {
     ArrayList<RawAttribute> rattr = new ArrayList<RawAttribute>();
     try
@@ -643,10 +644,10 @@
    * @param in The provided byte array.
    * @return The list of Attribute objects.
    * @throws LDAPException when it occurs.
-   * @throws ASN1Exception when it occurs.
+   * @throws DecodeException when it occurs.
    */
   public ArrayList<Attribute> decodeAttributes(byte[] in)
-  throws LDAPException, ASN1Exception
+  throws LDAPException, DecodeException
   {
     ArrayList<Attribute> lattr = new ArrayList<Attribute>();
     try
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java
index 1b3ef2a..12e1526 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java
@@ -26,19 +26,19 @@
  */
 package org.opends.server.replication.protocol;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.protocols.ldap.LDAPModification;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.plugin.EntryHistorical;
 import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ByteStringBuilder;
 
 /**
  * This class holds every common code for the modify messages (mod, moddn).
@@ -99,10 +99,10 @@
   /**
    * Get the Modifications associated to the UpdateMsg to the provided value.
    * @throws LDAPException In case of LDAP decoding exception
-   * @throws ASN1Exception In case of ASN1 decoding exception
+   * @throws IOException In case of ASN1 decoding exception
    * @return the list of modifications
    */
-  public List<Modification> getMods() throws ASN1Exception, LDAPException
+  public List<Modification> getMods() throws IOException, LDAPException
   {
     return decodeMods(encodedMods);
   }
@@ -164,11 +164,11 @@
   /**
    * Decode mods from the provided byte array.
    * @param in The provided byte array.
-   * @throws ASN1Exception when occurs.
+   * @throws IOException when occurs.
    * @throws LDAPException when occurs.
    * @return The decoded mods.
    */
-  protected List<Modification> decodeMods(byte[] in) throws ASN1Exception,
+  protected List<Modification> decodeMods(byte[] in) throws IOException,
       LDAPException
   {
     List<Modification> mods = new ArrayList<Modification>();
@@ -184,11 +184,11 @@
    * Decode raw mods from the provided byte array.
    * @param in The provided byte array.
    * @return The decoded mods.
-   * @throws ASN1Exception when occurs.
+   * @throws IOException when occurs.
    * @throws LDAPException when occurs.
    */
   protected List<RawModification> decodeRawMods(byte[] in)
-      throws LDAPException, ASN1Exception
+      throws LDAPException, IOException
   {
     List<RawModification> ldapmods = new ArrayList<RawModification>();
     ASN1Reader asn1Reader = ASN1.getReader(in);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyDNMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyDNMsg.java
index 37edd48..56d8ca4 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyDNMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyDNMsg.java
@@ -26,13 +26,13 @@
  */
 package org.opends.server.replication.protocol;
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.zip.DataFormatException;
 
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyDNOperationBasis;
-import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.types.*;
@@ -160,7 +160,7 @@
    */
   @Override
   public ModifyDNOperation createOperation(InternalClientConnection connection,
-      DN newDN) throws LDAPException, ASN1Exception
+      DN newDN) throws LDAPException, IOException
   {
     ModifyDNOperation moddn =  new ModifyDNOperationBasis(connection,
         InternalClientConnection.nextOperationID(),
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyMsg.java
index 83c7a29..64d4af7 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/ModifyMsg.java
@@ -26,13 +26,13 @@
  */
 package org.opends.server.replication.protocol;
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.zip.DataFormatException;
 
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.ModifyOperationBasis;
-import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.types.*;
@@ -127,7 +127,7 @@
    */
   @Override
   public ModifyOperation createOperation(InternalClientConnection connection,
-      DN newDN) throws LDAPException, ASN1Exception, DataFormatException
+      DN newDN) throws LDAPException, IOException, DataFormatException
   {
     if (newDN == null)
       newDN = getDN();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/MonitorMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/MonitorMsg.java
index 5376e52..6d9863f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/MonitorMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/MonitorMsg.java
@@ -34,9 +34,9 @@
 import java.util.Map.Entry;
 import java.util.zip.DataFormatException;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.common.ServerState;
 import org.forgerock.opendj.ldap.ByteSequenceReader;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/StartSessionMsg.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
index 9528eac..bedab40 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
@@ -32,9 +32,9 @@
 import java.util.*;
 import java.util.zip.DataFormatException;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.replication.common.AssuredMode;
 import org.opends.server.replication.common.ServerStatus;
 import org.forgerock.opendj.ldap.ByteSequenceReader;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CertificateSyntax.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CertificateSyntax.java
index 074feb9..9bfd198 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CertificateSyntax.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CertificateSyntax.java
@@ -29,6 +29,7 @@
 
 
 
+import java.io.IOException;
 import java.util.List;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 
@@ -45,16 +46,15 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.ResultCode;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Reader;
 
 import static org.opends.messages.SchemaMessages.*;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import static org.opends.server.schema.SchemaConstants.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
 
 
 /**
@@ -282,7 +282,7 @@
     {
       // Certificate SIGNED SEQUENCE
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -291,7 +291,7 @@
 
       // CertificateContent SEQUENCE
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -300,11 +300,11 @@
 
       // Optional Version
       if (reader.hasNextElement() &&
-          reader.peekType() == (TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED))
+          reader.peekType() == (ASN1.TYPE_MASK_CONTEXT | ASN1.TYPE_MASK_CONSTRUCTED))
       {
         reader.readStartExplicitTag();
         if (!reader.hasNextElement() ||
-            reader.peekType() != UNIVERSAL_INTEGER_TYPE)
+            reader.peekType() != ASN1.UNIVERSAL_INTEGER_TYPE)
         {
           invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
           return false;
@@ -329,7 +329,7 @@
 
       // serialNumber
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_INTEGER_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_INTEGER_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -338,7 +338,7 @@
 
       // signature AlgorithmIdentifier
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -347,7 +347,7 @@
 
       // issuer name (SEQUENCE as of X.501, 9.2)
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -356,7 +356,7 @@
 
       // validity (SEQUENCE)
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -365,7 +365,7 @@
 
       // subject name (SEQUENCE as of X.501, 9.2)
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -374,7 +374,7 @@
 
       // SubjectPublicKeyInfo (SEQUENCE)
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -383,7 +383,7 @@
 
       // OPTIONAL issuerUniqueIdentifier
       if (reader.hasNextElement() &&
-          reader.peekType() == (TYPE_MASK_CONTEXT + 1))
+          reader.peekType() == (ASN1.TYPE_MASK_CONTEXT + 1))
       {
         if (x509Version < 1)
         {
@@ -396,7 +396,7 @@
 
       // OPTIONAL subjectUniqueIdentifier
       if (reader.hasNextElement() &&
-          reader.peekType() == (TYPE_MASK_CONTEXT + 2))
+          reader.peekType() == (ASN1.TYPE_MASK_CONTEXT + 2))
       {
         if (x509Version < 1)
         {
@@ -409,7 +409,7 @@
 
       // OPTIONAL extensions
       if (reader.hasNextElement() &&
-          reader.peekType() == ((TYPE_MASK_CONTEXT|TYPE_MASK_CONSTRUCTED) + 3))
+          reader.peekType() == ((ASN1.TYPE_MASK_CONTEXT|ASN1.TYPE_MASK_CONSTRUCTED) + 3))
       {
         if (x509Version < 2)
         {
@@ -419,7 +419,7 @@
         }
         reader.readStartExplicitTag(); // read Tag
         if (!reader.hasNextElement() ||
-            reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+            reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
         {
           // only valid in v3
           invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
@@ -438,7 +438,7 @@
 
       // AlgorithmIdentifier SEQUENCE
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_SEQUENCE_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -447,7 +447,7 @@
 
       // ENCRYPTED HASH BIT STRING
       if (!reader.hasNextElement() ||
-          reader.peekType() != UNIVERSAL_BIT_STRING_TYPE)
+          reader.peekType() != ASN1.UNIVERSAL_BIT_STRING_TYPE)
       {
         invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get());
         return false;
@@ -470,12 +470,16 @@
       }
       // End of the certificate
     }
-    catch (ASN1Exception e)
+    catch (DecodeException e)
     {
-      System.out.println(e.getMessageObject());
       invalidReason.append(e.getMessageObject());
       return false;
     }
+    catch (IOException e)
+    {
+      invalidReason.append(e.getMessage());
+      return false;
+    }
 
     // The basic structure of the value is an X.509 certificate
     return true;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPAuthenticationHandler.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPAuthenticationHandler.java
index f8cb256..75b911f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPAuthenticationHandler.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPAuthenticationHandler.java
@@ -25,9 +25,6 @@
  *      Portions Copyright 2012-2014 ForgeRock AS
  */
 package org.opends.server.tools;
-import org.forgerock.i18n.LocalizableMessage;
-
-
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -56,7 +53,10 @@
 import javax.security.sasl.Sasl;
 import javax.security.sasl.SaslClient;
 
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.BindRequestProtocolOp;
 import org.opends.server.protocols.ldap.BindResponseProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedRequestProtocolOp;
@@ -65,13 +65,10 @@
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.LDAPException;
 import org.opends.server.types.Control;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.ByteSequence;
 import org.opends.server.util.Base64;
 import org.opends.server.util.PasswordReader;
 
 import static org.opends.messages.ToolMessages.*;
-
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
 import static org.opends.server.tools.ToolConstants.*;
 import static org.opends.server.util.ServerConstants.*;
@@ -337,6 +334,13 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message =
@@ -344,13 +348,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message =
-          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message =
@@ -648,6 +645,13 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message =
@@ -655,13 +659,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message =
-          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message =
@@ -900,6 +897,14 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
+              SASL_MECHANISM_CRAM_MD5, getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
@@ -907,13 +912,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
-          SASL_MECHANISM_CRAM_MD5, getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
@@ -1043,6 +1041,14 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
+              SASL_MECHANISM_CRAM_MD5, getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
@@ -1050,13 +1056,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
-          SASL_MECHANISM_CRAM_MD5, getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
@@ -1479,6 +1478,14 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
+              SASL_MECHANISM_DIGEST_MD5, getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
@@ -1486,13 +1493,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
-          SASL_MECHANISM_DIGEST_MD5, getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_INITIAL_BIND_RESPONSE.get(
@@ -1791,6 +1791,14 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
+              SASL_MECHANISM_DIGEST_MD5, getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
@@ -1798,13 +1806,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
-          SASL_MECHANISM_DIGEST_MD5, getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_SECOND_BIND_RESPONSE.get(
@@ -2455,6 +2456,13 @@
                                   message);
       }
     }
+    catch (DecodeException e)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(e));
+      throw new ClientException(
+              LDAPResultCode.CLIENT_SIDE_DECODING_ERROR, message, e);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message =
@@ -2462,13 +2470,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message =
-          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message =
@@ -3049,6 +3050,13 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message =
@@ -3056,13 +3064,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message =
-          ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message =
@@ -3278,6 +3279,13 @@
                                     message);
         }
       }
+      catch (DecodeException ae)
+      {
+        LocalizableMessage message =
+            ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
+        throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+            message, ae);
+      }
       catch (IOException ioe)
       {
         LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(
@@ -3285,13 +3293,6 @@
         throw new ClientException(
                 LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
       }
-      catch (ASN1Exception ae)
-      {
-        LocalizableMessage message =
-            ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(getExceptionMessage(ae));
-        throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                  message, ae);
-      }
       catch (LDAPException le)
       {
         LocalizableMessage message =
@@ -3451,6 +3452,14 @@
                                         message);
             }
           }
+          catch (DecodeException ae)
+          {
+            LocalizableMessage message =
+                ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE
+                    .get(getExceptionMessage(ae));
+            throw new ClientException(
+                LDAPResultCode.CLIENT_SIDE_DECODING_ERROR, message, ae);
+          }
           catch (IOException ioe)
           {
             LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(
@@ -3458,13 +3467,6 @@
             throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN,
                                       message, ioe);
           }
-          catch (ASN1Exception ae)
-          {
-            LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(
-                getExceptionMessage(ae));
-            throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                      message, ae);
-          }
           catch (LDAPException le)
           {
             LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_BIND_RESPONSE.get(
@@ -3655,6 +3657,13 @@
                                   message);
       }
     }
+    catch (DecodeException ae)
+    {
+      LocalizableMessage message =
+          ERR_LDAPAUTH_CANNOT_READ_WHOAMI_RESPONSE.get(getExceptionMessage(ae));
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
+          message, ae);
+    }
     catch (IOException ioe)
     {
       LocalizableMessage message = ERR_LDAPAUTH_CANNOT_READ_WHOAMI_RESPONSE.get(
@@ -3662,13 +3671,6 @@
       throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, message, ioe);
     }
-    catch (ASN1Exception ae)
-    {
-      LocalizableMessage message =
-          ERR_LDAPAUTH_CANNOT_READ_WHOAMI_RESPONSE.get(getExceptionMessage(ae));
-      throw new ClientException(LDAPResultCode.CLIENT_SIDE_DECODING_ERROR,
-                                message, ae);
-    }
     catch (LDAPException le)
     {
       LocalizableMessage message =
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPCompare.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPCompare.java
index a62dd6c..8bef2d7 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPCompare.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPCompare.java
@@ -41,7 +41,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.controls.LDAPAssertionRequestControl;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.CompareRequestProtocolOp;
 import org.opends.server.protocols.ldap.CompareResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPFilter;
@@ -248,7 +248,7 @@
                                               protocolOp, controls);
         connection.getLDAPWriter().writeMessage(message);
         responseMessage = connection.getLDAPReader().readMessage();
-      } catch(ASN1Exception ae)
+      } catch(DecodeException ae)
       {
         logger.traceException(ae);
         if (!compareOptions.continueOnError())
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPDelete.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPDelete.java
index 21a4b1e..eebc4ea 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPDelete.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPDelete.java
@@ -39,7 +39,7 @@
 import java.util.LinkedList;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
 import org.opends.server.protocols.ldap.DeleteResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
@@ -188,7 +188,7 @@
       {
         connection.getLDAPWriter().writeMessage(message);
         responseMessage = connection.getLDAPReader().readMessage();
-      } catch(ASN1Exception ae)
+      } catch(DecodeException ae)
       {
         logger.traceException(ae);
         if (!deleteOptions.continueOnError())
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPModify.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPModify.java
index 7ce740f..bbe59f1 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPModify.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPModify.java
@@ -42,7 +42,7 @@
 import org.opends.server.controls.ProxiedAuthV2Control;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.plugins.ChangeNumberControlPlugin;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.AddRequestProtocolOp;
 import org.opends.server.protocols.ldap.AddResponseProtocolOp;
 import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
@@ -310,7 +310,7 @@
                                controls);
           connection.getLDAPWriter().writeMessage(message);
           responseMessage = connection.getLDAPReader().readMessage();
-        } catch(ASN1Exception ae)
+        } catch(DecodeException ae)
         {
           logger.traceException(ae);
           LocalizableMessage message = INFO_OPERATION_FAILED.get(operationType);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPPasswordModify.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPPasswordModify.java
index 1ef44b4..d8bd1a3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPPasswordModify.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPPasswordModify.java
@@ -37,7 +37,7 @@
 import org.opends.server.controls.PasswordPolicyErrorType;
 import org.opends.server.controls.PasswordPolicyResponseControl;
 import org.opends.server.controls.PasswordPolicyWarningType;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.ExtendedRequestProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPControl;
@@ -771,20 +771,8 @@
       LocalizableMessage message = ERR_LDAPPWMOD_CANNOT_SEND_PWMOD_REQUEST.get(e);
       err.println(wrapText(message, MAX_LINE_WIDTH));
 
-      try
-      {
-        requestMessage = new LDAPMessage(nextMessageID.getAndIncrement(),
-                                         new UnbindRequestProtocolOp());
-        writer.writeMessage(requestMessage);
-      }
-      catch (Exception e2) {}
-
-      try
-      {
-        reader.close();
-        writer.close();
-      } catch (Exception e2) {}
-
+      unbind(nextMessageID, writer);
+      close(reader, writer);
       return 1;
     }
 
@@ -800,20 +788,8 @@
       LocalizableMessage message = ERR_LDAPPWMOD_CANNOT_READ_PWMOD_RESPONSE.get(e);
       err.println(wrapText(message, MAX_LINE_WIDTH));
 
-      try
-      {
-        requestMessage = new LDAPMessage(nextMessageID.getAndIncrement(),
-                                         new UnbindRequestProtocolOp());
-        writer.writeMessage(requestMessage);
-      }
-      catch (Exception e2) {}
-
-      try
-      {
-        reader.close();
-        writer.close();
-      } catch (Exception e2) {}
-
+      unbind(nextMessageID, writer);
+      close(reader, writer);
       return 1;
     }
 
@@ -841,20 +817,8 @@
         err.println(wrapText(message, MAX_LINE_WIDTH));
       }
 
-      try
-      {
-        requestMessage = new LDAPMessage(nextMessageID.getAndIncrement(),
-                                         new UnbindRequestProtocolOp());
-        writer.writeMessage(requestMessage);
-      }
-      catch (Exception e) {}
-
-      try
-      {
-        reader.close();
-        writer.close();
-      } catch (Exception e) {}
-
+      unbind(nextMessageID, writer);
+      close(reader, writer);
       return resultCode;
     }
     else
@@ -944,41 +908,29 @@
         LocalizableMessage message = ERR_LDAPPWMOD_COULD_NOT_DECODE_RESPONSE_VALUE.get(e);
         err.println(wrapText(message, MAX_LINE_WIDTH));
 
-        try
-        {
-          requestMessage = new LDAPMessage(nextMessageID.getAndIncrement(),
-                                           new UnbindRequestProtocolOp());
-          writer.writeMessage(requestMessage);
-        }
-        catch (Exception e2) {}
-
-        try
-        {
-          reader.close();
-          writer.close();
-        } catch (Exception e2) {}
-
+        unbind(nextMessageID, writer);
+        close(reader, writer);
         return 1;
       }
     }
 
 
     // Unbind from the server and close the connection.
+    unbind(nextMessageID, writer);
+    close(reader, writer);
+    return 0;
+  }
+
+  private static void unbind(AtomicInteger nextMessageID, LDAPWriter writer)
+  {
     try
     {
-      requestMessage = new LDAPMessage(nextMessageID.getAndIncrement(),
-                                       new UnbindRequestProtocolOp());
+      LDAPMessage requestMessage = new LDAPMessage(
+          nextMessageID.getAndIncrement(), new UnbindRequestProtocolOp());
       writer.writeMessage(requestMessage);
     }
     catch (Exception e) {}
-
-    try
-    {
-      reader.close();
-      writer.close();
-    } catch (Exception e) {}
-
-    return 0;
   }
+
 }
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPReader.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPReader.java
index 61d527e..e4cc900 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPReader.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPReader.java
@@ -33,9 +33,9 @@
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteString;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Exception;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.types.LDAPException;
 import org.opends.server.types.RecordingInputStream;
@@ -79,14 +79,14 @@
    * @throws  IOException  If a problem occurs while attempting to read from the
    *                       input stream.
    *
-   * @throws  ASN1Exception  If a problem occurs while attempting to decode the
+   * @throws  DecodeException  If a problem occurs while attempting to decode the
    *                         data read as an ASN.1 sequence.
 
    * @throws  LDAPException  If a problem occurs while attempting to decode the
    *                         LDAP message.
    */
   public LDAPMessage readMessage()
-       throws IOException, ASN1Exception, LDAPException
+       throws IOException, DecodeException, LDAPException
   {
     debugInputStream.setRecordingEnabled(logger.isTraceEnabled());
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPSearch.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPSearch.java
index e067fcb..4897877 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPSearch.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPSearch.java
@@ -49,7 +49,7 @@
 import com.forgerock.opendj.cli.IntegerArgument;
 import com.forgerock.opendj.cli.MultiChoiceArgument;
 import com.forgerock.opendj.cli.StringArgument;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import static org.opends.messages.ToolMessages.*;
@@ -386,7 +386,7 @@
 
           } while(opType != OP_TYPE_SEARCH_RESULT_DONE);
 
-        } catch(ASN1Exception ae)
+        } catch(DecodeException ae)
         {
           logger.traceException(ae);
           throw new IOException(ae.getMessage());
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPToolUtils.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPToolUtils.java
index d649a5d..11262ab 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPToolUtils.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPToolUtils.java
@@ -33,7 +33,7 @@
 import java.io.PrintStream;
 import java.net.SocketTimeoutException;
 
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.DN;
@@ -290,11 +290,11 @@
    * <br>
    * The code simply checks that the exception corresponds to a client side
    * time out.
-   * @param ae the asn1exception that occurred connecting to the server or
+   * @param ae the DecodeException that occurred connecting to the server or
    * handling the response from the server.
    * @return the message to be displayed to the user when an exception occurs.
    */
-  public static String getMessageForConnectionException(ASN1Exception ae)
+  public static String getMessageForConnectionException(DecodeException ae)
   {
     Throwable cause = ae.getCause();
     if (cause != null)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPWriter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPWriter.java
index 72a1c84..5e218f0 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPWriter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/LDAPWriter.java
@@ -24,7 +24,6 @@
  *      Copyright 2009 Sun Microsystems, Inc.
  *      Portions Copyright 2014 ForgeRock AS
  */
-
 package org.opends.server.tools;
 
 import java.io.BufferedOutputStream;
@@ -33,12 +32,13 @@
 import java.net.Socket;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.types.RecordingOutputStream;
 import org.opends.server.util.ServerConstants;
+import org.opends.server.util.StaticUtils;
 
 /**
  * This class defines a utility that can be used to write LDAP messages over a
@@ -97,14 +97,8 @@
       ByteString bytesRead = debugOutputStream.getRecordedBytes();
       debugOutputStream.clearRecordedBytes();
 
-      StringBuilder builder = new StringBuilder();
-      builder.append("bytes written to wire(len=");
-      builder.append(bytesRead.length());
-      builder.append("):");
-      builder.append(ServerConstants.EOL);
-      builder.append(bytesRead.toHexPlusAsciiString(4));
-
-      logger.trace(builder.toString());
+      logger.trace("bytes written to wire(len=" + bytesRead.length() + "):"
+          + ServerConstants.EOL + bytesRead.toHexPlusAsciiString(4));
     }
   }
 
@@ -114,26 +108,7 @@
   @Override
   public void close()
   {
-    try
-    {
-      asn1Writer.close();
-    }
-    catch (Exception e)
-    {
-      logger.traceException(e);
-    }
-
-
-    if (socket != null)
-    {
-      try
-      {
-        socket.close();
-      }
-      catch (Exception e)
-      {
-        logger.traceException(e);
-      }
-    }
+    StaticUtils.close(asn1Writer, debugOutputStream);
+    StaticUtils.close(socket);
   }
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageAccount.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageAccount.java
index 95a3662..ae16fbc 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageAccount.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageAccount.java
@@ -39,7 +39,7 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.AdministrationConnector;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.ExtendedRequestProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageTasks.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageTasks.java
index 1b3768b..92f860c 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageTasks.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/ManageTasks.java
@@ -36,7 +36,7 @@
 import org.opends.server.core.DirectoryServer;
 
 import org.opends.server.loggers.ErrorLogger;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 
 import static org.opends.server.tools.ToolConstants.*;
 
@@ -419,10 +419,10 @@
    * @throws IOException if there is a problem with screen I/O
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    */
   private void printSummaryTable()
-          throws LDAPException, IOException, ASN1Exception {
+          throws LDAPException, IOException, DecodeException {
     List<TaskEntry> entries = taskClient.getTaskEntries();
     if (entries.size() > 0) {
       TableBuilder table = new TableBuilder();
@@ -465,10 +465,10 @@
    * @throws IOException if there is a problem with screen I/O
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    */
   private Menu<Void> getSummaryMenu()
-          throws LDAPException, IOException, ASN1Exception {
+          throws LDAPException, IOException, DecodeException {
     List<String> taskIds = new ArrayList<String>();
     List<Integer> cancelableIndices = new ArrayList<Integer>();
     List<TaskEntry> entries = taskClient.getTaskEntries();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/StopDS.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/StopDS.java
index 1688b52..92fb334 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/StopDS.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/StopDS.java
@@ -40,11 +40,12 @@
 import javax.net.ssl.SSLException;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.admin.AdministrationConnector;
 import org.opends.server.controls.ProxiedAuthV2Control;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
-import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.ldap.AddRequestProtocolOp;
 import org.opends.server.protocols.ldap.AddResponseProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
@@ -56,7 +57,6 @@
 import org.opends.server.tools.tasks.TaskTool;
 import org.opends.server.types.*;
 import org.opends.server.util.args.LDAPConnectionArgumentParser;
-import org.forgerock.opendj.ldap.ByteString;
 
 import com.forgerock.opendj.cli.Argument;
 import com.forgerock.opendj.cli.ArgumentException;
@@ -708,17 +708,17 @@
         return LDAPResultCode.CLIENT_SIDE_SERVER_DOWN;
       }
     }
-    catch (IOException ioe)
-    {
-      err.println(wrapText(ERR_STOPDS_IO_ERROR.get(ioe), MAX_LINE_WIDTH));
-      return LDAPResultCode.CLIENT_SIDE_SERVER_DOWN;
-    }
-    catch (ASN1Exception ae)
+    catch (DecodeException ae)
     {
       LocalizableMessage message = ERR_STOPDS_DECODE_ERROR.get(ae.getMessage());
       err.println(wrapText(message, MAX_LINE_WIDTH));
       return LDAPResultCode.CLIENT_SIDE_DECODING_ERROR;
     }
+    catch (IOException ioe)
+    {
+      err.println(wrapText(ERR_STOPDS_IO_ERROR.get(ioe), MAX_LINE_WIDTH));
+      return LDAPResultCode.CLIENT_SIDE_SERVER_DOWN;
+    }
     catch (LDAPException le)
     {
       LocalizableMessage message = ERR_STOPDS_DECODE_ERROR.get(le.getMessage());
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskClient.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskClient.java
index 7299cda..91de469 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskClient.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskClient.java
@@ -45,7 +45,7 @@
 import org.opends.server.backends.task.FailedDependencyAction;
 import org.opends.server.backends.task.TaskState;
 import org.opends.server.config.ConfigConstants;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.ldap.AddRequestProtocolOp;
 import org.opends.server.protocols.ldap.AddResponseProtocolOp;
 import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
@@ -300,11 +300,11 @@
    * @throws IOException if there is a stream communication problem
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    * @throws TaskClientException if there is a problem with the task entry
    */
   public synchronized TaskEntry schedule(TaskScheduleInformation information)
-          throws LDAPException, IOException, ASN1Exception, TaskClientException
+          throws LDAPException, IOException, DecodeException, TaskClientException
   {
     LDAPReader reader = connection.getLDAPReader();
     LDAPWriter writer = connection.getLDAPWriter();
@@ -356,10 +356,10 @@
    * @throws IOException if there is a stream communication problem
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    */
   public synchronized List<TaskEntry> getTaskEntries()
-          throws LDAPException, IOException, ASN1Exception {
+          throws LDAPException, IOException, DecodeException {
     List<Entry> entries = new ArrayList<Entry>();
 
     writeSearch(new SearchRequestProtocolOp(
@@ -406,11 +406,11 @@
    * @throws IOException if there is a stream communication problem
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    * @throws TaskClientException if there is no task with the requested id
    */
   public synchronized TaskEntry getTaskEntry(String id)
-          throws LDAPException, IOException, ASN1Exception, TaskClientException
+          throws LDAPException, IOException, DecodeException, TaskClientException
   {
     Entry entry = null;
 
@@ -455,11 +455,11 @@
    * @throws IOException if there is a stream communication problem
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
-   * @throws ASN1Exception if there is a problem with the encoding
+   * @throws DecodeException if there is a problem with the encoding
    * @throws TaskClientException if there is no task with the requested id
    */
   public synchronized void cancelTask(String id)
-          throws TaskClientException, IOException, ASN1Exception, LDAPException
+          throws TaskClientException, IOException, DecodeException, LDAPException
   {
     LDAPReader reader = connection.getLDAPReader();
     LDAPWriter writer = connection.getLDAPWriter();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskTool.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskTool.java
index d0deb88..4f814ba 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskTool.java
@@ -24,7 +24,6 @@
  *      Copyright 2007-2010 Sun Microsystems, Inc.
  *      Portions Copyright 2012-2014 ForgeRock AS
  */
-
 package org.opends.server.tools.tasks;
 
 import com.forgerock.opendj.cli.Argument;
@@ -38,7 +37,7 @@
 import static org.opends.server.util.StaticUtils.getExceptionMessage;
 import static org.opends.server.util.ServerConstants.MAX_LINE_WIDTH;
 
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.tools.LDAPConnection;
 import org.opends.server.tools.LDAPConnectionException;
 
@@ -369,12 +368,12 @@
         }
         if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
         ret = 1;
-      } catch (IOException ioe) {
-        LocalizableMessage message = ERR_TASK_TOOL_IO_ERROR.get(ioe);
+      } catch (DecodeException ae) {
+        LocalizableMessage message = ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage());
         if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
         ret = 1;
-      } catch (ASN1Exception ae) {
-        LocalizableMessage message = ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage());
+      } catch (IOException ioe) {
+        LocalizableMessage message = ERR_TASK_TOOL_IO_ERROR.get(ioe);
         if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
         ret = 1;
       } catch (LDAPException le) {
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/Control.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/Control.java
index fad8121..7f2b75b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/Control.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/Control.java
@@ -22,10 +22,11 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.types;
 
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 
 import java.io.IOException;
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawAttribute.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawAttribute.java
index 7ba50ed..f783c7a 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawAttribute.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawAttribute.java
@@ -37,8 +37,8 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 
 /**
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawFilter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawFilter.java
index 29a829d..291a9dd 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawFilter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawFilter.java
@@ -35,7 +35,7 @@
 import java.io.IOException;
 
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.protocols.ldap.LDAPFilter;
 
 import static org.opends.messages.ProtocolMessages.*;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawModification.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawModification.java
index ca52a83..0a58983 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawModification.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/types/RawModification.java
@@ -36,8 +36,8 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.LDAPModification;
 
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index 2bb0252..9fb8fef 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -56,9 +56,9 @@
 import org.opends.server.extensions.ConfigFileHandler;
 import org.opends.server.loggers.*;
 import org.opends.server.plugins.InvocationCounterPlugin;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.BindRequestProtocolOp;
 import org.opends.server.protocols.ldap.BindResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ExternalChangelogControlTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ExternalChangelogControlTest.java
index 34c63e7..803dcd2 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ExternalChangelogControlTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ExternalChangelogControlTest.java
@@ -26,8 +26,8 @@
  */
 package org.opends.server.controls;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.protocols.ldap.LDAPReader;
 import org.opends.server.replication.common.MultiDomainServerState;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/MatchedValuesControlTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/MatchedValuesControlTest.java
index 8ca62ba..4620d04 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/MatchedValuesControlTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/MatchedValuesControlTest.java
@@ -40,8 +40,8 @@
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
 import org.opends.server.util.Base64;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordControlTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordControlTest.java
index e92479c..525a273 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordControlTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PasswordControlTest.java
@@ -36,8 +36,8 @@
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.protocols.ldap.LDAPReader;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
index 902e236..f5c7ae9 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/PersistentSearchControlTest.java
@@ -31,8 +31,8 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.core.ModifyOperation;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.LDAPAttribute;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV1ControlTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV1ControlTestCase.java
index 1e1833d..bd1aa02 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV1ControlTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV1ControlTestCase.java
@@ -33,8 +33,8 @@
 
 import org.opends.server.TestCaseUtils;
 import org.opends.server.protocols.ldap.LDAPControl;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV2ControlTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV2ControlTestCase.java
index 62559cf..6673ee8 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV2ControlTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/ProxiedAuthV2ControlTestCase.java
@@ -33,8 +33,8 @@
 
 import org.opends.server.TestCaseUtils;
 import org.opends.server.protocols.ldap.LDAPControl;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/VLVControlTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/VLVControlTestCase.java
index 84969fb..33d1323 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/VLVControlTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/controls/VLVControlTestCase.java
@@ -28,12 +28,8 @@
 
 
 
-import static org.opends.server.util.ServerConstants.OID_SERVER_SIDE_SORT_RESPONSE_CONTROL;
-import static org.opends.server.util.ServerConstants.OID_VLV_RESPONSE_CONTROL;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.fail;
+import static org.opends.server.util.ServerConstants.*;
+import static org.testng.Assert.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -44,10 +40,9 @@
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.protocols.ldap.LDAPControl;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Constants;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -406,22 +401,22 @@
 
     ASN1Reader reader = ASN1.getReader(builder.toByteString());
     // Should start as an octet string with a nested sequence
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     reader.readStartSequence();
     // Should be an sequence start
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_SEQUENCE_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_SEQUENCE_TYPE);
     reader.readStartSequence();
     // Should be an integer with targetPosition
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_INTEGER_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_INTEGER_TYPE);
     assertEquals(reader.readInteger(), 0);
     // Should be an integer with contentCount
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_INTEGER_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_INTEGER_TYPE);
     assertEquals(reader.readInteger(), 15);
     // Should be an enumerated with virtualListViewResult
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_ENUMERATED_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_ENUMERATED_TYPE);
     assertEquals(reader.readEnumerated(), 0);
     // Should be an octet string with contextID
-    assertEquals(reader.peekType(), ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE);
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     assertEquals(reader.readOctetStringAsString(), "foo");
   }
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
index 9c1afe0..4d03a27 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
@@ -38,7 +38,7 @@
 import org.opends.server.controls.MatchedValuesFilter;
 import org.opends.server.controls.SubentriesControl;
 import org.opends.server.plugins.InvocationCounterPlugin;
-import org.opends.server.protocols.asn1.ASN1Exception;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.*;
@@ -347,7 +347,7 @@
   }
 
   private void bindAsManager(LDAPWriter w, org.opends.server.tools.LDAPReader r)
-       throws IOException, LDAPException, ASN1Exception, InterruptedException
+       throws IOException, LDAPException, DecodeException, InterruptedException
   {
     // Since we are going to be watching the post-response count, we need to
     // wait for the server to become idle before kicking off the next request to
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java
index d8aba45..11b39fe 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java
@@ -40,8 +40,8 @@
 import org.opends.server.TestCaseUtils;
 import org.opends.server.core.AddOperation;
 import org.opends.server.plugins.DelayPreOpPlugin;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.ldap.AddRequestProtocolOp;
 import org.opends.server.protocols.ldap.AddResponseProtocolOp;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
index 9fa91e1..d6bc716 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/LDAPPassThroughAuthenticationPolicyTestCase.java
@@ -49,8 +49,8 @@
 import org.opends.server.extensions.LDAPPassThroughAuthenticationPolicyFactory.ConnectionFactory;
 import org.opends.server.extensions.LDAPPassThroughAuthenticationPolicyFactory.ConnectionPool;
 import org.opends.server.extensions.LDAPPassThroughAuthenticationPolicyFactory.LDAPConnectionFactory;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.ldap.*;
 import org.opends.server.schema.DirectoryStringSyntax;
 import org.opends.server.schema.GeneralizedTimeSyntax;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
index 2349fdf..7e4d8b3 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordModifyExtendedOperationTestCase.java
@@ -46,8 +46,8 @@
 import org.opends.server.core.ExtendedOperation;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.protocols.internal.InternalClientConnection;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.tools.LDAPPasswordModify;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
index 4820b12..44d8310 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
@@ -40,15 +40,13 @@
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.config.ConfigException;
 import org.opends.server.controls.ControlDecoder;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.operation.*;
 
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
-
 /**
  * This class defines a very simple pre-operation plugin that sleeps for up to
  * five seconds for add, compare, delete, extended, modify, modify DN, and
@@ -141,7 +139,7 @@
      */
     @Override
     protected void writeValue(ASN1Writer writer) throws IOException {
-      writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+      writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
       writer.writeInteger(delayDuration);
       writer.writeEndSequence();
     }
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
index 59e671b..d489271 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
@@ -42,7 +42,7 @@
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.config.ConfigException;
 import org.opends.server.controls.ControlDecoder;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.CanceledOperationException;
 import org.opends.server.types.Control;
 import org.opends.server.types.DirectoryException;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/SambaPasswordPluginTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/SambaPasswordPluginTestCase.java
index 86a7dc1..3fb9b8d 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/SambaPasswordPluginTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/SambaPasswordPluginTestCase.java
@@ -46,8 +46,8 @@
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.extensions.ExtensionsConstants;
 import org.opends.server.plugins.SambaPasswordPlugin.TimeStampProvider;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
index 754b435..7bc0247 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
@@ -42,16 +42,13 @@
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.config.ConfigException;
 import org.opends.server.controls.ControlDecoder;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.types.operation.*;
 
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
-
-
 /**
  * This class defines a very simple plugin that causes request processing to end
  * immediately and send a specific result code to the client.  It will be
@@ -153,7 +150,7 @@
      */
     @Override
     protected void writeValue(ASN1Writer writer) throws IOException {
-      writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+      writer.writeStartSequence(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
       writer.writeStartSequence();
       writer.writeInteger(resultCode);
       writer.writeOctetString(section);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReaderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReaderTestCase.java
new file mode 100644
index 0000000..4ec6bbd
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ByteChannelReaderTestCase.java
@@ -0,0 +1,304 @@
+/*
+ * 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 legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * 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 legal-notices/CDDLv1_0.txt.
+ * 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
+ *
+ *
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
+ */
+package org.opends.server.protocols.ldap;
+
+import org.forgerock.opendj.io.ASN1Reader;
+import org.opends.server.protocols.ldap.ASN1ByteChannelReader;
+import org.testng.annotations.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.channels.Channels;
+import java.nio.channels.IllegalBlockingModeException;
+
+/**
+ * Test class for ASN1ByteChannelReader
+ */
+public class ASN1ByteChannelReaderTestCase extends ASN1ReaderTestCase
+{
+  @Override
+  ASN1Reader getReader(byte[] b, int maxElementSize) throws IOException
+  {
+    ByteArrayInputStream inStream = new ByteArrayInputStream(b);
+    ASN1ByteChannelReader reader =
+        new ASN1ByteChannelReader(Channels.newChannel(inStream),
+            b.length, maxElementSize);
+    reader.processChannelData();
+    return reader;
+  }
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsNull()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsNull();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsInteger()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsInteger();
+  }
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsEnumerated()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsEnumerated();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsBoolean()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsBoolean();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions  = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsOctetString()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsOctetString();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeShortArrayAsSequence()
+      throws Exception
+  {
+    super.testDecodeShortArrayAsSequence();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that has less bytes than indicated by the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeLengthMismatchArrayAsBoolean()
+      throws Exception
+  {
+    super.testDecodeLengthMismatchArrayAsBoolean();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a length mismatch.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeLengthMismatchArrayAsInteger()
+      throws Exception
+  {
+    super.testDecodeLengthMismatchArrayAsInteger();
+  }
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a length mismatch.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeLengthMismatchArrayAsEnumerated()
+      throws Exception
+  {
+    super.testDecodeLengthMismatchArrayAsEnumerated();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using an array whose actual length doesn't match with the decoded length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions  = { IllegalBlockingModeException.class })
+  public void testDecodeLengthMismatchArrayAsOctetString()
+      throws Exception
+  {
+    super.testDecodeLengthMismatchArrayAsOctetString();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that doesn't contain a full length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsBoolean()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsBoolean();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a truncated length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsInteger()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsInteger();
+  }
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a truncated length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsEnumerated()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsEnumerated();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an array with a truncated length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsNull()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsNull();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using an array that doesn't fully contain the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions  = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsOctetString()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsOctetString();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with an array that doesn't fully describe the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeTruncatedLengthArrayAsSequence()
+      throws Exception
+  {
+    super.testDecodeTruncatedLengthArrayAsSequence();
+  }
+
+  /**
+   * Tests to make sure a premature EOF while reading a sub sequence can be
+   * detected.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testDecodeSequencePrematureEof()
+      throws Exception
+  {
+    super.testDecodeSequencePrematureEof();
+  }
+
+  /**
+   * Tests the <CODE>skipElement</CODE> method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Override
+  @Test(expectedExceptions = { IllegalBlockingModeException.class })
+  public void testSkipElementIncompleteRead()
+      throws Exception
+  {
+    super.testSkipElementIncompleteRead();
+  }
+}
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ReaderTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ReaderTestCase.java
new file mode 100644
index 0000000..994a9f6
--- /dev/null
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/ASN1ReaderTestCase.java
@@ -0,0 +1,853 @@
+/*
+ * 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 legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * 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 legal-notices/CDDLv1_0.txt.
+ * 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
+ *
+ *
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
+ */
+package org.opends.server.protocols.ldap;
+
+import java.io.IOException;
+
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.opends.server.DirectoryServerTestCase;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+/**
+ * An abstract base class for all ASN1Reader test cases.
+ */
+@Test(groups = { "precommit", "asn1" }, sequential = true)
+public abstract class ASN1ReaderTestCase extends DirectoryServerTestCase
+{
+
+  /**
+   * Retrieves the set of byte array values that may be used for testing.
+   *
+   * @return  The set of byte array values that may be used for testing.
+   */
+  @DataProvider(name = "byteValues")
+  public Object[][] getByteValues()
+  {
+    Object[][] array = new Object[256][1];
+    for (int i=0; i < 256; i++)
+    {
+      array[i] = new Object[] { new byte[] { (byte) (i & 0xFF) } };
+    }
+
+    return array;
+  }
+
+
+
+  /**
+   * Create byte arrays with encoded ASN.1 elements to test decoding them as
+   * octet strings.
+   *
+   * @return  A list of byte arrays with encoded ASN.1 elements that can be
+   *          decoded as octet strings.
+   */
+  @DataProvider(name = "elementArrays")
+  public Object[][] getElementArrays()
+  {
+    return new Object[][]
+        {
+            new Object[] { new byte[] { 0x04, 0x00 } },
+            new Object[] { new byte[] { (byte) 0x50, 0x00 } },
+            new Object[] { new byte[] { 0x04, 0x05, 0x48, 0x65, 0x6C, 0x6C, 0x6F } },
+            new Object[] { new byte[] { 0x01, 0x01, 0x00 } },
+            new Object[] { new byte[] { 0x01, 0x01, (byte) 0xFF } },
+            new Object[] { new byte[] { 0x0A, 0x01, 0x00 } },
+            new Object[] { new byte[] { 0x0A, 0x01, 0x01 } },
+            new Object[] { new byte[] { 0x0A, 0x01, 0x7F } },
+            new Object[] { new byte[] { 0x0A, 0x01, (byte) 0x80 } },
+            new Object[] { new byte[] { 0x0A, 0x01, (byte) 0xFF } },
+            new Object[] { new byte[] { 0x0A, 0x02, 0x01, 0x00 } },
+            new Object[] { new byte[] { 0x02, 0x01, 0x00 } },
+            new Object[] { new byte[] { 0x02, 0x01, 0x01 } },
+            new Object[] { new byte[] { 0x02, 0x01, 0x7F } },
+            new Object[] { new byte[] { 0x02, 0x02, 0x00, (byte) 0x80 } },
+            new Object[] { new byte[] { 0x02, 0x02, 0x00, (byte) 0xFF } },
+            new Object[] { new byte[] { 0x02, 0x02, 0x01, 0x00 } },
+            new Object[] { new byte[] { 0x05, 0x00 } },
+            new Object[] { new byte[] { 0x30, 0x00 } },
+            new Object[] { new byte[] { 0x31, 0x00 } },
+            new Object[] { new byte[] { 0x05, (byte) 0x81, 0x00 } },
+            new Object[] { new byte[] { 0x05, (byte) 0x82, 0x00, 0x00 } },
+            new Object[] { new byte[] { 0x05, (byte) 0x83, 0x00, 0x00, 0x00 } },
+            new Object[] { new byte[] { 0x05, (byte) 0x84, 0x00, 0x00, 0x00, 0x00 } },
+        };
+  }
+
+  /**
+   * Gets the reader to be use for the unit tests.
+   *
+   * @param b
+   *          The array of bytes to be read.
+   * @param maxElementSize
+   *          The max element size.
+   * @return The reader to be use for the unit tests.
+   * @throws IOException
+   *           In an unexpected IO exception occurred.
+   */
+  abstract ASN1Reader getReader(byte[] b, int maxElementSize)
+      throws IOException;
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[1];
+    getReader(b, 0).readNull();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an array with a long length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x05, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    getReader(b, 0).readNull();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an array with a truncated length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x05, (byte) 0x82, 0x00 };
+    getReader(b, 0).readNull();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an arry with a nonzero length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeNonZeroLengthArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x05, 0x01, 0x00 };
+    getReader(b, 0).readNull();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an arry with a zero length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test()
+  public void testDecodeZeroLengthArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x05, 0x00 };
+    getReader(b, 0).readNull();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsNull</CODE> method that takes a byte array argument
+   * with an arry with a zero length that takes multiple bytes to encode.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test()
+  public void testDecodeExtendedZeroLengthArrayAsNull()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x05, (byte) 0x81, 0x00 };
+    getReader(b, 0).readNull();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortArrayAsInteger()
+      throws Exception
+  {
+    byte[] b = new byte[0];
+    getReader(b, 0).readInteger();
+  }
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortArrayAsEnumerated()
+      throws Exception
+  {
+    byte[] b = new byte[0];
+    getReader(b, 0).readEnumerated();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a long length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsInteger()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 };
+    getReader(b, 0).readInteger();
+  }
+
+
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a long length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsEnumerated()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 };
+    getReader(b, 0).readEnumerated();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a truncated length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsInteger()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x82, 0x00 };
+    getReader(b, 0).readInteger();
+  }
+
+
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a truncated length array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsEnumerated()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x82, 0x00 };
+    getReader(b, 0).readEnumerated();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsInteger</CODE> method that takes a byte array with
+   * a length mismatch.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLengthMismatchArrayAsInteger()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x81, 0x01 };
+    getReader(b, 0).readInteger();
+  }
+
+  /**
+   * Tests the <CODE>readEnumerated</CODE> method that takes a byte array with
+   * a length mismatch.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLengthMismatchArrayAsEnumerated()
+      throws Exception
+  {
+    byte[] b = { 0x02, (byte) 0x81, 0x01 };
+    getReader(b, 0).readEnumerated();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with valid arrays.
+   *
+   * @param  b  The byte array to use for the element values.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "byteValues")
+  public void testDecodeValidArrayAsBoolean(byte[] b)
+      throws Exception
+  {
+    // First, test with the standard Boolean type.
+    byte[] elementArray = new byte[] { 0x01, 0x01, b[0] };
+    assertEquals(getReader(elementArray, 0).readBoolean(), (b[0] != 0x00));
+
+
+    // Next, test with a nonstandard Boolean type.
+    elementArray[0] = (byte) 0x50;
+    assertEquals(getReader(elementArray, 0).readBoolean(), (b[0] != 0x00));
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with valid arrays using extended lengths.
+   *
+   * @param  b  The byte array to use for the element values.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "byteValues")
+  public void testDecodeValidExtendedArrayAsBoolean(byte[] b)
+      throws Exception
+  {
+    // First, test with the standard Boolean type.
+    byte[] elementArray = new byte[] { 0x01, (byte) 0x81, 0x01, b[0] };
+    assertEquals(getReader(elementArray, 0).readBoolean(), (b[0] != 0x00));
+
+
+    // Next, test with a nonstandard Boolean type.
+    elementArray[0] = (byte) 0x50;
+    assertEquals(getReader(elementArray, 0).readBoolean(), (b[0] != 0x00));
+  }
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = new byte[1];
+    getReader(b, 0).readBoolean();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that takes too many bytes to expressthe length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = { 0x01, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 };
+    getReader(b, 0).readBoolean();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that doesn't contain a full length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = { 0x01, (byte) 0x82, 0x00 };
+    getReader(b, 0).readBoolean();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that has less bytes than indicated by the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLengthMismatchArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = { 0x01, 0x01 };
+    getReader(b, 0).readBoolean();
+  }
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that has an invalid number of bytes in the value.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortValueArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = { 0x01, 0x00, 0x00, 0x00 };
+    getReader(b, 0).readBoolean();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsBoolean</CODE> method that takes a byte array
+   * argument with an array that has an invalid number of bytes in the value.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongValueArrayAsBoolean()
+      throws Exception
+  {
+    byte[] b = { 0x01, 0x02, 0x00, 0x00 };
+    getReader(b, 0).readBoolean();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using a valid array.
+   *
+   * @param  b  The byte array to decode.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "elementArrays")
+  public void testDecodeValidArrayAsOctetString(byte[] b)
+      throws Exception
+  {
+    ByteStringBuilder bsb = new ByteStringBuilder();
+    bsb.append(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+    bsb.appendBERLength(b.length);
+    bsb.append(b);
+
+    assertEquals(getReader(bsb.toByteArray(), 0).readOctetString(),
+        ByteString.wrap(b));
+  }
+
+  /**
+   * Tests the <CODE>decodeAsOctetStringAsString</CODE> method that takes a
+   * byte array using a valid array.
+   *
+   * @param  b  The byte array to decode.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "elementArrays")
+  public void testDecodeValidArrayAsOctetStringAsString(byte[] b)
+      throws Exception
+  {
+    ByteStringBuilder bsb = new ByteStringBuilder();
+    bsb.append(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+    bsb.appendBERLength(b.length);
+    bsb.append(b);
+
+    assertEquals(getReader(bsb.toByteArray(), 0).readOctetStringAsString(),
+        new String(b, "UTF-8"));
+  }
+
+  /**
+   * Tests the <CODE>decodeAsOctetStringBuilder</CODE> method that takes a
+   * byte array using a valid array.
+   *
+   * @param  b  The byte array to decode.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "elementArrays")
+  public void testDecodeValidArrayAsOctetStringBuilder(byte[] b)
+      throws Exception
+  {
+    ByteStringBuilder bsb = new ByteStringBuilder();
+    bsb.append(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+    bsb.appendBERLength(b.length);
+    bsb.append(b);
+
+    ByteStringBuilder bsb2 = new ByteStringBuilder();
+    getReader(bsb.toByteArray(), 0).readOctetString(bsb2);
+    assertEquals(bsb2.toByteString(), ByteString.wrap(b));
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions  = { DecodeException.class })
+  public void testDecodeShortArrayAsOctetString()
+      throws Exception
+  {
+    byte[] b = new byte[1];
+    getReader(b, 0).readOctetString();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using an array that indicates it takes more than four bytes to encode the
+   * length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions  = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsOctetString()
+      throws Exception
+  {
+    byte[] b = { 0x04, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    getReader(b, 0).readOctetString();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using an array that doesn't fully contain the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions  = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsOctetString()
+      throws Exception
+  {
+    byte[] b = { 0x04, (byte) 0x82, 0x00 };
+    getReader(b, 0).readOctetString();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsOctetString</CODE> method that takes a byte array
+   * using an array whose actual length doesn't match with the decoded length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions  = { DecodeException.class })
+  public void testDecodeLengthMismatchArrayAsOctetString()
+      throws Exception
+  {
+    byte[] b = { 0x04, 0x02, 0x00 };
+    getReader(b, 0).readOctetString();
+  }
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with valid arrays.
+   *
+   * @param  encodedElements  Byte arrays that may be used as valid values for
+   *                          encoded elements.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "elementArrays")
+  public void testDecodeValidArrayAsSequence(byte[] encodedElements)
+      throws Exception
+  {
+    ByteStringBuilder bsb = new ByteStringBuilder();
+    bsb.append(ASN1.UNIVERSAL_SEQUENCE_TYPE);
+    bsb.appendBERLength(encodedElements.length + 2);
+    bsb.append(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+    bsb.appendBERLength(encodedElements.length);
+    bsb.append(encodedElements);
+
+    ASN1Reader reader = getReader(bsb.toByteArray(), 0);
+    assertEquals(reader.peekLength(), encodedElements.length + 2);
+    reader.readStartSequence();
+    assertEquals(reader.peekType(), ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+    assertEquals(reader.peekLength(), encodedElements.length);
+    reader.readOctetString().equals(ByteString.wrap(encodedElements));
+    reader.readEndSequence();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with a short array.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeShortArrayAsSequence()
+      throws Exception
+  {
+    byte[] b = new byte[1];
+    getReader(b, 0).readStartSequence();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with an array that takes too many bytes to encode the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeLongLengthArrayAsSequence()
+      throws Exception
+  {
+    byte[] b = { 0x30, (byte) 0x85, 0x00, 0x00, 0x00, 0x00, 0x00 };
+    getReader(b, 0).readStartSequence();
+  }
+
+
+
+  /**
+   * Tests the <CODE>decodeAsSequence</CODE> method that takes a byte array
+   * argument with an array that doesn't fully describe the length.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeTruncatedLengthArrayAsSequence()
+      throws Exception
+  {
+    byte[] b = { 0x30, (byte) 0x82, 0x00 };
+    getReader(b, 0).readStartSequence();
+  }
+
+
+
+  /**
+   * Tests the <CODE>readOctetString</CODE> method when the max element size
+   * is exceeded.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeOctetStringExceedMaxSize()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x04, 0x05, 0x48, 0x65, 0x6C, 0x6C, 0x6F };
+    getReader(b, 3).readOctetString();
+  }
+
+  /**
+   * Tests the <CODE>readOctetString</CODE> method when the max element size
+   * is exceeded.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeSequenceExceedMaxSize()
+      throws Exception
+  {
+    byte[] b = new byte[] { 0x30, 0x07, 0x04, 0x05, 0x48, 0x65, 0x6C, 0x6C, 0x6F };
+    getReader(b, 3).readOctetString();
+  }
+
+  /**
+   * Tests to make sure a premature EOF while reading a sub sequence can be
+   * detected.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testDecodeSequencePrematureEof()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x09, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00 };
+    ASN1Reader reader = getReader(b, 0);
+    reader.readStartSequence();
+    while(reader.hasNextElement())
+    {
+      reader.readBoolean();
+    }
+    reader.readEndSequence();
+  }
+
+  /**
+   * Tests to make sure trailing components are ignored if not used.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test
+  public void testDecodeSequenceIncompleteRead()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 };
+    ASN1Reader reader = getReader(b, 0);
+    reader.readStartSequence();
+    reader.readEndSequence();
+    assertFalse(reader.readBoolean());
+  }
+
+  /**
+   * Tests the <CODE>skipElement</CODE> method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { DecodeException.class })
+  public void testSkipElementIncompleteRead()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x09, 0x01, 0x01, 0x00, 0x01, 0x02 };
+    ASN1Reader reader = getReader(b, 0);
+    reader.readStartSequence();
+    reader.readBoolean();
+    reader.skipElement();
+    reader.readEndSequence();
+  }
+
+  /**
+   * Tests the <CODE>skipElement</CODE> method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test
+  public void testSkipElement()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x09, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01,
+        0x02, 0x01, 0x02 };
+    ASN1Reader reader = getReader(b, 0);
+    reader.readStartSequence();
+    reader.readInteger();
+    reader.skipElement();
+    assertEquals(reader.readInteger(), 2);
+    reader.readEndSequence();
+  }
+
+  /**
+   * Tests the <CODE>elementAvailable</CODE> method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test
+  public void testElementAvailable()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x06, 0x02, 0x01, 0x00, 0x02 };
+    ASN1Reader reader = getReader(b, 0);
+    assertFalse(reader.elementAvailable());
+
+    b = new byte[] { 0x30, 0x03, 0x02, 0x01, 0x00 };
+    reader = getReader(b, 0);
+    assertTrue(reader.elementAvailable());
+    reader.readStartSequence();
+    assertTrue(reader.elementAvailable());
+    reader.readInteger();
+    assertFalse(reader.elementAvailable());
+  }
+
+  /**
+   * Tests the <CODE>hasNextElement</CODE> method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test
+  public void testHasNextElement()
+      throws Exception
+  {
+    // An ASN.1 sequence of booleans missing one boolean element at the end
+    byte[] b = new byte[] { 0x30, 0x06, 0x02, 0x01, 0x00, 0x02, 0x00, 0x03 };
+    ASN1Reader reader = getReader(b, 0);
+    assertTrue(reader.hasNextElement());
+    reader.readStartSequence();
+    assertTrue(reader.hasNextElement());
+    reader.readInteger();
+    assertTrue(reader.hasNextElement());
+
+    b = new byte[] { 0x30, 0x03, 0x02, 0x01, 0x00 };
+    reader = getReader(b, 0);
+    assertTrue(reader.hasNextElement());
+    reader.readStartSequence();
+    assertTrue(reader.hasNextElement());
+    reader.readInteger();
+    assertFalse(reader.hasNextElement());
+  }
+
+  /**
+   * Tests the <CODE>readEndSequence</CODE> method without first calling
+   * readStartSequence.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(expectedExceptions = { IllegalStateException.class })
+  public void testReadEndSequenceNoStartSequence() throws Exception
+  {
+    byte[] b = { 0x30, 0x01, 0x00 };
+    getReader(b, 0).readEndSequence();
+  }
+}
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAbandonRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAbandonRequestProtocolOp.java
index 0930e2e..2886ddd 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAbandonRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAbandonRequestProtocolOp.java
@@ -30,9 +30,9 @@
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.testng.annotations.Test;
 import static org.opends.server.protocols.ldap.LDAPConstants.OP_TYPE_ABANDON_REQUEST;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1Reader;
 import static org.testng.Assert.*;
 
 public class
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddRequestProtocolOp.java
index 4e8e64d..4b2e342 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddRequestProtocolOp.java
@@ -34,9 +34,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.types.LDAPException;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddResponseProtocolOp.java
index 79ba5be..4cd5318 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestAddResponseProtocolOp.java
@@ -26,7 +26,7 @@
  */
 package org.opends.server.protocols.ldap;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import static org.opends.server.util.ServerConstants.EOL;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindRequestProtocolOp.java
index b11c288..fe5c625 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindRequestProtocolOp.java
@@ -31,9 +31,9 @@
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.testng.annotations.Test;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import static org.opends.server.util.ServerConstants.*;
 import static org.testng.Assert.*;
 //import org.testng.Reporter;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindResponseProtocolOp.java
index 726363f..f1b365a 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestBindResponseProtocolOp.java
@@ -32,9 +32,9 @@
 import org.opends.server.TestCaseUtils;
 import org.forgerock.i18n.LocalizableMessage;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareRequestProtocolOp.java
index 7f8c761..198b932 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareRequestProtocolOp.java
@@ -30,9 +30,9 @@
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import static org.opends.server.util.ServerConstants.EOL;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.testng.annotations.Test;
 import static org.testng.Assert.assertEquals;
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareResponseProtocolOp.java
index 3ee408e..d2af23b 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestCompareResponseProtocolOp.java
@@ -27,7 +27,7 @@
 package org.opends.server.protocols.ldap;
 
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import static org.opends.server.util.ServerConstants.EOL;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteRequestProtocolOp.java
index 473c7df..132ce6f 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteRequestProtocolOp.java
@@ -33,9 +33,9 @@
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import static org.opends.server.util.ServerConstants.EOL;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 
 /**
  * This class defines a set of tests for the
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteResponseProtocolOp.java
index 4584d89..c7147a3 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestDeleteResponseProtocolOp.java
@@ -28,7 +28,7 @@
 
 import static org.testng.Assert.*;
 import org.testng.annotations.*;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.core.DirectoryServer;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestLDAPFilter.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestLDAPFilter.java
index 9665d88..dd43f14 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestLDAPFilter.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestLDAPFilter.java
@@ -35,9 +35,9 @@
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.TestCaseUtils;
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 
 import static org.testng.Assert.*;
 
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNRequestProtocolOp.java
index 197e7ce..54a816c 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNRequestProtocolOp.java
@@ -26,7 +26,7 @@
  */
 package org.opends.server.protocols.ldap;
 
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import org.opends.server.types.LDAPException;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNResponseProtocolOp.java
index c7dd4b9..6ea1faf 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyDNResponseProtocolOp.java
@@ -29,7 +29,7 @@
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import static org.opends.server.util.ServerConstants.EOL;
 import org.opends.server.DirectoryServerTestCase;
 import org.forgerock.i18n.LocalizableMessage;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyRequestProtocolOp.java
index 73234da..92832c5 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyRequestProtocolOp.java
@@ -32,9 +32,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.types.LDAPException;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyResponseProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyResponseProtocolOp.java
index 6c4e266..52d207c 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyResponseProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestModifyResponseProtocolOp.java
@@ -29,7 +29,7 @@
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import static org.opends.server.util.ServerConstants.EOL;
 import org.forgerock.i18n.LocalizableMessage;
 import org.testng.annotations.BeforeClass;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
index 5f1ac1a..017301f 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchProtocolOp.java
@@ -32,8 +32,7 @@
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
-import org.opends.server.protocols.asn1.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE;
+import org.forgerock.opendj.io.*;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
 import static org.testng.Assert.*;
 
@@ -277,7 +276,7 @@
     ASN1Writer writer = ASN1.getWriter(builder);
     writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
     writer.writeOctetString(baseDN);
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeInteger(dereferencePolicy.intValue());
     writer.writeInteger(sizeLimit);
     writer.writeInteger(timeLimit);
@@ -305,7 +304,7 @@
     writer.writeStartSequence(OP_TYPE_SEARCH_REQUEST);
     writer.writeOctetString(baseDN);
     writer.writeInteger(scope.intValue());
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeInteger(sizeLimit);
     writer.writeInteger(timeLimit);
     writer.writeBoolean(typesOnly);
@@ -333,7 +332,7 @@
     writer.writeOctetString(baseDN);
     writer.writeInteger(scope.intValue());
     writer.writeInteger(dereferencePolicy.intValue());
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeInteger(timeLimit);
     writer.writeBoolean(typesOnly);
     filter.write(writer);
@@ -361,7 +360,7 @@
     writer.writeInteger(scope.intValue());
     writer.writeInteger(dereferencePolicy.intValue());
     writer.writeInteger(sizeLimit);
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     writer.writeBoolean(typesOnly);
     filter.write(writer);
 
@@ -389,7 +388,7 @@
     writer.writeInteger(dereferencePolicy.intValue());
     writer.writeInteger(sizeLimit);
     writer.writeInteger(timeLimit);
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
     filter.write(writer);
 
     writer.writeStartSequence();
@@ -417,7 +416,7 @@
     writer.writeInteger(sizeLimit);
     writer.writeInteger(timeLimit);
     writer.writeBoolean(typesOnly);
-    writer.writeNull(UNIVERSAL_OCTET_STRING_TYPE);
+    writer.writeNull(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
 
     writer.writeStartSequence();
     for(String attribute : attributes)
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchResultEntryProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchResultEntryProtocolOp.java
index 996e4be..6858eb0 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchResultEntryProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestSearchResultEntryProtocolOp.java
@@ -31,7 +31,7 @@
 import org.opends.server.types.*;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.opends.server.TestCaseUtils;
-import org.opends.server.protocols.asn1.*;
+import org.forgerock.opendj.io.*;
 import static org.opends.server.protocols.ldap.LDAPConstants.
      OP_TYPE_SEARCH_RESULT_ENTRY;
 import static org.testng.Assert.*;
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestUnbindRequestProtocolOp.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestUnbindRequestProtocolOp.java
index da639d7..4924299 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestUnbindRequestProtocolOp.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/protocols/ldap/TestUnbindRequestProtocolOp.java
@@ -26,9 +26,9 @@
  */
 package org.opends.server.protocols.ldap;
 
-import org.opends.server.protocols.asn1.ASN1Writer;
-import org.opends.server.protocols.asn1.ASN1;
-import org.opends.server.protocols.asn1.ASN1Reader;
+import org.forgerock.opendj.io.ASN1Writer;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.testng.annotations.Test;
 import static org.testng.Assert.*;

--
Gitblit v1.10.0