From 98a5df3565beaa1999020a16fcb5338d13d5b50f Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 26 Aug 2014 08:11:29 +0000
Subject: [PATCH] Removed useless getChangeNumber() and setChangeNumber methods from *Operation interfaces. These methods are useless because setChangeNumber() is never set inside production code, so changeNumber is always equal to -1 for all the update operations. In addition it is very unlikely the ChangeNumberIndexer could have computed the changeNumber before a results are sent to a persistent search.

---
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java   |  402 +++-----
 opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java          |  347 +-----
 opends/src/server/org/opends/server/core/AddOperationBasis.java                                     |  147 --
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java |  136 -
 opends/src/server/org/opends/server/core/DeleteOperationWrapper.java                                |   46 
 opends/src/server/org/opends/server/core/PersistentSearch.java                                      |  512 ++--------
 opends/src/server/org/opends/server/core/DeleteOperationBasis.java                                  |   73 -
 opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java                                |  159 --
 opends/src/server/org/opends/server/core/ModifyOperationBasis.java                                  |  107 -
 opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java       |   87 -
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java      |  191 +--
 opends/src/server/org/opends/server/core/ModifyOperationWrapper.java                                |   65 -
 opends/src/server/org/opends/server/core/ModifyDNOperationWrapper.java                              |   90 -
 opends/src/server/org/opends/server/core/AddOperation.java                                          |   50 
 opends/src/server/org/opends/server/core/ModifyDNOperation.java                                     |   57 
 opends/src/server/org/opends/server/core/ModifyOperation.java                                       |   41 
 opends/src/server/org/opends/server/core/AddOperationWrapper.java                                   |   85 -
 opends/src/server/org/opends/server/replication/server/ECLServerWriter.java                         |   53 
 opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java       |   56 
 opends/src/server/org/opends/server/core/DeleteOperation.java                                       |   29 
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java   |  103 -
 21 files changed, 765 insertions(+), 2,071 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/AddOperation.java b/opends/src/server/org/opends/server/core/AddOperation.java
index fd208ab..9b3fdfc 100644
--- a/opends/src/server/org/opends/server/core/AddOperation.java
+++ b/opends/src/server/org/opends/server/core/AddOperation.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -44,7 +45,7 @@
    *
    * @return  The DN of the entry in a raw, unparsed form.
    */
-  public abstract ByteString getRawEntryDN();
+  ByteString getRawEntryDN();
 
   /**
    * Specifies the raw entry DN for the entry to add.  This should only be
@@ -55,7 +56,7 @@
    *
    * @param  rawEntryDN  The raw entry DN for the entry to add.
    */
-  public abstract void setRawEntryDN(ByteString rawEntryDN);
+  void setRawEntryDN(ByteString rawEntryDN);
 
   /**
    * Retrieves the DN of the entry to add.  This method should not be called
@@ -65,7 +66,7 @@
    * @return  The DN of the entry to add, or <CODE>null</CODE> if it has not yet
    *          been parsed from the raw DN.
    */
-  public abstract DN getEntryDN();
+  DN getEntryDN();
 
   /**
    * Retrieves the set of attributes in their raw, unparsed form as read from
@@ -76,7 +77,7 @@
    * @return  The set of attributes in their raw, unparsed form as read from the
    *          client request.
    */
-  public abstract List<RawAttribute> getRawAttributes();
+  List<RawAttribute> getRawAttributes();
 
   /**
    * Adds the provided attribute to the set of raw attributes for this add
@@ -85,7 +86,7 @@
    * @param  rawAttribute  The attribute to add to the set of raw attributes for
    *                       this add operation.
    */
-  public abstract void addRawAttribute(RawAttribute rawAttribute);
+  void addRawAttribute(RawAttribute rawAttribute);
 
   /**
    * Replaces the set of raw attributes for this add operation.  This should
@@ -93,7 +94,7 @@
    *
    * @param  rawAttributes  The set of raw attributes for this add operation.
    */
-  public abstract void setRawAttributes(List<RawAttribute> rawAttributes);
+  void setRawAttributes(List<RawAttribute> rawAttributes);
 
   /**
    * Retrieves the set of processed user attributes for the entry to add.  This
@@ -104,7 +105,7 @@
    * @return  The set of processed user attributes for the entry to add, or
    *          <CODE>null</CODE> if that information is not yet available.
    */
-  public abstract Map<AttributeType, List<Attribute>> getUserAttributes();
+  Map<AttributeType, List<Attribute>> getUserAttributes();
 
   /**
    * Sets the specified attribute in the entry to add, overwriting any existing
@@ -117,8 +118,7 @@
    * @param  attributeType  The attribute type for the attribute.
    * @param  attributeList  The attribute list for the provided attribute type.
    */
-  public abstract void setAttribute(AttributeType attributeType,
-      List<Attribute> attributeList);
+  void setAttribute(AttributeType attributeType, List<Attribute> attributeList);
 
   /**
    * Removes the specified attribute from the entry to add. This should only be
@@ -129,25 +129,7 @@
    *
    * @param  attributeType  The attribute tyep for the attribute to remove.
    */
-  public abstract void removeAttribute(AttributeType attributeType);
-
-  /**
-   * Retrieves the change number that has been assigned to this operation.
-   *
-   * @return  The change number that has been assigned to this operation, or -1
-   *          if none has been assigned yet or if there is no applicable
-   *          synchronization mechanism in place that uses change numbers.
-   */
-  public abstract long getChangeNumber();
-
-  /**
-   * Specifies the change number that has been assigned to this operation by the
-   * synchronization mechanism.
-   *
-   * @param  changeNumber  The change number that has been assigned to this
-   *                       operation by the synchronization mechanism.
-   */
-  public abstract void setChangeNumber(long changeNumber);
+  void removeAttribute(AttributeType attributeType);
 
   /**
    * Retrieves the set of processed objectclasses for the entry to add.  This
@@ -158,7 +140,7 @@
    * @return  The set of processed objectclasses for the entry to add, or
    *          <CODE>null</CODE> if that information is not yet available.
    */
-  public abstract Map<ObjectClass,String> getObjectClasses();
+  Map<ObjectClass, String> getObjectClasses();
 
   /**
    * Adds the provided objectclass to the entry to add.  This should only be
@@ -170,7 +152,7 @@
    * @param  objectClass  The objectclass to add to the entry.
    * @param  name         The name to use for the objectclass.
    */
-  public abstract void addObjectClass(ObjectClass objectClass, String name);
+  void addObjectClass(ObjectClass objectClass, String name);
 
   /**
    * Removes the provided objectclass from the entry to add.  This should only
@@ -181,7 +163,7 @@
    *
    * @param  objectClass  The objectclass to remove from the entry.
    */
-  public abstract void removeObjectClass(ObjectClass objectClass);
+  void removeObjectClass(ObjectClass objectClass);
 
   /**
    * Retrieves the set of processed operational attributes for the entry to add.
@@ -192,7 +174,7 @@
    * @return  The set of processed operational attributes for the entry to add,
    *          or <CODE>null</CODE> if that information is not yet available.
    */
-  public abstract Map<AttributeType,List<Attribute>> getOperationalAttributes();
+  Map<AttributeType, List<Attribute>> getOperationalAttributes();
 
   /**
    * Retrieves the proxied authorization DN for this operation if proxied
@@ -202,7 +184,7 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract DN getProxiedAuthorizationDN();
+  DN getProxiedAuthorizationDN();
 
   /**
    * Set the proxied authorization DN for this operation if proxied
@@ -213,6 +195,6 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
+  void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
 
 }
diff --git a/opends/src/server/org/opends/server/core/AddOperationBasis.java b/opends/src/server/org/opends/server/core/AddOperationBasis.java
index 47e9c81..c0dc435 100644
--- a/opends/src/server/org/opends/server/core/AddOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/AddOperationBasis.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions copyright 2013 ForgeRock AS
+ *      Portions copyright 2013-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -94,9 +94,6 @@
   /** The set of objectclasses for the entry to add. */
   private Map<ObjectClass,String> objectClasses;
 
-  /** The change number that has been assigned to this operation. */
-  private long changeNumber;
-
   /** The flag indicates if an LDAP error was reported. */
   private boolean ldapError;
 
@@ -132,7 +129,6 @@
     operationalAttributes = null;
     objectClasses         = null;
     proxiedAuthorizationDN = null;
-    changeNumber          = -1;
   }
 
 
@@ -198,22 +194,16 @@
     responseControls = new ArrayList<Control>();
     proxiedAuthorizationDN = null;
     cancelRequest    = null;
-    changeNumber     = -1;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawEntryDN()
   {
     return rawEntryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawEntryDN(ByteString rawEntryDN)
   {
@@ -222,10 +212,7 @@
     entryDN = null;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final DN getEntryDN()
   {
@@ -251,20 +238,14 @@
     return entryDN;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final List<RawAttribute> getRawAttributes()
   {
     return rawAttributes;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addRawAttribute(RawAttribute rawAttribute)
   {
@@ -275,10 +256,7 @@
     operationalAttributes = null;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawAttributes(List<RawAttribute> rawAttributes)
   {
@@ -289,11 +267,7 @@
     operationalAttributes = null;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final Map<ObjectClass,String> getObjectClasses()
   {
@@ -303,33 +277,21 @@
     return objectClasses;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addObjectClass(ObjectClass objectClass, String name)
   {
     objectClasses.put(objectClass, name);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void removeObjectClass(ObjectClass objectClass)
   {
     objectClasses.remove(objectClass);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final Map<AttributeType,List<Attribute>> getUserAttributes()
   {
@@ -339,10 +301,7 @@
     return userAttributes;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final Map<AttributeType,List<Attribute>> getOperationalAttributes()
   {
@@ -396,16 +355,11 @@
               attr = builder.toAttribute();
             }
           }
-          else
+          else if (attr.hasOption("binary"))
           {
             // binary option is not honored for non-BER-encodable attributes.
-            if(attr.hasOption("binary"))
-            {
-              throw new LDAPException(LDAPResultCode.UNDEFINED_ATTRIBUTE_TYPE,
-                      ERR_ADD_ATTR_IS_INVALID_OPTION.get(
-                      String.valueOf(entryDN),
-                      attr.getName()));
-            }
+            throw new LDAPException(LDAPResultCode.UNDEFINED_ATTRIBUTE_TYPE,
+                ERR_ADD_ATTR_IS_INVALID_OPTION.get(String.valueOf(entryDN), attr.getName()));
           }
 
           if (attrType.isObjectClassType())
@@ -486,9 +440,7 @@
     }
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setAttribute(AttributeType attributeType,
                                  List<Attribute> attributeList)
@@ -505,18 +457,14 @@
     }
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void removeAttribute(AttributeType attributeType)
   {
     getAttributes(attributeType.isOperational()).remove(attributeType);
   }
 
-  private Map<AttributeType, List<Attribute>> getAttributes(
-      boolean isOperational)
+  private Map<AttributeType, List<Attribute>> getAttributes(boolean isOperational)
   {
     if (isOperational)
     {
@@ -525,29 +473,7 @@
     return userAttributes;
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final long getChangeNumber()
-  {
-    return changeNumber;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final void setChangeNumber(long changeNumber)
-  {
-    this.changeNumber = changeNumber;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final OperationType getOperationType()
   {
@@ -557,52 +483,35 @@
     return OperationType.ADD;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ArrayList<Control> getResponseControls()
   {
     return responseControls;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addResponseControl(Control control)
   {
     responseControls.add(control);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void removeResponseControl(Control control)
   {
     responseControls.remove(control);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void toString(StringBuilder buffer)
   {
@@ -615,18 +524,14 @@
     buffer.append(")");
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN)
   {
     this.proxiedAuthorizationDN = proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void run()
   {
diff --git a/opends/src/server/org/opends/server/core/AddOperationWrapper.java b/opends/src/server/org/opends/server/core/AddOperationWrapper.java
index 585f567..d771fa6 100644
--- a/opends/src/server/org/opends/server/core/AddOperationWrapper.java
+++ b/opends/src/server/org/opends/server/core/AddOperationWrapper.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock AS
+ *      Portions Copyright 2013-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -31,7 +31,6 @@
 
 import org.opends.server.types.*;
 
-
 /**
  * This abstract class wraps/decorates a given add operation.
  * This class will be extended by sub-classes to enhance the
@@ -51,108 +50,77 @@
     super(add);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void addObjectClass(ObjectClass objectClass, String name)
   {
     getOperation().addObjectClass(objectClass, name);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void addRawAttribute(RawAttribute rawAttribute)
   {
     getOperation().addRawAttribute(rawAttribute);
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public long getChangeNumber()
-  {
-    return getOperation().getChangeNumber();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getEntryDN()
   {
     return getOperation().getEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Map<ObjectClass, String> getObjectClasses()
   {
     return getOperation().getObjectClasses();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Map<AttributeType, List<Attribute>> getOperationalAttributes()
   {
     return getOperation().getOperationalAttributes();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public List<RawAttribute> getRawAttributes()
   {
     return getOperation().getRawAttributes();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawEntryDN()
   {
     return getOperation().getRawEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Map<AttributeType, List<Attribute>> getUserAttributes()
   {
     return getOperation().getUserAttributes();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void removeAttribute(AttributeType attributeType)
   {
     getOperation().removeAttribute(attributeType);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void removeObjectClass(ObjectClass objectClass)
   {
     getOperation().removeObjectClass(objectClass);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setAttribute(AttributeType attributeType,
       List<Attribute> attributeList)
@@ -160,54 +128,35 @@
     getOperation().setAttribute(attributeType, attributeList);
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void setChangeNumber(long changeNumber)
-  {
-    getOperation().setChangeNumber(changeNumber);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawAttributes(List<RawAttribute> rawAttributes)
   {
     getOperation().setRawAttributes(rawAttributes);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawEntryDN(ByteString rawEntryDN)
   {
     getOperation().setRawEntryDN(rawEntryDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public String toString()
   {
     return getOperation().toString();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return getOperation().getProxiedAuthorizationDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN)
   {
diff --git a/opends/src/server/org/opends/server/core/DeleteOperation.java b/opends/src/server/org/opends/server/core/DeleteOperation.java
index 9fc6b21..a584877 100644
--- a/opends/src/server/org/opends/server/core/DeleteOperation.java
+++ b/opends/src/server/org/opends/server/core/DeleteOperation.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -43,7 +44,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public abstract ByteString getRawEntryDN();
+  ByteString getRawEntryDN();
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
@@ -53,7 +54,7 @@
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public abstract void setRawEntryDN(ByteString rawEntryDN);
+  void setRawEntryDN(ByteString rawEntryDN);
 
   /**
    * Retrieves the DN of the entry to delete.  This should not be called by
@@ -63,25 +64,7 @@
    * @return  The DN of the entry to delete, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public abstract DN getEntryDN();
-
-  /**
-   * Retrieves the change number that has been assigned to this operation.
-   *
-   * @return  The change number that has been assigned to this operation, or -1
-   *          if none has been assigned yet or if there is no applicable
-   *          synchronization mechanism in place that uses change numbers.
-   */
-  public abstract long getChangeNumber();
-
-  /**
-   * Specifies the change number that has been assigned to this operation by the
-   * synchronization mechanism.
-   *
-   * @param  changeNumber  The change number that has been assigned to this
-   *                       operation by the synchronization mechanism.
-   */
-  public abstract void setChangeNumber(long changeNumber);
+  DN getEntryDN();
 
   /**
    * Retrieves the proxied authorization DN for this operation if proxied
@@ -91,7 +74,7 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract DN getProxiedAuthorizationDN();
+  DN getProxiedAuthorizationDN();
 
   /**
    * Set the proxied authorization DN for this operation if proxied
@@ -102,7 +85,7 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
+  void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
 
 
 }
diff --git a/opends/src/server/org/opends/server/core/DeleteOperationBasis.java b/opends/src/server/org/opends/server/core/DeleteOperationBasis.java
index b71c619..9d16251 100644
--- a/opends/src/server/org/opends/server/core/DeleteOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/DeleteOperationBasis.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions copyright 2013 ForgeRock AS
+ *      Portions copyright 2013-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -41,7 +41,7 @@
 import org.opends.server.types.*;
 import org.opends.server.types.operation.PostResponseDeleteOperation;
 import org.opends.server.types.operation.PreParseDeleteOperation;
-import org.opends.server.workflowelement.localbackend.*;
+import org.opends.server.workflowelement.localbackend.LocalBackendDeleteOperation;
 
 /**
  * This class defines an operation that may be used to remove an entry from the
@@ -70,10 +70,6 @@
   /** The set of response controls for this delete operation. */
   private List<Control> responseControls;
 
-  /** The change number that has been assigned to this operation. */
-  private long changeNumber;
-
-
   /**
    * Creates a new delete operation with the provided information.
    *
@@ -99,7 +95,6 @@
     entryDN          = null;
     responseControls = new ArrayList<Control>();
     cancelRequest    = null;
-    changeNumber     = -1;
   }
 
 
@@ -128,21 +123,16 @@
     rawEntryDN       = ByteString.valueOf(entryDN.toString());
     responseControls = new ArrayList<Control>();
     cancelRequest    = null;
-    changeNumber     = -1;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawEntryDN()
   {
     return rawEntryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawEntryDN(ByteString rawEntryDN)
   {
@@ -151,9 +141,7 @@
     entryDN = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final DN getEntryDN()
   {
@@ -180,27 +168,7 @@
     return entryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final long getChangeNumber()
-  {
-    return changeNumber;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final void setChangeNumber(long changeNumber)
-  {
-    this.changeNumber = changeNumber;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   public final OperationType getOperationType()
   {
@@ -209,45 +177,35 @@
     return OperationType.DELETE;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   public final List<Control> getResponseControls()
   {
     return responseControls;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   public final void addResponseControl(Control control)
   {
     responseControls.add(control);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   public final void removeResponseControl(Control control)
   {
     responseControls.remove(control);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   public final void toString(StringBuilder buffer)
   {
@@ -259,18 +217,15 @@
     buffer.append(rawEntryDN);
     buffer.append(")");
   }
-  /**
-   * {@inheritDoc}
-   */
+
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN)
   {
     this.proxiedAuthorizationDN = proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void run()
   {
diff --git a/opends/src/server/org/opends/server/core/DeleteOperationWrapper.java b/opends/src/server/org/opends/server/core/DeleteOperationWrapper.java
index 9eaa17a..16c7cd4 100644
--- a/opends/src/server/org/opends/server/core/DeleteOperationWrapper.java
+++ b/opends/src/server/org/opends/server/core/DeleteOperationWrapper.java
@@ -22,15 +22,13 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock AS
+ *      Portions Copyright 2013-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
-
 import org.opends.server.types.ByteString;
 import org.opends.server.types.DN;
 
-
 /**
  * This abstract class wraps/decorates a given delete operation.
  * This class will be extended by sub-classes to enhance the
@@ -50,72 +48,42 @@
     super(delete);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getEntryDN()
   {
     return getOperation().getEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawEntryDN()
   {
     return getOperation().getRawEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawEntryDN(ByteString rawEntryDN)
   {
     getOperation().setRawEntryDN(rawEntryDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final long getChangeNumber()
-  {
-    return getOperation().getChangeNumber();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final void setChangeNumber(long changeNumber)
-  {
-    getOperation().setChangeNumber(changeNumber);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public String toString()
   {
     return getOperation().toString();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return getOperation().getProxiedAuthorizationDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN)
   {
diff --git a/opends/src/server/org/opends/server/core/ModifyDNOperation.java b/opends/src/server/org/opends/server/core/ModifyDNOperation.java
index 4b775ac..6195362 100644
--- a/opends/src/server/org/opends/server/core/ModifyDNOperation.java
+++ b/opends/src/server/org/opends/server/core/ModifyDNOperation.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -45,7 +46,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public ByteString getRawEntryDN();
+  ByteString getRawEntryDN();
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
@@ -54,7 +55,7 @@
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public void setRawEntryDN(ByteString rawEntryDN);
+  void setRawEntryDN(ByteString rawEntryDN);
 
 
   /**
@@ -65,7 +66,7 @@
    * @return  The DN of the entry to rename, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public DN getEntryDN();
+  DN getEntryDN();
 
   /**
    * Retrieves the raw, unprocessed newRDN as included in the request from the
@@ -75,7 +76,7 @@
    * @return  The raw, unprocessed newRDN as included in the request from the
    *          client.
    */
-  public ByteString getRawNewRDN();
+  ByteString getRawNewRDN();
 
   /**
    * Specifies the raw, unprocessed newRDN as included in the request from the
@@ -85,7 +86,7 @@
    * @param  rawNewRDN  The raw, unprocessed newRDN as included in the request
    *                    from the client.
    */
-  public void setRawNewRDN(ByteString rawNewRDN);
+  void setRawNewRDN(ByteString rawNewRDN);
 
   /**
    * Retrieves the new RDN to use for the entry.  This should not be called by
@@ -95,7 +96,7 @@
    * @return  The new RDN to use for the entry, or <CODE>null</CODE> if the raw
    *          newRDN has not yet been processed.
    */
-  public RDN getNewRDN();
+  RDN getNewRDN();
 
 
   /**
@@ -104,7 +105,7 @@
    * @return  <CODE>true</CODE> if the current RDN value should be removed from
    *          the entry, or <CODE>false</CODE> if not.
    */
-  public boolean deleteOldRDN();
+  boolean deleteOldRDN();
 
   /**
    * Specifies whether the current RDN value should be removed from the entry.
@@ -112,7 +113,7 @@
    * @param  deleteOldRDN  Specifies whether the current RDN value should be
    *                       removed from the entry.
    */
-  public void setDeleteOldRDN(boolean deleteOldRDN);
+  void setDeleteOldRDN(boolean deleteOldRDN);
 
   /**
    * Retrieves the raw, unprocessed newSuperior from the client request.  This
@@ -122,7 +123,7 @@
    * @return  The raw, unprocessed newSuperior from the client request, or
    *          <CODE>null</CODE> if there is none.
    */
-  public ByteString getRawNewSuperior();
+  ByteString getRawNewSuperior();
 
   /**
    * Specifies the raw, unprocessed newSuperior for this modify DN operation, as
@@ -132,7 +133,7 @@
    * @param  rawNewSuperior  The raw, unprocessed newSuperior as provided in the
    *                         request from the client.
    */
-  public void setRawNewSuperior(ByteString rawNewSuperior);
+  void setRawNewSuperior(ByteString rawNewSuperior);
 
   /**
    * Retrieves the newSuperior DN for the entry.  This should not be called by
@@ -144,7 +145,7 @@
    *          no newSuperior DN for this request or if the raw newSuperior has
    *          not yet been processed.
    */
-  public DN getNewSuperior();
+  DN getNewSuperior();
 
   /**
    * Retrieves the new DN for the entry.
@@ -152,7 +153,7 @@
    * @return The new DN for the entry, or <CODE>null</CODE> if there is
    *          neither newRDN, nor entryDN for this request.
    */
-  public DN getNewDN();
+  DN getNewDN();
 
   /**
    * Retrieves the set of modifications applied to attributes of the target
@@ -171,7 +172,7 @@
    *          of the modify DN processing, or <CODE>null</CODE> if that
    *          information is not yet available (e.g., during pre-parse plugins).
    */
-  public List<Modification> getModifications();
+  List<Modification> getModifications();
 
   /**
    * Adds the provided modification to the set of modifications to be applied
@@ -181,7 +182,7 @@
    * @param  modification  The modification to add to the set of modifications
    *                       to apply to the entry.
    */
-  public void addModification(Modification modification);
+  void addModification(Modification modification);
 
   /**
    * Retrieves the current entry, before it is renamed.  This will not be
@@ -191,7 +192,7 @@
    * @return  The current entry, or <CODE>null</CODE> if it is not yet
    *           available.
    */
-  public Entry getOriginalEntry();
+  Entry getOriginalEntry();
 
 
   /**
@@ -202,27 +203,7 @@
    * @return  The updated entry, or <CODE>null</CODE> if it is not yet
    *           available.
    */
-  public Entry getUpdatedEntry();
-
-  /**
-   * Retrieves the change number that has been assigned to this operation.
-   *
-   * @return  The change number that has been assigned to this operation, or -1
-   *          if none has been assigned yet or if there is no applicable
-   *          synchronization mechanism in place that uses change numbers.
-   */
-  public long getChangeNumber();
-
-
-  /**
-   * Specifies the change number that has been assigned to this operation by the
-   * synchronization mechanism.
-   *
-   * @param  changeNumber  The change number that has been assigned to this
-   *                       operation by the synchronization mechanism.
-   */
-  public void setChangeNumber(long changeNumber);
-
+  Entry getUpdatedEntry();
 
   /**
    * Retrieves the proxied authorization DN for this operation if proxied
@@ -232,7 +213,7 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public DN getProxiedAuthorizationDN();
+  DN getProxiedAuthorizationDN();
 
 
   /**
@@ -243,6 +224,6 @@
    *            authorization has been requested, or {@code null} if proxied
    *            authorization has not been requested.
    */
-  public void setProxiedAuthorizationDN(DN dn);
+  void setProxiedAuthorizationDN(DN dn);
 
 }
diff --git a/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java b/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
index 9ff575b..7470c11 100644
--- a/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
@@ -22,14 +22,10 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions copyright 2011-2013 ForgeRock AS.
+ *      Portions copyright 2011-2014 ForgeRock AS.
  */
 package org.opends.server.core;
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.server.loggers.AccessLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -41,7 +37,11 @@
 import org.opends.server.types.*;
 import org.opends.server.types.operation.PostResponseModifyDNOperation;
 import org.opends.server.types.operation.PreParseModifyDNOperation;
-import org.opends.server.workflowelement.localbackend.*;
+import org.opends.server.workflowelement.localbackend.LocalBackendModifyDNOperation;
+
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.loggers.AccessLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 
 /**
  * This class defines an operation that may be used to alter the DN of an entry
@@ -95,14 +95,11 @@
    */
   private List<Modification> modifications;
 
-  /** The change number that has been assigned to this operation. */
-  private long changeNumber;
-
   /** The new RDN for the entry. */
   private RDN newRDN;
 
   /** The new entry DN. */
-  private DN newDN = null;
+  private DN newDN;
 
   /**
    * Creates a new modify DN operation with the provided information.
@@ -142,7 +139,6 @@
     responseControls = new ArrayList<Control>();
     cancelRequest    = null;
     modifications    = null;
-    changeNumber     = -1;
   }
 
 
@@ -192,25 +188,16 @@
     responseControls = new ArrayList<Control>();
     cancelRequest    = null;
     modifications    = null;
-    changeNumber     = -1;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawEntryDN()
   {
     return rawEntryDN;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawEntryDN(ByteString rawEntryDN)
   {
@@ -219,11 +206,7 @@
     entryDN = null;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final DN getEntryDN()
   {
@@ -246,18 +229,14 @@
     return entryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawNewRDN()
   {
     return rawNewRDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawNewRDN(ByteString rawNewRDN)
   {
@@ -267,9 +246,7 @@
     newDN = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final RDN getNewRDN()
   {
@@ -293,37 +270,28 @@
     return newRDN;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final boolean deleteOldRDN()
   {
     return deleteOldRDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setDeleteOldRDN(boolean deleteOldRDN)
   {
     this.deleteOldRDN = deleteOldRDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawNewSuperior()
   {
     return rawNewSuperior;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawNewSuperior(ByteString rawNewSuperior)
   {
@@ -333,9 +301,7 @@
     newDN = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final DN getNewSuperior()
   {
@@ -366,20 +332,14 @@
     return newSuperior;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final List<Modification> getModifications()
   {
     return modifications;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addModification(Modification modification)
   {
@@ -393,50 +353,22 @@
     }
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final Entry getOriginalEntry()
   {
     return null;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final Entry getUpdatedEntry()
   {
     return null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
-  public final long getChangeNumber()
-  {
-    return changeNumber;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final void setChangeNumber(long changeNumber)
-  {
-    this.changeNumber = changeNumber;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
   public final OperationType getOperationType()
   {
     // Note that no debugging will be done in this method because it is a likely
@@ -445,41 +377,29 @@
     return OperationType.MODIFY_DN;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return proxiedAuthorizationDN;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
+  /** {@inheritDoc} */
+  @Override
   public final List<Control> getResponseControls()
   {
     return responseControls;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
+  /** {@inheritDoc} */
+  @Override
   public final void addResponseControl(Control control)
   {
     responseControls.add(control);
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
+  /** {@inheritDoc} */
+  @Override
   public final void removeResponseControl(Control control)
   {
     responseControls.remove(control);
@@ -656,11 +576,8 @@
             String.valueOf(entryDN)));
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
+  /** {@inheritDoc} */
+  @Override
   public final void toString(StringBuilder buffer)
   {
     buffer.append("ModifyDNOperation(connID=");
@@ -682,20 +599,14 @@
     buffer.append(")");
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN dn)
   {
     proxiedAuthorizationDN = dn;
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getNewDN()
   {
@@ -715,7 +626,7 @@
         parentDN = newSuperior;
       }
 
-      if ((parentDN == null) || parentDN.isNullDN())
+      if (parentDN == null || parentDN.isNullDN())
       {
         setResultCode(ResultCode.UNWILLING_TO_PERFORM);
         appendErrorMessage(ERR_MODDN_NO_PARENT.get(String.valueOf(entryDN)));
diff --git a/opends/src/server/org/opends/server/core/ModifyDNOperationWrapper.java b/opends/src/server/org/opends/server/core/ModifyDNOperationWrapper.java
index 002276c..d330c0a 100644
--- a/opends/src/server/org/opends/server/core/ModifyDNOperationWrapper.java
+++ b/opends/src/server/org/opends/server/core/ModifyDNOperationWrapper.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock AS
+ *      Portions Copyright 2013-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -49,162 +49,110 @@
     super(modifyDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void addModification(Modification modification) {
     getOperation().addModification(modification);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public boolean deleteOldRDN() {
     return getOperation().deleteOldRDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public long getChangeNumber() {
-    return getOperation().getChangeNumber();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getEntryDN() {
     return getOperation().getEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public List<Modification> getModifications() {
     return getOperation().getModifications();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public RDN getNewRDN() {
     return getOperation().getNewRDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getNewSuperior() {
     return getOperation().getNewSuperior();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Entry getOriginalEntry() {
     return getOperation().getOriginalEntry();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN() {
     return getOperation().getProxiedAuthorizationDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawEntryDN() {
     return getOperation().getRawEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawNewRDN() {
     return getOperation().getRawNewRDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawNewSuperior() {
     return getOperation().getRawNewSuperior();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Entry getUpdatedEntry() {
     return getOperation().getUpdatedEntry();
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void setChangeNumber(long changeNumber) {
-    getOperation().setChangeNumber(changeNumber);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setDeleteOldRDN(boolean deleteOldRDN) {
     getOperation().setDeleteOldRDN(deleteOldRDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawEntryDN(ByteString rawEntryDN) {
     getOperation().setRawEntryDN(rawEntryDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawNewRDN(ByteString rawNewRDN) {
     getOperation().setRawNewRDN(rawNewRDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawNewSuperior(ByteString rawNewSuperior) {
     getOperation().setRawNewSuperior(rawNewSuperior);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN dn)
   {
     getOperation().setProxiedAuthorizationDN(dn);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getNewDN()
   {
diff --git a/opends/src/server/org/opends/server/core/ModifyOperation.java b/opends/src/server/org/opends/server/core/ModifyOperation.java
index 150393b..ba92ea3 100644
--- a/opends/src/server/org/opends/server/core/ModifyOperation.java
+++ b/opends/src/server/org/opends/server/core/ModifyOperation.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -42,7 +43,7 @@
    *
    * @return  The raw, unprocessed entry DN as included in the client request.
    */
-  public abstract ByteString getRawEntryDN();
+  ByteString getRawEntryDN();
 
   /**
    * Specifies the raw, unprocessed entry DN as included in the client request.
@@ -51,7 +52,7 @@
    * @param  rawEntryDN  The raw, unprocessed entry DN as included in the client
    *                     request.
    */
-  public abstract void setRawEntryDN(ByteString rawEntryDN);
+  void setRawEntryDN(ByteString rawEntryDN);
 
   /**
    * Retrieves the DN of the entry to modify.  This should not be called by
@@ -61,7 +62,7 @@
    * @return  The DN of the entry to modify, or <CODE>null</CODE> if the raw
    *          entry DN has not yet been processed.
    */
-  public abstract DN getEntryDN();
+  DN getEntryDN();
 
   /**
    * Retrieves the set of raw, unprocessed modifications as included in the
@@ -72,7 +73,7 @@
    * @return  The set of raw, unprocessed modifications as included in the
    *          client request.
    */
-  public abstract List<RawModification> getRawModifications();
+  List<RawModification> getRawModifications();
 
   /**
    * Adds the provided modification to the set of raw modifications for this
@@ -81,15 +82,14 @@
    * @param  rawModification  The modification to add to the set of raw
    *                          modifications for this modify operation.
    */
-  public abstract void addRawModification(RawModification rawModification);
+  void addRawModification(RawModification rawModification);
 
   /**
    * Specifies the raw modifications for this modify operation.
    *
    * @param  rawModifications  The raw modifications for this modify operation.
    */
-  public abstract void setRawModifications(
-      List<RawModification> rawModifications);
+  void setRawModifications(List<RawModification> rawModifications);
 
   /**
    * Retrieves the set of modifications for this modify operation.  Its contents
@@ -99,7 +99,7 @@
    *          <CODE>null</CODE> if the modifications have not yet been
    *          processed.
    */
-  public abstract List<Modification> getModifications();
+  List<Modification> getModifications();
 
   /**
    * Adds the provided modification to the set of modifications to this modify
@@ -111,26 +111,7 @@
    * @throws  DirectoryException  If an unexpected problem occurs while applying
    *                              the modification to the entry.
    */
-  public abstract void addModification(Modification modification)
-      throws DirectoryException;
-
-  /**
-   * Retrieves the change number that has been assigned to this operation.
-   *
-   * @return  The change number that has been assigned to this operation, or -1
-   *          if none has been assigned yet or if there is no applicable
-   *          synchronization mechanism in place that uses change numbers.
-   */
-  public abstract long getChangeNumber();
-
-  /**
-   * Specifies the change number that has been assigned to this operation by the
-   * synchronization mechanism.
-   *
-   * @param  changeNumber  The change number that has been assigned to this
-   *                       operation by the synchronization mechanism.
-   */
-  public abstract void setChangeNumber(long changeNumber);
+  void addModification(Modification modification) throws DirectoryException;
 
   /**
    * Retrieves the proxied authorization DN for this operation if proxied
@@ -140,7 +121,7 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract DN getProxiedAuthorizationDN();
+  DN getProxiedAuthorizationDN();
 
   /**
    * Set the proxied authorization DN for this operation if proxied
@@ -151,6 +132,6 @@
    *          authorization has been requested, or {@code null} if proxied
    *          authorization has not been requested.
    */
-  public abstract void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
+  void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
 
 }
diff --git a/opends/src/server/org/opends/server/core/ModifyOperationBasis.java b/opends/src/server/org/opends/server/core/ModifyOperationBasis.java
index 53cb579..f20372c 100644
--- a/opends/src/server/org/opends/server/core/ModifyOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/ModifyOperationBasis.java
@@ -22,14 +22,10 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions copyright 2012-2013 ForgeRock AS.
+ *      Portions copyright 2012-2014 ForgeRock AS.
  */
 package org.opends.server.core;
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.server.loggers.AccessLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -44,7 +40,11 @@
 import org.opends.server.types.*;
 import org.opends.server.types.operation.PostResponseModifyOperation;
 import org.opends.server.types.operation.PreParseModifyOperation;
-import org.opends.server.workflowelement.localbackend.*;
+import org.opends.server.workflowelement.localbackend.LocalBackendModifyOperation;
+
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.loggers.AccessLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 
 /**
  * This class defines an operation that may be used to modify an entry in the
@@ -82,9 +82,6 @@
   /** The set of modifications for this modify operation. */
   private List<Modification> modifications;
 
-  /** The change number that has been assigned to this operation. */
-  private long changeNumber;
-
   /**
    * Creates a new modify operation with the provided information.
    *
@@ -155,18 +152,14 @@
     cancelRequest    = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final ByteString getRawEntryDN()
   {
     return rawEntryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawEntryDN(ByteString rawEntryDN)
   {
@@ -175,9 +168,7 @@
     entryDN = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final DN getEntryDN()
   {
@@ -198,18 +189,14 @@
     return entryDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final List<RawModification> getRawModifications()
   {
     return rawModifications;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addRawModification(RawModification rawModification)
   {
@@ -218,9 +205,7 @@
     modifications = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void setRawModifications(List<RawModification> rawModifications)
   {
@@ -229,9 +214,7 @@
     modifications = null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final List<Modification> getModifications()
   {
@@ -256,16 +239,11 @@
                mod.setAttribute(attr);
              }
            }
-           else
+           else if (attr.hasOption("binary"))
            {
              // binary option is not honored for non-BER-encodable attributes.
-             if(attr.hasOption("binary"))
-             {
-               throw new LDAPException(LDAPResultCode.UNDEFINED_ATTRIBUTE_TYPE,
-                       ERR_ADD_ATTR_IS_INVALID_OPTION.get(
-                       String.valueOf(entryDN),
-                       attr.getName()));
-             }
+             throw new LDAPException(LDAPResultCode.UNDEFINED_ATTRIBUTE_TYPE,
+                 ERR_ADD_ATTR_IS_INVALID_OPTION.get(String.valueOf(entryDN), attr.getName()));
            }
 
            modifications.add(mod);
@@ -285,9 +263,7 @@
     return modifications;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addModification(Modification modification)
   throws DirectoryException
@@ -295,9 +271,7 @@
     modifications.add(modification);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final OperationType getOperationType()
   {
@@ -307,45 +281,35 @@
     return OperationType.MODIFY;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final List<Control> getResponseControls()
   {
     return responseControls;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void addResponseControl(Control control)
   {
     responseControls.add(control);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void removeResponseControl(Control control)
   {
     responseControls.remove(control);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void toString(StringBuilder buffer)
   {
@@ -358,35 +322,14 @@
     buffer.append(")");
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final long getChangeNumber(){
-    return changeNumber;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void setChangeNumber(long changeNumber)
-  {
-    this.changeNumber = changeNumber;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN)
   {
     this.proxiedAuthorizationDN = proxiedAuthorizationDN;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public final void run()
   {
diff --git a/opends/src/server/org/opends/server/core/ModifyOperationWrapper.java b/opends/src/server/org/opends/server/core/ModifyOperationWrapper.java
index ea9305d..188ff60 100644
--- a/opends/src/server/org/opends/server/core/ModifyOperationWrapper.java
+++ b/opends/src/server/org/opends/server/core/ModifyOperationWrapper.java
@@ -22,16 +22,14 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
-
 import java.util.List;
 
 import org.opends.server.types.*;
 
-
 /**
  * This abstract class wraps/decorates a given modify operation.
  * This class will be extended by sub-classes to enhance the
@@ -51,9 +49,7 @@
     super(modify);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void addModification(Modification modification)
     throws DirectoryException
@@ -61,107 +57,70 @@
     getOperation().addModification(modification);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void addRawModification(RawModification rawModification)
   {
     getOperation().addRawModification(rawModification);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getEntryDN()
   {
     return getOperation().getEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public List<Modification> getModifications()
   {
     return getOperation().getModifications();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ByteString getRawEntryDN()
   {
     return getOperation().getRawEntryDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public List<RawModification> getRawModifications()
   {
     return getOperation().getRawModifications();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawEntryDN(ByteString rawEntryDN)
   {
     getOperation().setRawEntryDN(rawEntryDN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setRawModifications(List<RawModification> rawModifications)
   {
     getOperation().setRawModifications(rawModifications);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public String toString()
   {
     return getOperation().toString();
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final long getChangeNumber(){
-    return getOperation().getChangeNumber();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void setChangeNumber(long changeNumber)
-  {
-    getOperation().setChangeNumber(changeNumber);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public DN getProxiedAuthorizationDN()
   {
     return getOperation().getProxiedAuthorizationDN();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN){
     getOperation().setProxiedAuthorizationDN(proxiedAuthorizationDN);
diff --git a/opends/src/server/org/opends/server/core/PersistentSearch.java b/opends/src/server/org/opends/server/core/PersistentSearch.java
index 3193abb..41b7d22 100644
--- a/opends/src/server/org/opends/server/core/PersistentSearch.java
+++ b/opends/src/server/org/opends/server/core/PersistentSearch.java
@@ -22,14 +22,11 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
 
-
-
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -44,10 +41,9 @@
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ResultCode;
-import org.opends.server.types.SearchFilter;
-import org.opends.server.types.SearchScope;
 
-
+import static org.opends.server.controls.PersistentSearchChangeType.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 
 /**
  * This class defines a data structure that will be used to hold the
@@ -109,7 +105,7 @@
 
 
 
-  // Cancel a persistent search.
+  /** Cancel a persistent search. */
   private static synchronized void cancel(PersistentSearch psearch)
   {
     if (!psearch.isCancelled)
@@ -141,32 +137,28 @@
     }
   }
 
-  // The base DN for the search operation.
-  private final DN baseDN;
-
-  // Cancellation callbacks which should be run when this persistent
-  // search is cancelled.
+  /**
+   * Cancellation callbacks which should be run when this persistent search is
+   * cancelled.
+   */
   private final List<CancellationCallback> cancellationCallbacks =
     new CopyOnWriteArrayList<CancellationCallback>();
 
-  // The set of change types we want to see.
+  /** The set of change types to send to the client. */
   private final Set<PersistentSearchChangeType> changeTypes;
 
-  // The filter for the search operation.
-  private final SearchFilter filter;
+  /**
+   * Indicates whether or not this persistent search has already been aborted.
+   */
+  private boolean isCancelled;
 
-  // Indicates whether or not this persistent search has already been
-  // aborted.
-  private boolean isCancelled = false;
-
-  // Indicates whether entries returned should include the entry
-  // change notification control.
+  /**
+   * Indicates whether entries returned should include the entry change
+   * notification control.
+   */
   private final boolean returnECs;
 
-  // The scope for the search operation.
-  private final SearchScope scope;
-
-  // The reference to the associated search operation.
+  /** The reference to the associated search operation. */
   private final SearchOperation searchOperation;
 
 
@@ -189,10 +181,6 @@
     this.searchOperation = searchOperation;
     this.changeTypes = changeTypes;
     this.returnECs = returnECs;
-
-    this.baseDN = searchOperation.getBaseDN();
-    this.scope = searchOperation.getScope();
-    this.filter = searchOperation.getFilter();
   }
 
 
@@ -257,60 +245,45 @@
    *
    * @param entry
    *          The entry that was added.
-   * @param changeNumber
-   *          The change number associated with the operation that
-   *          added the entry, or {@code -1} if there is no change
-   *          number.
    */
-  public void processAdd(Entry entry, long changeNumber)
+  public void processAdd(Entry entry)
   {
-    // See if we care about add operations.
-    if (!changeTypes.contains(PersistentSearchChangeType.ADD))
+    if (changeTypes.contains(ADD)
+        && isInScope(entry.getDN())
+        && matchesFilter(entry))
     {
-      return;
+      sendEntry(entry, createControls(ADD, null));
     }
+  }
 
-    // Make sure that the entry is within our target scope.
-    switch (scope)
+  private boolean isInScope(final DN dn)
+  {
+    final DN baseDN = searchOperation.getBaseDN();
+    switch (searchOperation.getScope())
     {
     case BASE_OBJECT:
-      if (!baseDN.equals(entry.getDN()))
-      {
-        return;
-      }
-      break;
+      return baseDN.equals(dn);
     case SINGLE_LEVEL:
-      if (!baseDN.equals(entry.getDN().getParentDNInSuffix()))
-      {
-        return;
-      }
-      break;
+      return baseDN.equals(dn.getParentDNInSuffix());
     case WHOLE_SUBTREE:
-      if (!baseDN.isAncestorOf(entry.getDN()))
-      {
-        return;
-      }
-      break;
+      return baseDN.isAncestorOf(dn);
     case SUBORDINATE_SUBTREE:
-      if (baseDN.equals(entry.getDN()) || (!baseDN.isAncestorOf(entry.getDN())))
-      {
-        return;
-      }
-      break;
+      return !baseDN.equals(dn) && baseDN.isAncestorOf(dn);
     default:
-      return;
+      return false;
     }
+  }
 
-    // Make sure that the entry matches the target filter.
+  private boolean matchesFilter(Entry entry)
+  {
     try
     {
-      TRACER.debugInfo(this + " " + entry + " +filter="
-          + filter.matchesEntry(entry));
-
-      if (!filter.matchesEntry(entry))
+      final boolean filterMatchesEntry = searchOperation.getFilter().matchesEntry(entry);
+      if (debugEnabled())
       {
-        return;
+        TRACER.debugInfo(this + " " + entry + " filter=" + filterMatchesEntry);
       }
+      return filterMatchesEntry;
     }
     catch (DirectoryException de)
     {
@@ -320,162 +293,23 @@
       }
 
       // FIXME -- Do we need to do anything here?
-
-      return;
-    }
-
-    // The entry is one that should be sent to the client. See if we
-    // also need to construct an entry change notification control.
-    ArrayList<Control> entryControls = new ArrayList<Control>(1);
-    if (returnECs)
-    {
-      entryControls.add(new EntryChangeNotificationControl(
-          PersistentSearchChangeType.ADD, changeNumber));
-    }
-
-    // Send the entry and see if we should continue processing. If
-    // not, then deregister this persistent search.
-    try
-    {
-      if (!searchOperation.returnEntry(entry, entryControls))
-      {
-        cancel();
-        searchOperation.sendSearchResultDone();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      cancel();
-
-      try
-      {
-        searchOperation.sendSearchResultDone();
-      }
-      catch (Exception e2)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-        }
-      }
+      return false;
     }
   }
 
-
-
   /**
    * Notifies the persistent searches that an entry has been deleted.
    *
    * @param entry
    *          The entry that was deleted.
-   * @param changeNumber
-   *          The change number associated with the operation that
-   *          deleted the entry, or {@code -1} if there is no change
-   *          number.
    */
-  public void processDelete(Entry entry, long changeNumber)
+  public void processDelete(Entry entry)
   {
-    // See if we care about delete operations.
-    if (!changeTypes.contains(PersistentSearchChangeType.DELETE))
+    if (changeTypes.contains(DELETE)
+        && isInScope(entry.getDN())
+        && matchesFilter(entry))
     {
-      return;
-    }
-
-    // Make sure that the entry is within our target scope.
-    switch (scope)
-    {
-    case BASE_OBJECT:
-      if (!baseDN.equals(entry.getDN()))
-      {
-        return;
-      }
-      break;
-    case SINGLE_LEVEL:
-      if (!baseDN.equals(entry.getDN().getParentDNInSuffix()))
-      {
-        return;
-      }
-      break;
-    case WHOLE_SUBTREE:
-      if (!baseDN.isAncestorOf(entry.getDN()))
-      {
-        return;
-      }
-      break;
-    case SUBORDINATE_SUBTREE:
-      if (baseDN.equals(entry.getDN()) || (!baseDN.isAncestorOf(entry.getDN())))
-      {
-        return;
-      }
-      break;
-    default:
-      return;
-    }
-
-    // Make sure that the entry matches the target filter.
-    try
-    {
-      if (!filter.matchesEntry(entry))
-      {
-        return;
-      }
-    }
-    catch (DirectoryException de)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, de);
-      }
-
-      // FIXME -- Do we need to do anything here?
-
-      return;
-    }
-
-    // The entry is one that should be sent to the client. See if we
-    // also need to construct an entry change notification control.
-    ArrayList<Control> entryControls = new ArrayList<Control>(1);
-    if (returnECs)
-    {
-      entryControls.add(new EntryChangeNotificationControl(
-          PersistentSearchChangeType.DELETE, changeNumber));
-    }
-
-    // Send the entry and see if we should continue processing. If
-    // not, then deregister this persistent search.
-    try
-    {
-      if (!searchOperation.returnEntry(entry, entryControls))
-      {
-        cancel();
-        searchOperation.sendSearchResultDone();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      cancel();
-
-      try
-      {
-        searchOperation.sendSearchResultDone();
-      }
-      catch (Exception e2)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-        }
-      }
+      sendEntry(entry, createControls(DELETE, null));
     }
   }
 
@@ -486,14 +320,10 @@
    *
    * @param entry
    *          The entry after it was modified.
-   * @param changeNumber
-   *          The change number associated with the operation that
-   *          modified the entry, or {@code -1} if there is no change
-   *          number.
    */
-  public void processModify(Entry entry, long changeNumber)
+  public void processModify(Entry entry)
   {
-    processModify(entry, changeNumber, entry);
+    processModify(entry, entry);
   }
 
 
@@ -503,222 +333,84 @@
    *
    * @param entry
    *          The entry after it was modified.
-   * @param changeNumber
-   *          The change number associated with the operation that
-   *          modified the entry, or {@code -1} if there is no change
-   *          number.
    * @param oldEntry
    *          The entry before it was modified.
    */
-  public void processModify(Entry entry, long changeNumber, Entry oldEntry)
+  public void processModify(Entry entry, Entry oldEntry)
   {
-    // See if we care about modify operations.
-    if (!changeTypes.contains(PersistentSearchChangeType.MODIFY))
+    if (changeTypes.contains(MODIFY)
+        && isInScopeForModify(oldEntry.getDN())
+        && anyMatchesFilter(entry, oldEntry))
     {
-      return;
-    }
-
-    // Make sure that the entry is within our target scope.
-    switch (scope)
-    {
-    case BASE_OBJECT:
-      if (!baseDN.equals(oldEntry.getDN()))
-      {
-        return;
-      }
-      break;
-    case SINGLE_LEVEL:
-      if (!baseDN.equals(oldEntry.getDN().getParent()))
-      {
-        return;
-      }
-      break;
-    case WHOLE_SUBTREE:
-      if (!baseDN.isAncestorOf(oldEntry.getDN()))
-      {
-        return;
-      }
-      break;
-    case SUBORDINATE_SUBTREE:
-      if (baseDN.equals(oldEntry.getDN())
-          || (!baseDN.isAncestorOf(oldEntry.getDN())))
-      {
-        return;
-      }
-      break;
-    default:
-      return;
-    }
-
-    // Make sure that the entry matches the target filter.
-    try
-    {
-      if ((!filter.matchesEntry(oldEntry)) && (!filter.matchesEntry(entry)))
-      {
-        return;
-      }
-    }
-    catch (DirectoryException de)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, de);
-      }
-
-      // FIXME -- Do we need to do anything here?
-
-      return;
-    }
-
-    // The entry is one that should be sent to the client. See if we
-    // also need to construct an entry change notification control.
-    ArrayList<Control> entryControls = new ArrayList<Control>(1);
-    if (returnECs)
-    {
-      entryControls.add(new EntryChangeNotificationControl(
-          PersistentSearchChangeType.MODIFY, changeNumber));
-    }
-
-    // Send the entry and see if we should continue processing. If
-    // not, then deregister this persistent search.
-    try
-    {
-      if (!searchOperation.returnEntry(entry, entryControls))
-      {
-        cancel();
-        searchOperation.sendSearchResultDone();
-      }
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      cancel();
-
-      try
-      {
-        searchOperation.sendSearchResultDone();
-      }
-      catch (Exception e2)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-        }
-      }
+      sendEntry(entry, createControls(MODIFY, null));
     }
   }
 
+  private boolean isInScopeForModify(final DN dn)
+  {
+    final DN baseDN = searchOperation.getBaseDN();
+    switch (searchOperation.getScope())
+    {
+    case BASE_OBJECT:
+      return baseDN.equals(dn);
+    case SINGLE_LEVEL:
+      return baseDN.equals(dn.getParent());
+    case WHOLE_SUBTREE:
+      return baseDN.isAncestorOf(dn);
+    case SUBORDINATE_SUBTREE:
+      return !baseDN.equals(dn) && baseDN.isAncestorOf(dn);
+    default:
+      return false;
+    }
+  }
 
+  private boolean anyMatchesFilter(Entry entry, Entry oldEntry)
+  {
+    return matchesFilter(oldEntry) || matchesFilter(entry);
+  }
 
   /**
    * Notifies the persistent searches that an entry has been renamed.
    *
    * @param entry
    *          The entry after it was modified.
-   * @param changeNumber
-   *          The change number associated with the operation that
-   *          modified the entry, or {@code -1} if there is no change
-   *          number.
    * @param oldDN
    *          The DN of the entry before it was renamed.
    */
-  public void processModifyDN(Entry entry, long changeNumber, DN oldDN)
+  public void processModifyDN(Entry entry, DN oldDN)
   {
-    // See if we care about modify DN operations.
-    if (!changeTypes.contains(PersistentSearchChangeType.MODIFY_DN))
+    if (changeTypes.contains(MODIFY_DN)
+        && isAnyInScopeForModify(entry, oldDN)
+        && matchesFilter(entry))
     {
-      return;
+      sendEntry(entry, createControls(MODIFY_DN, oldDN));
     }
+  }
 
-    // Make sure that the old or new entry is within our target scope.
-    // In this case, we need to check the DNs of both the old and new
-    // entry so we know which one(s) should be compared against the
-    // filter.
-    boolean oldMatches = false;
-    boolean newMatches = false;
+  private boolean isAnyInScopeForModify(Entry entry, DN oldDN)
+  {
+    return isInScopeForModify(oldDN) || isInScopeForModify(entry.getDN());
+  }
 
-    switch (scope)
-    {
-    case BASE_OBJECT:
-      oldMatches = baseDN.equals(oldDN);
-      newMatches = baseDN.equals(entry.getDN());
-
-      if (!(oldMatches || newMatches))
-      {
-        return;
-      }
-
-      break;
-    case SINGLE_LEVEL:
-      oldMatches = baseDN.equals(oldDN.getParent());
-      newMatches = baseDN.equals(entry.getDN().getParent());
-
-      if (!(oldMatches || newMatches))
-      {
-        return;
-      }
-
-      break;
-    case WHOLE_SUBTREE:
-      oldMatches = baseDN.isAncestorOf(oldDN);
-      newMatches = baseDN.isAncestorOf(entry.getDN());
-
-      if (!(oldMatches || newMatches))
-      {
-        return;
-      }
-
-      break;
-    case SUBORDINATE_SUBTREE:
-      oldMatches = ((!baseDN.equals(oldDN)) && baseDN.isAncestorOf(oldDN));
-      newMatches = ((!baseDN.equals(entry.getDN())) && baseDN
-          .isAncestorOf(entry.getDN()));
-
-      if (!(oldMatches || newMatches))
-      {
-        return;
-      }
-
-      break;
-    default:
-      return;
-    }
-
-    // Make sure that the entry matches the target filter.
-    try
-    {
-      if (!oldMatches && !newMatches && !filter.matchesEntry(entry))
-      {
-        return;
-      }
-    }
-    catch (DirectoryException de)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, de);
-      }
-
-      // FIXME -- Do we need to do anything here?
-
-      return;
-    }
-
-    // The entry is one that should be sent to the client. See if we
-    // also need to construct an entry change notification control.
-    ArrayList<Control> entryControls = new ArrayList<Control>(1);
+  /**
+   * The entry is one that should be sent to the client. See if we also need to
+   * construct an entry change notification control.
+   */
+  private List<Control> createControls(PersistentSearchChangeType changeType,
+      DN previousDN)
+  {
     if (returnECs)
     {
-      entryControls.add(new EntryChangeNotificationControl(
-          PersistentSearchChangeType.MODIFY_DN, oldDN, changeNumber));
+      final Control c = previousDN != null
+          ? new EntryChangeNotificationControl(changeType, previousDN, -1)
+          : new EntryChangeNotificationControl(changeType, -1);
+      return Collections.singletonList(c);
     }
+    return Collections.emptyList();
+  }
 
-    // Send the entry and see if we should continue processing. If
-    // not, then deregister this persistent search.
+  private void sendEntry(Entry entry, List<Control> entryControls)
+  {
     try
     {
       if (!searchOperation.returnEntry(entry, entryControls))
@@ -813,9 +505,9 @@
     buffer.append(",baseDN=\"");
     searchOperation.getBaseDN().toString(buffer);
     buffer.append("\",scope=");
-    buffer.append(scope.toString());
+    buffer.append(searchOperation.getScope());
     buffer.append(",filter=\"");
-    filter.toString(buffer);
+    searchOperation.getFilter().toString(buffer);
     buffer.append("\")");
   }
 }
diff --git a/opends/src/server/org/opends/server/replication/server/ECLServerWriter.java b/opends/src/server/org/opends/server/replication/server/ECLServerWriter.java
index 4d9bc65..6f9eb8d 100644
--- a/opends/src/server/org/opends/server/replication/server/ECLServerWriter.java
+++ b/opends/src/server/org/opends/server/replication/server/ECLServerWriter.java
@@ -149,13 +149,17 @@
         }
 
         if (shutdown)
+        {
           return;
+        }
 
         // Not suspended
         doIt();
 
         if (shutdown)
+        {
           return;
+        }
 
         suspendWriter();
       }
@@ -178,12 +182,14 @@
     }
     finally
     {
-      if (session!=null)
+      if (session != null)
       {
         session.close();
       }
       if (replicationServerDomain != null)
+      {
         replicationServerDomain.stopServer(handler, false);
+      }
     }
   }
 
@@ -195,24 +201,10 @@
    */
   private void doIt() throws IOException, InterruptedException
   {
-    while (true)
+    while (!shutdown && !suspended)
     {
-      if (shutdown || suspended)
-      {
-        return;
-      }
-
-      ECLUpdateMsg update = null;
-      try
-      {
-        update = handler.takeECLUpdate();
-      }
-      catch(DirectoryException de)
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, de);
-      }
-
-      if (update == null)
+      final ECLUpdateMsg updateMsg = takeECLUpdate(handler);
+      if (updateMsg == null)
       {
         if (session != null && handler.isInitPhaseDone())
         {
@@ -232,14 +224,25 @@
       }
       else
       {
-        // Publish the update to the remote server using a protocol version it
-        // supports
-        publish(update);
-        update = null;
+        // Publish the update to the remote server using a protocol version it supports
+        publish(updateMsg);
       }
     }
   }
 
+  private ECLUpdateMsg takeECLUpdate(ECLServerHandler handler)
+  {
+    try
+    {
+      return handler.takeECLUpdate();
+    }
+    catch(DirectoryException de)
+    {
+      TRACER.debugCaught(DebugLogLevel.ERROR, de);
+      return null;
+    }
+  }
+
   /**
    * Shutdown the writer.
    */
@@ -255,7 +258,9 @@
   private void publish(ECLUpdateMsg msg) throws IOException
   {
     if (debugEnabled())
+    {
       TRACER.debugInfo(getName() + " publishes msg=[" + msg + "]");
+    }
 
     if (session != null)
     {
@@ -265,8 +270,10 @@
     {
       try
       {
+        // Using processAdd() because all ECLUpdateMsgs are adds to the external changelog
+        // (even though the underlying changes can be adds, deletes, modifies or modDNs)
         Entry eclEntry = ECLSearchOperation.createEntryFromMsg(msg);
-        mypsearch.processAdd(eclEntry, -1);
+        mypsearch.processAdd(eclEntry);
       }
       catch (Exception e)
       {
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
index 6afe7b5..d260677 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
@@ -22,17 +22,10 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.loggers.ErrorLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -55,6 +48,13 @@
 import org.opends.server.types.operation.PreOperationAddOperation;
 import org.opends.server.util.TimeThread;
 
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.config.ConfigConstants.*;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
+
 /**
  * This class defines an operation used to add an entry in a local backend
  * of the Directory Server.
@@ -64,53 +64,33 @@
        implements PreOperationAddOperation, PostOperationAddOperation,
                   PostResponseAddOperation, PostSynchronizationAddOperation
 {
-  /**
-   * The tracer object for the debug logger.
-   */
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
 
-  /**
-   * The backend in which the entry is to be added.
-   */
-  private Backend backend;
+  /** The backend in which the entry is to be added. */
+  private Backend<?> backend;
 
-  /**
-   * Indicates whether the request includes the LDAP no-op control.
-   */
+  /** Indicates whether the request includes the LDAP no-op control. */
   private boolean noOp;
 
-  /**
-   * The DN of the entry to be added.
-   */
+  /** The DN of the entry to be added. */
   private DN entryDN;
 
-  /**
-   * The entry being added to the server.
-   */
+  /** The entry being added to the server. */
   private Entry entry;
 
-  /**
-   * The post-read request control included in the request, if applicable.
-   */
+  /** The post-read request control included in the request, if applicable. */
   private LDAPPostReadRequestControl postReadRequest;
 
-  /**
-   * The set of object classes for the entry to add.
-   */
+  /** The set of object classes for the entry to add. */
   private Map<ObjectClass, String> objectClasses;
 
-  /**
-   * The set of operational attributes for the entry to add.
-   */
+  /** The set of operational attributes for the entry to add. */
   private Map<AttributeType, List<Attribute>> operationalAttributes;
 
-  /**
-   * The set of user attributes for the entry to add.
-   */
+  /** The set of user attributes for the entry to add. */
   private Map<AttributeType, List<Attribute>> userAttributes;
 
-
-
   /**
    * Creates a new operation that may be used to add a new entry in a
    * local backend of the Directory Server.
@@ -207,7 +187,7 @@
           // Notify persistent searches.
           for (PersistentSearch psearch : wfe.getPersistentSearches())
           {
-            psearch.processAdd(entry, getChangeNumber());
+            psearch.processAdd(entry);
           }
 
           // Notify change listeners.
@@ -216,8 +196,7 @@
           {
             try
             {
-              changeListener.handleAddOperation(LocalBackendAddOperation.this,
-                  entry);
+              changeListener.handleAddOperation(LocalBackendAddOperation.this, entry);
             }
             catch (Exception e)
             {
@@ -310,8 +289,9 @@
       userAttributes = getUserAttributes();
       operationalAttributes = getOperationalAttributes();
 
-      if ((objectClasses == null) || (userAttributes == null)
-          || (operationalAttributes == null))
+      if (objectClasses == null
+          || userAttributes == null
+          || operationalAttributes == null)
       {
         return;
       }
@@ -423,8 +403,7 @@
       if (backend == null)
       {
         setResultCode(ResultCode.NO_SUCH_OBJECT);
-        appendErrorMessage(Message.raw("No backend for entry "
-            + entryDN.toString())); // TODO: i18n
+        appendErrorMessage(Message.raw("No backend for entry " + entryDN)); // TODO: i18n
         return;
       }
 
@@ -600,16 +579,15 @@
   {
     for (AttributeType at : attributes.keySet())
     {
-      if (at.isNoUserModification())
+      if (at.isNoUserModification()
+          && !isInternalOperation()
+          && !isSynchronizationOperation())
       {
-        if (!(isInternalOperation() || isSynchronizationOperation()))
-        {
-          setResultCodeAndMessageNoInfoDisclosure(entryDN,
-              ResultCode.CONSTRAINT_VIOLATION,
-              ERR_ADD_ATTR_IS_NO_USER_MOD.get(
-                  String.valueOf(entryDN), at.getNameOrOID()));
-          return true;
-        }
+        setResultCodeAndMessageNoInfoDisclosure(entryDN,
+            ResultCode.CONSTRAINT_VIOLATION,
+            ERR_ADD_ATTR_IS_NO_USER_MOD.get(
+                String.valueOf(entryDN), at.getNameOrOID()));
+        return true;
       }
     }
     return false;
@@ -821,7 +799,7 @@
     // See if a password was specified.
     AttributeType passwordAttribute = passwordPolicy.getPasswordAttribute();
     List<Attribute> attrList = entry.getAttribute(passwordAttribute);
-    if ((attrList == null) || attrList.isEmpty())
+    if (attrList == null || attrList.isEmpty())
     {
       // The entry doesn't have a password, so no action is required.
       return;
@@ -849,9 +827,9 @@
       return;
     }
 
-    if ((!isInternalOperation())
-        && (!passwordPolicy.isAllowMultiplePasswordValues())
-        && (passwordAttr.size() > 1))
+    if (!isInternalOperation()
+        && !passwordPolicy.isAllowMultiplePasswordValues()
+        && passwordAttr.size() > 1)
     {
       // FIXME -- What if they're pre-encoded and might all be the
       // same?
@@ -875,44 +853,35 @@
       {
         if (AuthPasswordSyntax.isEncoded(value))
         {
-          if (isInternalOperation() ||
-              passwordPolicy.isAllowPreEncodedPasswords())
+          if (isInternalOperation()
+              || passwordPolicy.isAllowPreEncodedPasswords())
           {
             builder.add(v);
             continue;
           }
           else
           {
-            addPWPolicyControl(
-                 PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY);
+            addPWPolicyControl(PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY);
 
-            Message message = ERR_PWPOLICY_PREENCODED_NOT_ALLOWED.get(
-                passwordAttribute.getNameOrOID());
             throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message);
+                ERR_PWPOLICY_PREENCODED_NOT_ALLOWED.get(passwordAttribute.getNameOrOID()));
           }
         }
       }
-      else
+      else if (UserPasswordSyntax.isEncoded(value))
       {
-        if (UserPasswordSyntax.isEncoded(value))
+        if (isInternalOperation()
+            || passwordPolicy.isAllowPreEncodedPasswords())
         {
-          if (isInternalOperation() ||
-              passwordPolicy.isAllowPreEncodedPasswords())
-          {
-            builder.add(v);
-            continue;
-          }
-          else
-          {
-            addPWPolicyControl(
-                 PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY);
+          builder.add(v);
+          continue;
+        }
+        else
+        {
+          addPWPolicyControl(PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY);
 
-            Message message = ERR_PWPOLICY_PREENCODED_NOT_ALLOWED.get(
-                passwordAttribute.getNameOrOID());
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         message);
-          }
+          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+              ERR_PWPOLICY_PREENCODED_NOT_ALLOWED.get(passwordAttribute.getNameOrOID()));
         }
       }
 
@@ -1005,10 +974,9 @@
   {
     for (Control c : getRequestControls())
     {
-      if (c.getOID().equals(OID_PASSWORD_POLICY_CONTROL))
+      if (OID_PASSWORD_POLICY_CONTROL.equals(c.getOID()))
       {
-        addResponseControl(new PasswordPolicyResponseControl(null, 0,
-                                                             errorType));
+        addResponseControl(new PasswordPolicyResponseControl(null, 0, errorType));
       }
     }
   }
@@ -1137,12 +1105,11 @@
     List<Control> requestControls = getRequestControls();
     if (requestControls != null && !requestControls.isEmpty())
     {
-      for (int i=0; i < requestControls.size(); i++)
+      for (Control c : requestControls)
       {
-        Control c   = requestControls.get(i);
         String  oid = c.getOID();
 
-        if (oid.equals(OID_LDAP_ASSERTION))
+        if (OID_LDAP_ASSERTION.equals(oid))
         {
           // RFC 4528 mandates support for Add operation basically
           // suggesting an assertion on self. As daft as it may be
@@ -1205,16 +1172,16 @@
                     de.getMessageObject()));
           }
         }
-        else if (oid.equals(OID_LDAP_NOOP_OPENLDAP_ASSIGNED))
+        else if (OID_LDAP_NOOP_OPENLDAP_ASSIGNED.equals(oid))
         {
           noOp = true;
         }
-        else if (oid.equals(OID_LDAP_READENTRY_POSTREAD))
+        else if (OID_LDAP_READENTRY_POSTREAD.equals(oid))
         {
           postReadRequest =
                 getRequestControl(LDAPPostReadRequestControl.DECODER);
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V1))
+        else if (OID_PROXIED_AUTH_V1.equals(oid))
         {
           // Log usage of legacy proxy authz V1 control.
           addAdditionalLogItem(AdditionalLogItem.keyOnly(getClass(),
@@ -1233,16 +1200,9 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V2))
+        else if (OID_PROXIED_AUTH_V2.equals(oid))
         {
           // The requester must have the PROXIED_AUTH privilege in order to
           // be able to use this control.
@@ -1258,34 +1218,27 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-        else if (oid.equals(OID_PASSWORD_POLICY_CONTROL))
+        else if (OID_PASSWORD_POLICY_CONTROL.equals(oid))
         {
           // We don't need to do anything here because it's already handled
           // in LocalBackendAddOperation.handlePasswordPolicy().
         }
-
         // NYI -- Add support for additional controls.
-        else if (c.isCritical())
+        else if (c.isCritical()
+            && (backend == null || !backend.supportsControl(oid)))
         {
-          if ((backend == null) || (! backend.supportsControl(oid)))
-          {
-            throw newDirectoryException(entryDN,
-                           ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
-                           ERR_ADD_UNSUPPORTED_CRITICAL_CONTROL.get(
-                                String.valueOf(entryDN), oid));
-          }
+          throw newDirectoryException(entryDN,
+              ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+              ERR_ADD_UNSUPPORTED_CRITICAL_CONTROL.get(String.valueOf(entryDN), oid));
         }
       }
     }
   }
-}
 
+  private DN getDN(Entry e)
+  {
+    return e != null ? e.getDN() : DN.nullDN();
+  }
+}
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
index 6cf49d0..d8b715a 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
@@ -22,16 +22,10 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.server.loggers.ErrorLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
 import java.util.List;
 import java.util.concurrent.locks.Lock;
 
@@ -53,6 +47,12 @@
 import org.opends.server.types.operation.PostSynchronizationDeleteOperation;
 import org.opends.server.types.operation.PreOperationDeleteOperation;
 
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
+
 /**
  * This class defines an operation used to delete an entry in a local backend
  * of the Directory Server.
@@ -63,36 +63,22 @@
                   PostResponseDeleteOperation,
                   PostSynchronizationDeleteOperation
 {
-  /**
-   * The tracer object for the debug logger.
-   */
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
 
+  /** The backend in which the operation is to be processed. */
+  private Backend<?> backend;
 
-
-  /**
-   * The backend in which the operation is to be processed.
-   */
-  private Backend backend;
-
-  /**
-   * Indicates whether the LDAP no-op control has been requested.
-   */
+  /** Indicates whether the LDAP no-op control has been requested. */
   private boolean noOp;
 
-  /**
-   * The client connection on which this operation was requested.
-   */
+  /** The client connection on which this operation was requested. */
   private ClientConnection clientConnection;
 
-  /**
-   * The DN of the entry to be deleted.
-   */
+  /** The DN of the entry to be deleted. */
   private DN entryDN;
 
-  /**
-   * The entry to be deleted.
-   */
+  /** The entry to be deleted. */
   private Entry entry;
 
   /** The pre-read request control included in the request, if applicable. */
@@ -193,7 +179,7 @@
           // Notify persistent searches.
           for (PersistentSearch psearch : wfe.getPersistentSearches())
           {
-            psearch.processDelete(entry, getChangeNumber());
+            psearch.processDelete(entry);
           }
 
           // Notify change listeners.
@@ -202,8 +188,7 @@
           {
             try
             {
-              changeListener.handleDeleteOperation(
-                  LocalBackendDeleteOperation.this, entry);
+              changeListener.handleDeleteOperation(LocalBackendDeleteOperation.this, entry);
             }
             catch (Exception e)
             {
@@ -212,10 +197,8 @@
                 TRACER.debugCaught(DebugLogLevel.ERROR, e);
               }
 
-              Message message =
-                  ERR_DELETE_ERROR_NOTIFYING_CHANGE_LISTENER
-                      .get(getExceptionMessage(e));
-              logError(message);
+              logError(ERR_DELETE_ERROR_NOTIFYING_CHANGE_LISTENER
+                  .get(getExceptionMessage(e)));
             }
           }
         }
@@ -334,8 +317,7 @@
       // handling a subtree delete). But we will need to check if there are
       // any subordinate backends that should stop us from attempting the
       // delete.
-      Backend[] subBackends = backend.getSubordinateBackends();
-      for (Backend b : subBackends)
+      for (Backend<?> b : backend.getSubordinateBackends())
       {
         for (DN dn : b.getBaseDNs())
         {
@@ -450,7 +432,7 @@
       for (Control c : requestControls)
       {
         final String oid = c.getOID();
-        if (oid.equals(OID_LDAP_ASSERTION))
+        if (OID_LDAP_ASSERTION.equals(oid))
         {
           LDAPAssertionRequestControl assertControl =
                 getRequestControl(LDAPAssertionRequestControl.DECODER);
@@ -509,16 +491,16 @@
                                 de.getMessageObject()));
           }
         }
-        else if (oid.equals(OID_LDAP_NOOP_OPENLDAP_ASSIGNED))
+        else if (OID_LDAP_NOOP_OPENLDAP_ASSIGNED.equals(oid))
         {
           noOp = true;
         }
-        else if (oid.equals(OID_LDAP_READENTRY_PREREAD))
+        else if (OID_LDAP_READENTRY_PREREAD.equals(oid))
         {
           preReadRequest =
                 getRequestControl(LDAPPreReadRequestControl.DECODER);
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V1))
+        else if (OID_PROXIED_AUTH_V1.equals(oid))
         {
           // Log usage of legacy proxy authz V1 control.
           addAdditionalLogItem(AdditionalLogItem.keyOnly(getClass(),
@@ -537,16 +519,9 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V2))
+        else if (OID_PROXIED_AUTH_V2.equals(oid))
         {
           // The requester must have the PROXIED_AUTH privilege in order to
           // be able to use this control.
@@ -561,32 +536,24 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-
         // NYI -- Add support for additional controls.
-
-        else if (c.isCritical())
+        else if (c.isCritical()
+            && (backend == null || !backend.supportsControl(oid)))
         {
-          if ((backend == null) || (! backend.supportsControl(oid)))
-          {
-            throw newDirectoryException(entry,
-                           ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
-                           ERR_DELETE_UNSUPPORTED_CRITICAL_CONTROL.get(
-                                String.valueOf(entryDN), oid));
-          }
+          throw newDirectoryException(entry,
+              ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+              ERR_DELETE_UNSUPPORTED_CRITICAL_CONTROL.get(String.valueOf(entryDN), oid));
         }
       }
     }
   }
 
+  private DN getDN(Entry e)
+  {
+    return e != null ? e.getDN() : DN.nullDN();
+  }
 
   /**
    * Handle conflict resolution.
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
index 3b4ed01..78dccfb 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
@@ -22,12 +22,13 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.concurrent.locks.Lock;
 
 import org.opends.messages.Message;
@@ -63,41 +64,25 @@
              PostResponseModifyDNOperation,
              PostSynchronizationModifyDNOperation
 {
-  /**
-   * The tracer object for the debug logger.
-   */
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
 
+  /** The backend in which the operation is to be processed. */
+  private Backend<?> backend;
 
-
-  /**
-   * The backend in which the operation is to be processed.
-   */
-  private Backend backend;
-
-  /**
-   * Indicates whether the no-op control was included in the request.
-   */
+  /** Indicates whether the no-op control was included in the request. */
   private boolean noOp;
 
-  /**
-   * The client connection on which this operation was requested.
-   */
+  /** The client connection on which this operation was requested. */
   private ClientConnection clientConnection;
 
-  /**
-   * The original DN of the entry.
-   */
+  /** The original DN of the entry. */
   private DN entryDN;
 
-  /**
-   * The current entry, before it is renamed.
-   */
+  /** The current entry, before it is renamed. */
   private Entry currentEntry;
 
-  /**
-   * The new entry, as it will appear after it has been renamed.
-   */
+  /** The new entry, as it will appear after it has been renamed. */
   private Entry newEntry;
 
   /** The LDAP post-read request control, if present in the request. */
@@ -106,9 +91,7 @@
   /** The LDAP pre-read request control, if present in the request. */
   private LDAPPreReadRequestControl preReadRequest;
 
-  /**
-   * The new RDN for the entry.
-   */
+  /** The new RDN for the entry. */
   private RDN newRDN;
 
 
@@ -224,8 +207,7 @@
           // Notify persistent searches.
           for (PersistentSearch psearch : wfe.getPersistentSearches())
           {
-            psearch.processModifyDN(newEntry, getChangeNumber(), currentEntry
-                .getDN());
+            psearch.processModifyDN(newEntry, currentEntry.getDN());
           }
 
           // Notify change listeners.
@@ -244,10 +226,8 @@
                 TRACER.debugCaught(DebugLogLevel.ERROR, e);
               }
 
-              Message message =
-                  ERR_MODDN_ERROR_NOTIFYING_CHANGE_LISTENER
-                      .get(getExceptionMessage(e));
-              logError(message);
+              logError(ERR_MODDN_ERROR_NOTIFYING_CHANGE_LISTENER
+                  .get(getExceptionMessage(e)));
             }
           }
         }
@@ -304,7 +284,7 @@
 
     // Get the backend for the current entry, and the backend for the new
     // entry. If either is null, or if they are different, then fail.
-    Backend currentBackend = backend;
+    Backend<?> currentBackend = backend;
     if (currentBackend == null)
     {
       setResultCode(ResultCode.NO_SUCH_OBJECT);
@@ -313,7 +293,7 @@
       return;
     }
 
-    Backend newBackend = DirectoryServer.getBackend(newDN);
+    Backend<?> newBackend = DirectoryServer.getBackend(newDN);
     if (newBackend == null)
     {
       setResultCode(ResultCode.NO_SUCH_OBJECT);
@@ -589,14 +569,14 @@
     LocalBackendWorkflowElement.removeAllDisallowedControls(entryDN, this);
 
     List<Control> requestControls = getRequestControls();
-    if ((requestControls != null) && (! requestControls.isEmpty()))
+    if (requestControls != null && !requestControls.isEmpty())
     {
-      for (int i=0; i < requestControls.size(); i++)
+      for (ListIterator<Control> iter = requestControls.listIterator(); iter.hasNext();)
       {
-        Control c   = requestControls.get(i);
+        Control c = iter.next();
         String  oid = c.getOID();
 
-        if (oid.equals(OID_LDAP_ASSERTION))
+        if (OID_LDAP_ASSERTION.equals(oid))
         {
           LDAPAssertionRequestControl assertControl =
                 getRequestControl(LDAPAssertionRequestControl.DECODER);
@@ -657,17 +637,16 @@
                     de.getMessageObject()));
           }
         }
-        else if (oid.equals(OID_LDAP_NOOP_OPENLDAP_ASSIGNED))
+        else if (OID_LDAP_NOOP_OPENLDAP_ASSIGNED.equals(oid))
         {
           noOp = true;
         }
-        else if (oid.equals(OID_LDAP_READENTRY_PREREAD))
+        else if (OID_LDAP_READENTRY_PREREAD.equals(oid))
         {
-          preReadRequest =
-                getRequestControl(LDAPPreReadRequestControl.DECODER);
-          requestControls.set(i, preReadRequest);
+          preReadRequest = getRequestControl(LDAPPreReadRequestControl.DECODER);
+          iter.set(preReadRequest);
         }
-        else if (oid.equals(OID_LDAP_READENTRY_POSTREAD))
+        else if (OID_LDAP_READENTRY_POSTREAD.equals(oid))
         {
           if (c instanceof LDAPPostReadRequestControl)
           {
@@ -675,12 +654,11 @@
           }
           else
           {
-            postReadRequest =
-                  getRequestControl(LDAPPostReadRequestControl.DECODER);
-            requestControls.set(i, postReadRequest);
+            postReadRequest = getRequestControl(LDAPPostReadRequestControl.DECODER);
+            iter.set(postReadRequest);
           }
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V1))
+        else if (OID_PROXIED_AUTH_V1.equals(oid))
         {
           // Log usage of legacy proxy authz V1 control.
           addAdditionalLogItem(AdditionalLogItem.keyOnly(getClass(),
@@ -699,16 +677,9 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-        else if (oid.equals(OID_PROXIED_AUTH_V2))
+        else if (OID_PROXIED_AUTH_V2.equals(oid))
         {
           // The requester must have the PROXIED_AUTH privilege in order to
           // be able to use this control.
@@ -723,33 +694,23 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
-
-        // NYI -- Add support for additional controls.
-
-        else if (c.isCritical())
+        else if (c.isCritical()
+            && (backend == null || !backend.supportsControl(oid)))
         {
-          if ((backend == null) || (! backend.supportsControl(oid)))
-          {
-            throw new DirectoryException(
-                           ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
-                           ERR_MODDN_UNSUPPORTED_CRITICAL_CONTROL.get(
-                                String.valueOf(entryDN), oid));
-          }
+          throw new DirectoryException(
+              ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+              ERR_MODDN_UNSUPPORTED_CRITICAL_CONTROL.get(String.valueOf(entryDN), oid));
         }
       }
     }
   }
 
-
+  private DN getDN(Entry e)
+  {
+    return e != null ? e.getDN() : DN.nullDN();
+  }
 
   /**
    * Updates the entry so that its attributes are changed to reflect the changes
@@ -777,14 +738,12 @@
 
         // If the associated attribute type is marked NO-USER-MODIFICATION, then
         // refuse the update.
-        if (a.getAttributeType().isNoUserModification())
+        if (a.getAttributeType().isNoUserModification()
+            && !isInternalOperation()
+            && !isSynchronizationOperation())
         {
-          if (! (isInternalOperation() || isSynchronizationOperation()))
-          {
-            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                           ERR_MODDN_OLD_RDN_ATTR_IS_NO_USER_MOD.get(
-                                String.valueOf(entryDN), a.getName()));
-          }
+          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+              ERR_MODDN_OLD_RDN_ATTR_IS_NO_USER_MOD.get(String.valueOf(entryDN), a.getName()));
         }
 
         List<AttributeValue> missingValues = new LinkedList<AttributeValue>();
@@ -816,7 +775,7 @@
         // refuse the update.
         if (a.getAttributeType().isNoUserModification())
         {
-          if (! (isInternalOperation() || isSynchronizationOperation()))
+          if (!isInternalOperation() && !isSynchronizationOperation())
           {
             throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
                            ERR_MODDN_NEW_RDN_ATTR_IS_NO_USER_MOD.get(
@@ -833,7 +792,7 @@
     // If the server is configured to check the schema and the operation is not
     // a synchronization operation, make sure that the resulting entry is valid
     // as per the server schema.
-    if ((DirectoryServer.checkSchema()) && (! isSynchronizationOperation()))
+    if (DirectoryServer.checkSchema() && !isSynchronizationOperation())
     {
       MessageBuilder invalidReason = new MessageBuilder();
       if (! newEntry.conformsToSchema(null, false, true, true,
@@ -1013,4 +972,3 @@
       }
   }
 }
-
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
index 697063e..01466a5 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
@@ -22,20 +22,14 @@
  *
  *
  *      Copyright 2008-2011 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
-import static org.opends.messages.CoreMessages.*;
-import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.loggers.ErrorLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.concurrent.locks.Lock;
 
 import org.opends.messages.Message;
@@ -54,6 +48,13 @@
 import org.opends.server.types.operation.PreOperationModifyOperation;
 import org.opends.server.util.Validator;
 
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.config.ConfigConstants.*;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
+
 /**
  * This class defines an operation used to modify an entry in a local backend
  * of the Directory Server.
@@ -64,15 +65,11 @@
                   PostResponseModifyOperation,
                   PostSynchronizationModifyOperation
 {
-  /**
-   * The tracer object for the debug logger.
-   */
+  /** The tracer object for the debug logger. */
   private static final DebugTracer TRACER = getTracer();
 
-  /**
-   * The backend in which the target entry exists.
-   */
-  protected Backend backend;
+  /** The backend in which the target entry exists. */
+  private Backend<?> backend;
 
   /** Indicates whether the request included the user's current password. */
   private boolean currentPasswordProvided;
@@ -81,60 +78,40 @@
    * Indicates whether the user's account has been enabled or disabled
    * by this modify operation.
    */
-  protected boolean enabledStateChanged;
+  private boolean enabledStateChanged;
 
   /** Indicates whether the user's account is currently enabled. */
   private boolean isEnabled;
 
-  /**
-   * Indicates whether the request included the LDAP no-op control.
-   */
-  protected boolean noOp;
+  /** Indicates whether the request included the LDAP no-op control. */
+  private boolean noOp;
 
-  /**
-   * Indicates whether the request included the Permissive Modify control.
-   */
-  protected boolean permissiveModify = false;
+  /** Indicates whether the request included the Permissive Modify control. */
+  private boolean permissiveModify;
 
-  /**
-   * Indicates whether this modify operation includes a password change.
-   */
-  protected boolean passwordChanged;
+  /** Indicates whether this modify operation includes a password change. */
+  private boolean passwordChanged;
 
-  /**
-   * Indicates whether the request included the password policy request control.
-   */
-  protected boolean pwPolicyControlRequested;
+  /** Indicates whether the request included the password policy request control. */
+  private boolean pwPolicyControlRequested;
 
-  /**
-   * Indicates whether the password change is a self-change.
-   */
-  protected boolean selfChange;
+  /** Indicates whether the password change is a self-change. */
+  private boolean selfChange;
 
-  /**
-   * Indicates whether the user's account was locked before this change.
-   */
-  protected boolean wasLocked = false;
+  /** Indicates whether the user's account was locked before this change. */
+  private boolean wasLocked;
 
-  /**
-   * The client connection associated with this operation.
-   */
-  protected ClientConnection clientConnection;
+  /** The client connection associated with this operation. */
+  private ClientConnection clientConnection;
 
-  /**
-   * The DN of the entry to modify.
-   */
-  protected DN entryDN;
+  /** The DN of the entry to modify. */
+  private DN entryDN;
 
-  /**
-   * The current entry, before any changes are applied.
-   */
-  protected Entry currentEntry = null;
+  /** The current entry, before any changes are applied. */
+  private Entry currentEntry;
 
-  /**
-   * The modified entry that will be stored in the backend.
-   */
-  protected Entry modifiedEntry = null;
+  /** The modified entry that will be stored in the backend. */
+  private Entry modifiedEntry;
 
   /** The number of passwords contained in the modify operation. */
   private int numPasswords;
@@ -146,25 +123,19 @@
   private LDAPPreReadRequestControl preReadRequest;
 
   /** The set of clear-text current passwords (if any were provided).*/
-  private List<AttributeValue> currentPasswords = null;
+  private List<AttributeValue> currentPasswords;
 
   /** The set of clear-text new passwords (if any were provided).*/
-  private List<AttributeValue> newPasswords = null;
+  private List<AttributeValue> newPasswords;
 
-  /**
-   * The set of modifications contained in this request.
-   */
-  protected List<Modification> modifications;
+  /** The set of modifications contained in this request. */
+  private List<Modification> modifications;
 
-  /**
-   * The password policy error type for this operation.
-   */
-  protected PasswordPolicyErrorType pwpErrorType;
+  /** The password policy error type for this operation. */
+  private PasswordPolicyErrorType pwpErrorType;
 
-  /**
-   * The password policy state for this modify operation.
-   */
-  protected PasswordPolicyState pwPolicyState;
+  /** The password policy state for this modify operation. */
+  private PasswordPolicyState pwPolicyState;
 
 
 
@@ -349,8 +320,7 @@
           // Notify persistent searches.
           for (PersistentSearch psearch : wfe.getPersistentSearches())
           {
-            psearch.processModify(modifiedEntry, getChangeNumber(),
-                currentEntry);
+            psearch.processModify(modifiedEntry, currentEntry);
           }
 
           // Notify change listeners.
@@ -370,9 +340,8 @@
                 TRACER.debugCaught(DebugLogLevel.ERROR, e);
               }
 
-              Message message = ERR_MODIFY_ERROR_NOTIFYING_CHANGE_LISTENER
-                  .get(getExceptionMessage(e));
-              logError(message);
+              logError(ERR_MODIFY_ERROR_NOTIFYING_CHANGE_LISTENER
+                  .get(getExceptionMessage(e)));
             }
           }
         }
@@ -401,8 +370,7 @@
     if (modifications.isEmpty())
     {
       setResultCode(ResultCode.CONSTRAINT_VIOLATION);
-      appendErrorMessage(ERR_MODIFY_NO_MODIFICATIONS.get(String
-          .valueOf(entryDN)));
+      appendErrorMessage(ERR_MODIFY_NO_MODIFICATIONS.get(String.valueOf(entryDN)));
       return;
     }
 
@@ -417,8 +385,7 @@
       if (entryLock == null)
       {
         setResultCode(ResultCode.BUSY);
-        appendErrorMessage(ERR_MODIFY_CANNOT_LOCK_ENTRY.get(
-            String.valueOf(entryDN)));
+        appendErrorMessage(ERR_MODIFY_CANNOT_LOCK_ENTRY.get(String.valueOf(entryDN)));
         return;
       }
 
@@ -431,8 +398,7 @@
       if (currentEntry == null)
       {
         setResultCode(ResultCode.NO_SUCH_OBJECT);
-        appendErrorMessage(ERR_MODIFY_NO_SUCH_ENTRY
-            .get(String.valueOf(entryDN)));
+        appendErrorMessage(ERR_MODIFY_NO_SUCH_ENTRY.get(String.valueOf(entryDN)));
 
         // See if one of the entry's ancestors exists.
         setMatchedDN(findMatchedDN(entryDN));
@@ -451,7 +417,8 @@
 
       // Check that the authorizing account isn't required to change its
       // password.
-      if ((!isInternalOperation()) && !selfChange
+      if (!isInternalOperation()
+          && !selfChange
           && getAuthorizationEntry() != null)
       {
         AuthenticationPolicy authzPolicy =
@@ -524,7 +491,7 @@
       handleInitialPasswordPolicyProcessing();
       performAdditionalPasswordChangedProcessing();
 
-      if ((!passwordChanged) && (!isInternalOperation()) && selfChange
+      if (!passwordChanged && !isInternalOperation() && selfChange
           && pwPolicyState != null && pwPolicyState.mustChangePassword())
       {
         // The user did not attempt to change their password.
@@ -538,11 +505,10 @@
       // If the server is configured to check the schema and the
       // operation is not a synchronization operation,
       // make sure that the new entry is valid per the server schema.
-      if ((DirectoryServer.checkSchema()) && (!isSynchronizationOperation()))
+      if (DirectoryServer.checkSchema() && !isSynchronizationOperation())
       {
         MessageBuilder invalidReason = new MessageBuilder();
-        if (!modifiedEntry.conformsToSchema(null, false, false, false,
-            invalidReason))
+        if (!modifiedEntry.conformsToSchema(null, false, false, false, invalidReason))
         {
           setResultCode(ResultCode.OBJECTCLASS_VIOLATION);
           appendErrorMessage(ERR_MODIFY_VIOLATES_SCHEMA.get(String
@@ -682,16 +648,16 @@
    * @throws  DirectoryException  If a problem is encountered with any of the
    *                              controls.
    */
-  protected void processRequestControls() throws DirectoryException
+  private void processRequestControls() throws DirectoryException
   {
     LocalBackendWorkflowElement.removeAllDisallowedControls(entryDN, this);
 
     List<Control> requestControls = getRequestControls();
-    if ((requestControls != null) && (! requestControls.isEmpty()))
+    if (requestControls != null && !requestControls.isEmpty())
     {
-      for (int i=0; i < requestControls.size(); i++)
+      for (ListIterator<Control> iter = requestControls.listIterator(); iter.hasNext();)
       {
-        Control c   = requestControls.get(i);
+        Control c = iter.next();
         String  oid = c.getOID();
 
         if (oid.equals(OID_LDAP_ASSERTION))
@@ -764,8 +730,7 @@
         }
         else if (oid.equals(OID_LDAP_READENTRY_PREREAD))
         {
-          preReadRequest =
-                getRequestControl(LDAPPreReadRequestControl.DECODER);
+          preReadRequest = getRequestControl(LDAPPreReadRequestControl.DECODER);
         }
         else if (oid.equals(OID_LDAP_READENTRY_POSTREAD))
         {
@@ -775,9 +740,8 @@
           }
           else
           {
-            postReadRequest =
-                getRequestControl(LDAPPostReadRequestControl.DECODER);
-            requestControls.set(i, postReadRequest);
+            postReadRequest = getRequestControl(LDAPPostReadRequestControl.DECODER);
+            iter.set(postReadRequest);
           }
         }
         else if (oid.equals(OID_PROXIED_AUTH_V1))
@@ -799,14 +763,7 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
         else if (oid.equals(OID_PROXIED_AUTH_V2))
         {
@@ -823,44 +780,37 @@
 
           Entry authorizationEntry = proxyControl.getAuthorizationEntry();
           setAuthorizationEntry(authorizationEntry);
-          if (authorizationEntry == null)
-          {
-            setProxiedAuthorizationDN(DN.nullDN());
-          }
-          else
-          {
-            setProxiedAuthorizationDN(authorizationEntry.getDN());
-          }
+          setProxiedAuthorizationDN(getDN(authorizationEntry));
         }
         else if (oid.equals(OID_PASSWORD_POLICY_CONTROL))
         {
           pwPolicyControlRequested = true;
         }
-
         // NYI -- Add support for additional controls.
-        else if (c.isCritical())
+        else if (c.isCritical()
+            && (backend == null || !backend.supportsControl(oid)))
         {
-          if ((backend == null) || (! backend.supportsControl(oid)))
-          {
-            throw newDirectoryException(currentEntry,
-                           ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
-                           ERR_MODIFY_UNSUPPORTED_CRITICAL_CONTROL.get(
-                                String.valueOf(entryDN), oid));
-          }
+          throw newDirectoryException(currentEntry,
+              ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+              ERR_MODIFY_UNSUPPORTED_CRITICAL_CONTROL.get(String.valueOf(entryDN), oid));
         }
       }
     }
   }
 
-   /**
+  private DN getDN(Entry e)
+  {
+    return e != null ? e.getDN() : DN.nullDN();
+  }
+
+  /**
    * Handles schema processing for non-password modifications.
    *
    * @throws  DirectoryException  If a problem is encountered that should cause
    *                              the modify operation to fail.
    */
-  protected void handleSchemaProcessing() throws DirectoryException
+  private void handleSchemaProcessing() throws DirectoryException
   {
-
     for (Modification m : modifications)
     {
       Attribute     a = m.getAttribute();
@@ -868,37 +818,30 @@
 
 
       // If the attribute type is marked "NO-USER-MODIFICATION" then fail unless
-      // this is an internal operation or is related to synchronization in some
-      // way.
-      if (t.isNoUserModification())
+      // this is an internal operation or is related to synchronization in some way.
+      if (t.isNoUserModification()
+          && !isInternalOperation()
+          && !isSynchronizationOperation()
+          && !m.isInternal())
       {
-        if (! (isInternalOperation() || isSynchronizationOperation() ||
-                m.isInternal()))
-        {
-          throw newDirectoryException(currentEntry,
-              ResultCode.CONSTRAINT_VIOLATION,
-              ERR_MODIFY_ATTR_IS_NO_USER_MOD.get(
-                          String.valueOf(entryDN), a.getName()));
-        }
+        throw newDirectoryException(currentEntry,
+            ResultCode.CONSTRAINT_VIOLATION, ERR_MODIFY_ATTR_IS_NO_USER_MOD
+                .get(String.valueOf(entryDN), a.getName()));
       }
 
       // If the attribute type is marked "OBSOLETE" and the modification is
       // setting new values, then fail unless this is an internal operation or
       // is related to synchronization in some way.
-      if (t.isObsolete())
+      if (t.isObsolete()
+          && !a.isEmpty()
+          && m.getModificationType() != ModificationType.DELETE
+          && !isInternalOperation()
+          && !isSynchronizationOperation()
+          && !m.isInternal())
       {
-        if (!a.isEmpty() &&
-                (m.getModificationType() != ModificationType.DELETE))
-        {
-          if (! (isInternalOperation() || isSynchronizationOperation() ||
-                  m.isInternal()))
-          {
-            throw newDirectoryException(currentEntry,
-                ResultCode.CONSTRAINT_VIOLATION,
-                ERR_MODIFY_ATTR_IS_OBSOLETE.get(
-                            String.valueOf(entryDN), a.getName()));
-          }
-        }
+        throw newDirectoryException(currentEntry,
+            ResultCode.CONSTRAINT_VIOLATION,
+            ERR_MODIFY_ATTR_IS_OBSOLETE.get(String.valueOf(entryDN), a.getName()));
       }
 
 
@@ -916,10 +859,9 @@
 
       // If the modification is not updating the password attribute,
       // then perform any schema processing.
-      boolean isPassword = (pwPolicyState != null)
-          && t.equals(pwPolicyState.getAuthenticationPolicy()
-              .getPasswordAttribute());
-      if (!isPassword )
+      boolean isPassword = pwPolicyState != null
+          && t.equals(pwPolicyState.getAuthenticationPolicy().getPasswordAttribute());
+      if (!isPassword)
       {
         switch (m.getModificationType())
         {
@@ -949,8 +891,7 @@
    * @throws  DirectoryException  If a problem is encountered that should cause
    *                              the modify operation to fail.
    */
-  protected void handleInitialPasswordPolicyProcessing()
-          throws DirectoryException
+  private void handleInitialPasswordPolicyProcessing() throws DirectoryException
   {
     // Declare variables used for password policy state processing.
     currentPasswordProvided = false;
@@ -963,8 +904,8 @@
       return;
     }
 
-    if (currentEntry.hasAttribute(
-            pwPolicyState.getAuthenticationPolicy().getPasswordAttribute()))
+    final PasswordPolicy authPolicy = pwPolicyState.getAuthenticationPolicy();
+    if (currentEntry.hasAttribute(authPolicy.getPasswordAttribute()))
     {
       // It may actually have more than one, but we can't tell the difference if
       // the values are encoded, and its enough for our purposes just to know
@@ -986,22 +927,17 @@
       for (Modification m : modifications)
       {
         AttributeType t = m.getAttribute().getAttributeType();
-        boolean isPassword = t.equals(pwPolicyState.getAuthenticationPolicy()
-            .getPasswordAttribute());
+        boolean isPassword = t.equals(authPolicy.getPasswordAttribute());
         if (isPassword)
         {
           passwordChanged = true;
-          if (! selfChange)
+          if (!selfChange && !clientConnection.hasPrivilege(Privilege.PASSWORD_RESET, this))
           {
-            if (! clientConnection.hasPrivilege(Privilege.PASSWORD_RESET, this))
-            {
-              pwpErrorType = PasswordPolicyErrorType.PASSWORD_MOD_NOT_ALLOWED;
-              throw new DirectoryException(
-                      ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-                      ERR_MODIFY_PWRESET_INSUFFICIENT_PRIVILEGES.get());
-            }
+            pwpErrorType = PasswordPolicyErrorType.PASSWORD_MOD_NOT_ALLOWED;
+            throw new DirectoryException(
+                ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
+                ERR_MODIFY_PWRESET_INSUFFICIENT_PRIVILEGES.get());
           }
-
           break;
         }
       }
@@ -1017,8 +953,7 @@
       // If the modification is updating the password attribute, then perform
       // any necessary password policy processing.  This processing should be
       // skipped for synchronization operations.
-      boolean isPassword = t.equals(pwPolicyState.getAuthenticationPolicy()
-          .getPasswordAttribute());
+      boolean isPassword = t.equals(authPolicy.getPasswordAttribute());
       if (isPassword)
       {
         if (!isSynchronizationOperation())
@@ -1050,9 +985,7 @@
             }
 
             // If it's a self change, then see if that's allowed.
-            if (selfChange
-                && (!pwPolicyState.getAuthenticationPolicy()
-                    .isAllowUserPasswordChanges()))
+            if (selfChange && !authPolicy.isAllowUserPasswordChanges())
             {
               pwpErrorType = PasswordPolicyErrorType.PASSWORD_MOD_NOT_ALLOWED;
               throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
@@ -1062,9 +995,8 @@
 
             // If we require secure password changes, then makes sure it's a
             // secure communication channel.
-            if (pwPolicyState.getAuthenticationPolicy()
-                .isRequireSecurePasswordChanges()
-                && (!clientConnection.isSecure()))
+            if (authPolicy.isRequireSecurePasswordChanges()
+                && !clientConnection.isSecure())
             {
               pwpErrorType = PasswordPolicyErrorType.PASSWORD_MOD_NOT_ALLOWED;
               throw new DirectoryException(ResultCode.CONFIDENTIALITY_REQUIRED,
@@ -1211,8 +1143,7 @@
 
         for (ByteString s : pwPolicyState.encodePassword(v.getValue()))
         {
-          builder.add(AttributeValues.create(
-              pwAttr.getAttributeType(), s));
+          builder.add(AttributeValues.create(pwAttr.getAttributeType(), s));
         }
       }
     }
@@ -1251,7 +1182,7 @@
     {
       if (pwPolicyState.passwordIsPreEncoded(v.getValue()))
       {
-        if ((!isInternalOperation()) && selfChange)
+        if (!isInternalOperation() && selfChange)
         {
           pwpErrorType = PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY;
           throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
@@ -1261,9 +1192,8 @@
         {
           // We still need to check if the pre-encoded password matches
           // an existing value, to decrease the number of passwords.
-          List<Attribute> attrList = currentEntry.getAttribute(pwAttr
-              .getAttributeType());
-          if ((attrList == null) || (attrList.isEmpty()))
+          List<Attribute> attrList = currentEntry.getAttribute(pwAttr.getAttributeType());
+          if (attrList == null || attrList.isEmpty())
           {
             throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE,
                 ERR_MODIFY_NO_EXISTING_VALUES.get());
@@ -1288,8 +1218,7 @@
       }
       else
       {
-        List<Attribute> attrList = currentEntry.getAttribute(pwAttr
-            .getAttributeType());
+        List<Attribute> attrList = currentEntry.getAttribute(pwAttr.getAttributeType());
         if ((attrList == null) || (attrList.isEmpty()))
         {
           throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE,
@@ -1406,10 +1335,9 @@
     // If the server is configured to check schema and the operation
     // is not a synchronization operation, make sure that all the new
     // values are valid according to the associated syntax.
-    if ((DirectoryServer.checkSchema()) && (!isSynchronizationOperation()))
+    if (DirectoryServer.checkSchema() && !isSynchronizationOperation())
     {
-      AcceptRejectWarn syntaxPolicy = DirectoryServer
-          .getSyntaxEnforcementPolicy();
+      AcceptRejectWarn syntaxPolicy = DirectoryServer.getSyntaxEnforcementPolicy();
       AttributeSyntax<?> syntax = attr.getAttributeType().getSyntax();
 
       if (syntaxPolicy == AcceptRejectWarn.REJECT)
@@ -1568,9 +1496,9 @@
         AttributeType t = attr.getAttributeType();
 
         RDN rdn = modifiedEntry.getDN().getRDN();
-        if ((rdn !=  null) && rdn.hasAttributeType(t) &&
-            (! modifiedEntry.hasValue(t, attr.getOptions(),
-                                      rdn.getAttributeValue(t))))
+        if (rdn != null
+            && rdn.hasAttributeType(t)
+            && !modifiedEntry.hasValue(t, attr.getOptions(), rdn.getAttributeValue(t)))
         {
           throw newDirectoryException(currentEntry,
               ResultCode.NOT_ALLOWED_ON_RDN,
@@ -1578,27 +1506,20 @@
                   String.valueOf(entryDN), attr.getName()));
         }
       }
-      else
+      else if (!permissiveModify)
       {
-        if (! permissiveModify)
-        {
-          String missingValuesStr = collectionToString(missingValues, ", ");
+        String missingValuesStr = collectionToString(missingValues, ", ");
 
-          throw newDirectoryException(currentEntry,
-              ResultCode.NO_SUCH_ATTRIBUTE,
-              ERR_MODIFY_DELETE_MISSING_VALUES.get(
-                  String.valueOf(entryDN), attr.getName(), missingValuesStr));
-        }
+        throw newDirectoryException(currentEntry,
+            ResultCode.NO_SUCH_ATTRIBUTE,
+            ERR_MODIFY_DELETE_MISSING_VALUES.get(
+                String.valueOf(entryDN), attr.getName(), missingValuesStr));
       }
     }
-    else
+    else if (!permissiveModify)
     {
-      if (! permissiveModify)
-      {
-        throw newDirectoryException(currentEntry, ResultCode.NO_SUCH_ATTRIBUTE,
-                     ERR_MODIFY_DELETE_NO_SUCH_ATTR.get(
-                          String.valueOf(entryDN), attr.getName()));
-      }
+      throw newDirectoryException(currentEntry, ResultCode.NO_SUCH_ATTRIBUTE,
+          ERR_MODIFY_DELETE_NO_SUCH_ATTR.get(String.valueOf(entryDN), attr.getName()));
     }
   }
 
@@ -1620,7 +1541,7 @@
     // If the server is configured to check schema and the operation
     // is not a synchronization operation, make sure that all the
     // new values are valid according to the associated syntax.
-    if ((DirectoryServer.checkSchema()) && (!isSynchronizationOperation()))
+    if (DirectoryServer.checkSchema() && !isSynchronizationOperation())
     {
       AcceptRejectWarn syntaxPolicy = DirectoryServer
           .getSyntaxEnforcementPolicy();
@@ -1691,14 +1612,12 @@
     // Make sure that the RDN attribute value(s) has not been removed.
     AttributeType t = attr.getAttributeType();
     RDN rdn = modifiedEntry.getDN().getRDN();
-    if ((rdn != null)
+    if (rdn != null
         && rdn.hasAttributeType(t)
-        && (!modifiedEntry.hasValue(t, attr.getOptions(), rdn
-            .getAttributeValue(t))))
+        && !modifiedEntry.hasValue(t, attr.getOptions(), rdn.getAttributeValue(t)))
     {
       throw newDirectoryException(modifiedEntry, ResultCode.NOT_ALLOWED_ON_RDN,
-          ERR_MODIFY_DELETE_RDN_ATTR.get(String.valueOf(entryDN), attr
-              .getName()));
+          ERR_MODIFY_DELETE_RDN_ATTR.get(String.valueOf(entryDN), attr.getName()));
     }
   }
 
@@ -1720,20 +1639,17 @@
     // The specified attribute type must not be an RDN attribute.
     AttributeType t = attr.getAttributeType();
     RDN rdn = modifiedEntry.getDN().getRDN();
-    if ((rdn != null) && rdn.hasAttributeType(t))
+    if (rdn != null && rdn.hasAttributeType(t))
     {
       throw newDirectoryException(modifiedEntry, ResultCode.NOT_ALLOWED_ON_RDN,
-          ERR_MODIFY_INCREMENT_RDN.get(String.valueOf(entryDN),
-              attr.getName()));
+          ERR_MODIFY_INCREMENT_RDN.get(String.valueOf(entryDN), attr.getName()));
     }
 
-    // The provided attribute must have a single value, and it must be
-    // an integer.
+    // The provided attribute must have a single value, and it must be an integer
     if (attr.isEmpty())
     {
       throw newDirectoryException(modifiedEntry, ResultCode.PROTOCOL_ERROR,
-          ERR_MODIFY_INCREMENT_REQUIRES_VALUE.get(String.valueOf(entryDN), attr
-              .getName()));
+          ERR_MODIFY_INCREMENT_REQUIRES_VALUE.get(String.valueOf(entryDN), attr.getName()));
     }
 
     if (attr.size() > 1)
@@ -1832,10 +1748,10 @@
 
     // If it was a self change, then see if the current password was provided
     // and handle accordingly.
+    final PasswordPolicy authPolicy = pwPolicyState.getAuthenticationPolicy();
     if (selfChange
-        && pwPolicyState.getAuthenticationPolicy()
-            .isPasswordChangeRequiresCurrentPassword()
-        && (!currentPasswordProvided))
+        && authPolicy.isPasswordChangeRequiresCurrentPassword()
+        && !currentPasswordProvided)
     {
       pwpErrorType = PasswordPolicyErrorType.MUST_SUPPLY_OLD_PASSWORD;
 
@@ -1846,9 +1762,7 @@
 
     // If this change would result in multiple password values, then see if
     // that's OK.
-    if ((numPasswords > 1)
-        && (!pwPolicyState.getAuthenticationPolicy()
-            .isAllowMultiplePasswordValues()))
+    if (numPasswords > 1 && !authPolicy.isAllowMultiplePasswordValues())
     {
       pwpErrorType = PasswordPolicyErrorType.PASSWORD_MOD_NOT_ALLOWED;
       throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
@@ -1857,9 +1771,7 @@
 
 
     // If any of the password values should be validated, then do so now.
-    if (selfChange
-        || (!pwPolicyState.getAuthenticationPolicy()
-            .isSkipValidationForAdministrators()))
+    if (selfChange || !authPolicy.isSkipValidationForAdministrators())
     {
       if (newPasswords != null)
       {
@@ -1911,11 +1823,9 @@
           if (! pwPolicyState.passwordIsAcceptable(this, modifiedEntry,
                                    v.getValue(), clearPasswords, invalidReason))
           {
-            pwpErrorType =
-                 PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY;
+            pwpErrorType = PasswordPolicyErrorType.INSUFFICIENT_PASSWORD_QUALITY;
             throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                         ERR_MODIFY_PW_VALIDATION_FAILED.get(
-                                              invalidReason));
+                ERR_MODIFY_PW_VALIDATION_FAILED.get(invalidReason));
           }
         }
       }
@@ -1929,15 +1839,12 @@
       {
         for (AttributeValue v : newPasswords)
         {
-          if (pwPolicyState.isPasswordInHistory(v.getValue()))
+          if (pwPolicyState.isPasswordInHistory(v.getValue())
+              && (selfChange || !authPolicy.isSkipValidationForAdministrators()))
           {
-            if (selfChange || (! pwPolicyState.getAuthenticationPolicy().
-                                      isSkipValidationForAdministrators()))
-            {
-              pwpErrorType = PasswordPolicyErrorType.PASSWORD_IN_HISTORY;
-              throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
-                                           ERR_MODIFY_PW_IN_HISTORY.get());
-            }
+            pwpErrorType = PasswordPolicyErrorType.PASSWORD_IN_HISTORY;
+            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+                ERR_MODIFY_PW_IN_HISTORY.get());
           }
         }
 
@@ -1958,8 +1865,7 @@
     pwPolicyState.clearGraceLoginTimes();
     pwPolicyState.clearWarnedTime();
 
-    if (pwPolicyState.getAuthenticationPolicy().isForceChangeOnAdd() ||
-        pwPolicyState.getAuthenticationPolicy().isForceChangeOnReset())
+    if (authPolicy.isForceChangeOnAdd() || authPolicy.isForceChangeOnReset())
     {
       if (selfChange)
       {
@@ -1967,18 +1873,16 @@
       }
       else
       {
-        if ((pwpErrorType == null) &&
-            pwPolicyState.getAuthenticationPolicy().isForceChangeOnReset())
+        if (pwpErrorType == null && authPolicy.isForceChangeOnReset())
         {
           pwpErrorType = PasswordPolicyErrorType.CHANGE_AFTER_RESET;
         }
 
-        pwPolicyState.setMustChangePassword(
-             pwPolicyState.getAuthenticationPolicy().isForceChangeOnReset());
+        pwPolicyState.setMustChangePassword(authPolicy.isForceChangeOnReset());
       }
     }
 
-    if (pwPolicyState.getAuthenticationPolicy().getRequireChangeByTime() > 0)
+    if (authPolicy.getRequireChangeByTime() > 0)
     {
       pwPolicyState.setRequiredChangeTime();
     }
@@ -1993,7 +1897,7 @@
    * Handles any account status notifications that may be needed as a result of
    * modify processing.
    */
-  protected void handleAccountStatusNotifications()
+  private void handleAccountStatusNotifications()
   {
     if (pwPolicyState == null)
     {
@@ -2075,7 +1979,7 @@
    * @return  {@code true} if processing should continue for the operation, or
    *          {@code false} if not.
    */
-  protected boolean handleConflictResolution() {
+  private boolean handleConflictResolution() {
       for (SynchronizationProvider<?> provider :
           DirectoryServer.getSynchronizationProviders()) {
           try {
@@ -2107,7 +2011,7 @@
    * @return  {@code true} if processing should continue for the operation, or
    *          {@code false} if not.
    */
-  protected boolean processPreOperation() {
+  private boolean processPreOperation() {
       for (SynchronizationProvider<?> provider :
           DirectoryServer.getSynchronizationProviders()) {
           try {
@@ -2136,7 +2040,7 @@
   /**
    * Invoke post operation synchronization providers.
    */
-  protected void processSynchPostOperationPlugins() {
+  private void processSynchPostOperationPlugins() {
       for (SynchronizationProvider<?> provider :
           DirectoryServer.getSynchronizationProviders()) {
           try {
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java
index 02d23b9..8efd9af 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java
@@ -22,13 +22,10 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions copyright 2011-2013 ForgeRock AS.
+ *      Portions copyright 2011-2014 ForgeRock AS.
  */
 package org.opends.server.core;
 
-import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.testng.Assert.*;
-
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.List;
@@ -52,9 +49,14 @@
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.ldap.LDAPConstants.*;
+import static org.testng.Assert.*;
+
 /**
- * A set of test cases for add operations
+ * A set of test cases for add operations.
  */
+@SuppressWarnings("javadoc")
 public class AddOperationTestCase
        extends OperationTestCase
 {
@@ -62,7 +64,7 @@
   /** Some of the tests disable the backends, so we reenable them here. */
   @AfterMethod(alwaysRun=true)
   public void reenableBackend() throws DirectoryException {
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode("o=test"));
     b.setWritabilityMode(WritabilityMode.ENABLED);
   }
 
@@ -77,9 +79,6 @@
   public Object[][] getAddOperations()
          throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     ArrayList<Control> noControls = new ArrayList<Control>();
 
     ArrayList<RawAttribute> ldapAttrList = new ArrayList<RawAttribute>();
@@ -101,17 +100,17 @@
 
     Operation[] opArray = new Operation[]
     {
-      new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+      new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                        null, ByteString.valueOf("ou=People,o=test"),
                        ldapAttrList),
-      new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+      new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                        noControls, ByteString.valueOf("ou=People,o=test"),
                        ldapAttrList),
-      new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+      new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                        null, entry.getDN(), entry.getObjectClasses(),
                        entry.getUserAttributes(),
                        entry.getOperationalAttributes()),
-      new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+      new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                        noControls, entry.getDN(), entry.getObjectClasses(),
                        entry.getUserAttributes(),
                        entry.getOperationalAttributes()),
@@ -129,9 +128,7 @@
 
 
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   protected Operation[] createTestOperations()
          throws Exception
@@ -179,9 +176,6 @@
   @Test()
   public void testGetEntryDNInitiallyNull()
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     ArrayList<RawAttribute> ldapAttrList = new ArrayList<RawAttribute>();
 
     ArrayList<ByteString> values = new ArrayList<ByteString>();
@@ -194,7 +188,7 @@
     ldapAttrList.add(new LDAPAttribute("ou", values));
 
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           null, ByteString.valueOf("ou=People,o=test"),
                           ldapAttrList);
     assertNotNull(addOperation.getEntryDN());
@@ -212,9 +206,6 @@
   public void testGetEntryDNInitiallyNonNull()
          throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     Entry entry = TestCaseUtils.makeEntry(
          "dn: ou=People,o=test",
          "objectClass: top",
@@ -222,7 +213,7 @@
          "ou: People");
 
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           null, entry.getDN(), entry.getObjectClasses(),
                           entry.getUserAttributes(),
                           entry.getOperationalAttributes());
@@ -242,9 +233,6 @@
   public void testGetEntryDNNonNullChangedToNull()
          throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     Entry entry = TestCaseUtils.makeEntry(
          "dn: ou=People,o=test",
          "objectClass: top",
@@ -252,7 +240,7 @@
          "ou: People");
 
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           null, entry.getDN(), entry.getObjectClasses(),
                           entry.getUserAttributes(),
                           entry.getOperationalAttributes());
@@ -285,29 +273,24 @@
     values.add(ByteString.valueOf("foo"));
     addOperation.addRawAttribute(new LDAPAttribute("description", values));
 
-    boolean found = false;
-    for (RawAttribute a : addOperation.getRawAttributes())
-    {
-      if (a.getAttributeType().equalsIgnoreCase("description"))
-      {
-        found = true;
-        break;
-      }
-    }
-    assertTrue(found);
+    assertTrue(find(addOperation));
 
     addOperation.setRawAttributes(rawAttrs);
 
-    found = false;
+    assertFalse(find(addOperation));
+  }
+
+  private boolean find(AddOperation addOperation)
+  {
+    boolean found = false;
     for (RawAttribute a : addOperation.getRawAttributes())
     {
-      if (a.getAttributeType().equalsIgnoreCase("description"))
+      if ("description".equalsIgnoreCase(a.getAttributeType()))
       {
-        found = true;
-        break;
+        return true;
       }
     }
-    assertFalse(found);
+    return found;
   }
 
 
@@ -329,18 +312,12 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     UpdatePreOpPlugin.reset();
 
     ObjectClass oc = DirectoryServer.getObjectClass("extensibleobject", true);
     UpdatePreOpPlugin.addObjectClassToAdd(oc);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -370,18 +347,12 @@
          "objectClass: extensibleObject",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     UpdatePreOpPlugin.reset();
 
     ObjectClass oc = DirectoryServer.getObjectClass("extensibleobject", true);
     UpdatePreOpPlugin.addObjectClassToRemove(oc);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -412,18 +383,12 @@
          "ou: People",
          "description: foo");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     UpdatePreOpPlugin.reset();
 
     Attribute a = Attributes.create("description", "bar");
     UpdatePreOpPlugin.addAttributeToSet(a);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -475,18 +440,12 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     UpdatePreOpPlugin.reset();
 
     Attribute a = Attributes.create("description", "foo");
     UpdatePreOpPlugin.addAttributeToSet(a);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -518,19 +477,13 @@
          "ou: People",
          "description: foo");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     UpdatePreOpPlugin.reset();
 
     AttributeType attrType = DirectoryServer.getAttributeType("description",
                                                               true);
     UpdatePreOpPlugin.addAttributeToRemove(attrType);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -556,9 +509,6 @@
     assertTrue(addOperation.getProcessingStopTime() >=
                addOperation.getProcessingStartTime());
     assertTrue(addOperation.getProcessingTime() >= 0);
-
-    long changeNumber = addOperation.getChangeNumber();
-    addOperation.setChangeNumber(changeNumber);
   }
 
 
@@ -586,11 +536,8 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperation addOperation =
-         conn.processAdd(ByteString.valueOf("ou=People,o=test"), attrs);
+         getRootConnection().processAdd(ByteString.valueOf("ou=People,o=test"), attrs);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
   }
@@ -615,13 +562,7 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
   }
@@ -651,11 +592,8 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperation addOperation =
-         conn.processAdd(ByteString.valueOf("invalid"), attrs);
+         getRootConnection().processAdd(ByteString.valueOf("invalid"), attrs);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -684,11 +622,8 @@
     values.add(ByteString.valueOf("test"));
     attrs.add(new LDAPAttribute("o", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperation addOperation =
-         conn.processAdd(ByteString.valueOf("o=test"), attrs);
+         getRootConnection().processAdd(ByteString.valueOf("o=test"), attrs);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -717,11 +652,8 @@
     values.add(ByteString.valueOf("undefined"));
     attrs.add(new LDAPAttribute("o", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperation addOperation =
-         conn.processAdd(ByteString.valueOf("o=undefined"), attrs);
+         getRootConnection().processAdd(ByteString.valueOf("o=undefined"), attrs);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -750,8 +682,7 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=undefined"), attrs);
@@ -783,8 +714,7 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=missing,o=test"),
@@ -886,8 +816,7 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=test"),
@@ -923,13 +852,7 @@
          "ds-pwp-password-policy-dn: cn=Clear UserPassword Policy," +
               "cn=Password Policies,cn=config");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
   }
@@ -967,8 +890,7 @@
     values.add(ByteString.valueOf("bar"));
     attrs.add(new LDAPAttribute("description", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=test"),
@@ -1009,8 +931,7 @@
     values.add(ByteString.valueOf("foo"));
     attrs.add(new LDAPAttribute("description;lang-en-us", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=test"),
@@ -1047,8 +968,7 @@
     values.add(ByteString.valueOf("foo"));
     attrs.add(new LDAPAttribute("description;lang-en-us", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.valueOf("ou=People,o=test"),
@@ -1086,13 +1006,7 @@
          "cn;lang-en-us: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
   }
@@ -1123,8 +1037,7 @@
     values.add(ByteString.valueOf("Root DSE"));
     attrs.add(new LDAPAttribute("cn", values));
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(ByteString.empty(), attrs);
@@ -1149,13 +1062,7 @@
          "objectClass: top",
          "objectClass: organizationalUnit");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -1184,13 +1091,7 @@
          "objectClass: top",
          "objectClass: organizationalUnit");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
 
     DirectoryServer.setAddMissingRDNAttributes(true);
@@ -1219,13 +1120,7 @@
          "cn: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -1239,7 +1134,7 @@
     {
       for (AttributeValue v : a)
       {
-        if (v.getValue().toString().equalsIgnoreCase("top"))
+        if ("top".equalsIgnoreCase(v.getValue().toString()))
         {
           found = true;
           break;
@@ -1266,13 +1161,7 @@
          "dn: ou=People,o=test",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1295,13 +1184,7 @@
          "objectClass: top",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1325,13 +1208,7 @@
          "objectClass: extensibleObject",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1358,13 +1235,7 @@
          "cn: Test User",
          "sn: User");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1392,13 +1263,7 @@
          "sn: User",
          "userPassword: password"); // Missing cn
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1428,13 +1293,7 @@
          "sn: User",
          "userPassword: password"); // Missing cn
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1465,13 +1324,7 @@
          "userPassword: password",
          "dc: Not allowed by inetOrgPerson");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
   }
 
@@ -1504,13 +1357,7 @@
          "userPassword: password",
          "dc: Not allowed by inetOrgPerson but allowed by extensibleObject");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
   }
@@ -1543,8 +1390,7 @@
     userAttrs.put(attrType, attrList);
 
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
 
     AddOperation addOperation =
          conn.processAdd(entry.getDN(), entry.getObjectClasses(), userAttrs,
@@ -1578,15 +1424,9 @@
          "cn: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     DirectoryServer.setWritabilityMode(WritabilityMode.DISABLED);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
 
     DirectoryServer.setWritabilityMode(WritabilityMode.ENABLED);
@@ -1618,15 +1458,9 @@
          "cn: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     DirectoryServer.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -1724,16 +1558,10 @@
          "cn: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode("o=test"));
     b.setWritabilityMode(WritabilityMode.DISABLED);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
 
     b.setWritabilityMode(WritabilityMode.ENABLED);
@@ -1765,16 +1593,10 @@
          "cn: Test User",
          "userPassword: password");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode("o=test"));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -1822,7 +1644,7 @@
     values.add(ByteString.valueOf("People"));
     attrs.add(new LDAPAttribute("ou", values));
 
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode("o=test"));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
     long addRequests  = ldapStatistics.getAddRequests();
@@ -1872,13 +1694,7 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(addOperation);
 
@@ -1911,13 +1727,7 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
-    AddOperation addOperation =
-         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                         entry.getUserAttributes(),
-                         entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertFalse(addOperation.getResultCode() == ResultCode.SUCCESS);
 
     assertEquals(changeListener.getAddCount(), 0);
@@ -1943,11 +1753,8 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           null, entry.getDN(), entry.getObjectClasses(),
                           entry.getUserAttributes(),
                           entry.getOperationalAttributes());
@@ -1976,11 +1783,8 @@
          "objectClass: organizationalUnit",
          "ou: People");
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           null, entry.getDN(), entry.getObjectClasses(),
                           entry.getUserAttributes(),
                           entry.getOperationalAttributes());
@@ -2019,13 +1823,7 @@
            "objectClass: organizationalUnit",
            "ou: People");
 
-      InternalClientConnection conn =
-           InternalClientConnection.getRootConnection();
-
-      AddOperation addOperation =
-           conn.processAdd(entry.getDN(), entry.getObjectClasses(),
-                           entry.getUserAttributes(),
-                           entry.getOperationalAttributes());
+      AddOperation addOperation = getRootConnection().processAdd(entry);
       assertEquals(addOperation.getResultCode(), ResultCode.BUSY);
     }
     finally
@@ -2483,9 +2281,6 @@
   {
     TestCaseUtils.initializeTestBackend(false);
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     List<Control> controls =
          ShortCircuitPlugin.createShortCircuitControlList(0, "PreParse");
 
@@ -2498,7 +2293,7 @@
     rawAttrs.add(RawAttribute.create("o", "test"));
 
     AddOperationBasis addOperation =
-         new AddOperationBasis(conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
+         new AddOperationBasis(getRootConnection(), nextOperationID(), nextMessageID(),
                           controls, ByteString.valueOf("o=test"), rawAttrs);
     addOperation.run();
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java
index 55c9167..dbe200a 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java
@@ -22,13 +22,10 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions copyright 2011-2013 ForgeRock AS.
+ *      Portions copyright 2011-2014 ForgeRock AS.
  */
 package org.opends.server.core;
 
-import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.testng.Assert.*;
-
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.List;
@@ -52,8 +49,12 @@
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.Test;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.ldap.LDAPConstants.*;
+import static org.testng.Assert.*;
+
 /**
- * A set of test cases for delete operations
+ * A set of test cases for delete operations.
  */
 @SuppressWarnings("javadoc")
 public class DeleteOperationTestCase extends OperationTestCase
@@ -62,13 +63,11 @@
   /** Some of the tests disable the backends, so we reenable them here. */
   @AfterMethod(alwaysRun=true)
   public void reenableBackend() throws DirectoryException {
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode("o=test"));
     b.setWritabilityMode(WritabilityMode.ENABLED);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   protected Operation[] createTestOperations()
          throws Exception
@@ -91,9 +90,7 @@
       List<Control> requestControls, ByteString rawEntryDn)
   {
     return new DeleteOperationBasis(
-        InternalClientConnection.getRootConnection(),
-        InternalClientConnection.nextOperationID(),
-        InternalClientConnection.nextMessageID(),
+        getRootConnection(), nextOperationID(), nextMessageID(),
         requestControls, rawEntryDn);
   }
 
@@ -101,9 +98,7 @@
       List<Control> requestControls, DN entryDn)
   {
     return new DeleteOperationBasis(
-        InternalClientConnection.getRootConnection(),
-        InternalClientConnection.nextOperationID(),
-        InternalClientConnection.nextMessageID(),
+        getRootConnection(), nextOperationID(), nextMessageID(),
         requestControls, entryDn);
   }
 
@@ -196,10 +191,6 @@
     assertTrue(deleteOperation.getProcessingStopTime() >=
                deleteOperation.getProcessingStartTime());
     assertTrue(deleteOperation.getProcessingTime() >= 0);
-
-
-    long changeNumber = deleteOperation.getChangeNumber();
-    deleteOperation.setChangeNumber(changeNumber);
   }
 
 
@@ -220,7 +211,7 @@
     assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveCompletedOperationElements(deleteOperation);
     List<LocalBackendDeleteOperation> localOps =
-      (List) (deleteOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS));
+      (List) deleteOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS);
     assertNotNull(localOps);
     for (LocalBackendDeleteOperation curOp : localOps)
     {
@@ -230,26 +221,20 @@
 
   private DeleteOperation processDeleteRaw(String entryDN)
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    InternalClientConnection conn =getRootConnection();
     return conn.processDelete(ByteString.valueOf(entryDN));
   }
 
   private DeleteOperation processDelete(String entryDN) throws DirectoryException
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    InternalClientConnection conn =getRootConnection();
     return conn.processDelete(DN.decode(entryDN));
   }
 
   private void processAdd(String... entryLines) throws Exception
   {
     Entry e = TestCaseUtils.makeEntry(entryLines);
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-    AddOperation addOperation =
-        conn.processAdd(e.getDN(), e.getObjectClasses(), e.getUserAttributes(),
-            e.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(e);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
   }
 
@@ -268,7 +253,7 @@
     DeleteOperation deleteOperation = processDeleteRaw("ou=People,o=test");
     assertFalse(deleteOperation.getResultCode() == ResultCode.SUCCESS);
     List<LocalBackendDeleteOperation> localOps =
-      (List) (deleteOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS));
+      (List) deleteOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS);
     assertNotNull(localOps);
     for (LocalBackendDeleteOperation curOp : localOps)
     {
@@ -623,7 +608,7 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    Backend backend = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> backend = DirectoryServer.getBackend(DN.decode("o=test"));
     backend.setWritabilityMode(WritabilityMode.DISABLED);
 
     DeleteOperation deleteOperation = processDeleteRaw("o=test");
@@ -646,7 +631,7 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    Backend backend = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> backend = DirectoryServer.getBackend(DN.decode("o=test"));
     backend.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
     DeleteOperation deleteOperation = processDeleteRaw("o=test");
@@ -669,7 +654,7 @@
   {
     TestCaseUtils.initializeTestBackend(true);
 
-    Backend backend = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend<?> backend = DirectoryServer.getBackend(DN.decode("o=test"));
     backend.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
     String[] args = getArgs("o=test");
@@ -966,10 +951,7 @@
           break responseLoop;
         default:
           // This is a problem.  It's an unexpected response.
-          try
-          {
-            s.close();
-          } catch (Exception e) {}
+          StaticUtils.close(s);
 
           throw new Exception("Unexpected response message " + message +
                               " encountered in " +
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
index 58e9786..107de9e 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
@@ -22,14 +22,10 @@
  *
  *
  *      Copyright 2006-2011 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
-import static org.opends.server.TestCaseUtils.*;
-import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.testng.Assert.*;
-
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -54,8 +50,13 @@
 import org.opends.server.workflowelement.localbackend.LocalBackendModifyOperation;
 import org.testng.annotations.*;
 
+import static org.opends.server.TestCaseUtils.*;
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.protocols.ldap.LDAPConstants.*;
+import static org.testng.Assert.*;
+
 /**
- * A set of test cases for modify operations
+ * A set of test cases for modify operations.
  */
 @SuppressWarnings("javadoc")
 public class ModifyOperationTestCase
@@ -67,14 +68,13 @@
     TestCaseUtils.restartServer();
   }
 
-  // Some of the tests disable the backends, so we reenable them here.
+  /** Some of the tests disable the backends, so we reenable them here. */
   @AfterMethod(alwaysRun=true)
   public void reenableBackend() throws DirectoryException {
-    Object[][] backendBaseDNs = getBaseDNs();
-    for (Object[] backendBaseDN2 : backendBaseDNs)
+    for (Object[] backendBaseDN2 : getBaseDNs())
     {
-      String backendBaseDN = backendBaseDN2[0].toString();
-      Backend b = DirectoryServer.getBackend(DN.decode(backendBaseDN));
+      final DN baseDN = DN.decode(backendBaseDN2[0].toString());
+      Backend<?> b = DirectoryServer.getBackend(baseDN);
       b.setWritabilityMode(WritabilityMode.ENABLED);
     }
   }
@@ -208,9 +208,7 @@
       DN entryDn, List<Modification> modifications)
   {
     return new ModifyOperationBasis(
-        InternalClientConnection.getRootConnection(),
-        InternalClientConnection.nextOperationID(),
-        InternalClientConnection.nextMessageID(),
+        getRootConnection(), nextOperationID(), nextMessageID(),
         requestControls, entryDn, modifications);
   }
 
@@ -218,9 +216,7 @@
       ByteString rawEntryDn, List<RawModification> rawModifications)
   {
     return new ModifyOperationBasis(
-        InternalClientConnection.getRootConnection(),
-        InternalClientConnection.nextOperationID(),
-        InternalClientConnection.nextMessageID(),
+        getRootConnection(), nextOperationID(), nextMessageID(),
         requestControls, rawEntryDn, rawModifications);
   }
 
@@ -239,9 +235,7 @@
   }
 
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override()
   protected Operation[] createTestOperations()
          throws Exception
@@ -373,8 +367,7 @@
 
     modifyOperation.addRawModification(replace(attr));
 
-    assertEquals(modifyOperation.getRawModifications().size(),
-                 (rawMods.size() + 1));
+    assertEquals(modifyOperation.getRawModifications().size(), rawMods.size() + 1);
 
     modifyOperation.setRawModifications(rawMods);
     assertEquals(modifyOperation.getRawModifications().size(), rawMods.size());
@@ -398,7 +391,7 @@
     assertTrue(modifyOperation.getProcessingTime() >= 0);
 
     List<LocalBackendModifyOperation> localOps =
-      (List) (modifyOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS));
+      (List) modifyOperation.getAttachment(Operation.LOCALBACKENDOPERATIONS);
     assertNotNull(localOps);
     for (LocalBackendModifyOperation curOp : localOps)
     {
@@ -407,9 +400,6 @@
       assertNotNull(curOp.getCurrentEntry());
       assertNotNull(curOp.getModifiedEntry());
     }
-
-    long changeNumber = modifyOperation.getChangeNumber();
-    modifyOperation.setChangeNumber(changeNumber);
   }
 
 
@@ -428,9 +418,6 @@
     assertTrue(modifyOperation.getProcessingStopTime() >=
                modifyOperation.getProcessingStartTime());
     assertTrue(modifyOperation.getProcessingTime() >= 0);
-
-    long changeNumber = modifyOperation.getChangeNumber();
-    modifyOperation.setChangeNumber(changeNumber);
   }
 
 
@@ -454,15 +441,12 @@
              Attributes.create("description", "foo")));
 
 
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-
     List<Modification> mods = new ArrayList<Modification>();
     mods.add(new Modification(ModificationType.REPLACE,
         Attributes.create("l", "Austin")));
 
     ModifyOperation modifyOperation =
-         conn.processModify(DN.decode("o=test"), mods);
+        getRootConnection().processModify(DN.decode("o=test"), mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
@@ -793,34 +777,27 @@
   private ModifyOperation processModify(String entryDN,
       List<RawModification> mods)
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
     return conn.processModify(ByteString.valueOf(entryDN), mods);
   }
 
   private ModifyOperation processModify(String entryDN, RawModification... mods)
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
     return conn.processModify(ByteString.valueOf(entryDN), Arrays.asList(mods));
   }
 
   private ModifyOperation processModify(String entryDN,
       List<RawModification> mods, List<Control> requestControls)
   {
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
+    InternalClientConnection conn = getRootConnection();
     return conn.processModify(ByteString.valueOf(entryDN), mods, requestControls);
   }
 
   private void processAdd(String... entryLines) throws Exception
   {
     Entry entry = TestCaseUtils.makeEntry(entryLines);
-    InternalClientConnection conn =
-        InternalClientConnection.getRootConnection();
-    AddOperation addOperation =
-        conn.processAdd(entry.getDN(), entry.getObjectClasses(), entry
-            .getUserAttributes(), entry.getOperationalAttributes());
+    AddOperation addOperation = getRootConnection().processAdd(entry);
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
   }
 
@@ -1425,9 +1402,7 @@
 
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              InternalClientConnection.getRootConnection(),
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf("uid=test.user," + baseDN),
               SearchScope.WHOLE_SUBTREE,
@@ -1477,9 +1452,7 @@
 
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              InternalClientConnection.getRootConnection(),
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf(baseDN),
               SearchScope.WHOLE_SUBTREE,
@@ -1532,9 +1505,7 @@
 
     InternalSearchOperation searchOperation =
          new InternalSearchOperation(
-              InternalClientConnection.getRootConnection(),
-              InternalClientConnection.nextOperationID(),
-              InternalClientConnection.nextMessageID(),
+              getRootConnection(), nextOperationID(), nextMessageID(),
               new ArrayList<Control>(),
               ByteString.valueOf(baseDN),
               SearchScope.WHOLE_SUBTREE,
@@ -2617,7 +2588,7 @@
          "mail: foo",
          "employeeNumber: 1");
 
-    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.DISABLED);
 
     LDAPAttribute attr = newLDAPAttribute("objectClass", "extensibleObject");
@@ -2655,7 +2626,7 @@
          "mail: foo",
          "employeeNumber: 1");
 
-    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
     LDAPAttribute attr = newLDAPAttribute("objectClass", "extensibleObject");
@@ -2693,7 +2664,7 @@
          "mail: foo",
          "employeeNumber: 1");
 
-    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
+    Backend<?> b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
 
@@ -3559,7 +3530,7 @@
         "cn: Test User",
         "userPassword: password",
         "userPassword;deleted: oldpassword");
-    Backend backend = DirectoryServer.getBackend(TEST_BACKEND_ID);
+    Backend<?> backend = DirectoryServer.getBackend(TEST_BACKEND_ID);
     backend.addEntry(e, null); // Don't use add operation.
 
     // Constraint violation.
@@ -3601,7 +3572,7 @@
         "cn: Test User",
         "userPassword: password",
         "userPassword;deleted: oldpassword");
-    Backend backend = DirectoryServer.getBackend(TEST_BACKEND_ID);
+    Backend<?> backend = DirectoryServer.getBackend(TEST_BACKEND_ID);
     backend.addEntry(e, null); // Don't use add operation.
 
     // Constraint violation.

--
Gitblit v1.10.0