diff --git a/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java b/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java
index 5702d86..201e6af 100644
--- a/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java
+++ b/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java
@@ -17,12 +17,7 @@
 package org.apache.ldap.server.interceptor;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
+import java.util.*;
 
 import javax.naming.ConfigurationException;
 import javax.naming.Name;
@@ -34,10 +29,13 @@
 
 import org.apache.ldap.common.filter.ExprNode;
 import org.apache.ldap.server.DirectoryServiceConfiguration;
+import org.apache.ldap.server.invocation.Invocation;
+import org.apache.ldap.server.invocation.InvocationStack;
 import org.apache.ldap.server.configuration.DirectoryPartitionConfiguration;
 import org.apache.ldap.server.configuration.InterceptorConfiguration;
 import org.apache.ldap.server.configuration.MutableInterceptorConfiguration;
 import org.apache.ldap.server.partition.DirectoryPartitionNexus;
+import org.apache.ldap.server.partition.DirectoryPartitionNexusProxy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -453,10 +451,51 @@
     }
 
 
+    /**
+     * Gets the InterceptorEntry to use first with bypass information considered.
+     *
+     * @return the first entry to use.
+     */
+    private Entry getStartingEntry()
+    {
+        if ( InvocationStack.getInstance().isEmpty() )
+        {
+            return head;
+        }
+
+        Invocation invocation = InvocationStack.getInstance().peek();
+        if ( ! invocation.hasBypass() )
+        {
+            return head;
+        }
+
+        if ( ! invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
+        {
+            return tail;
+        }
+
+        Entry next = head;
+        while ( next != tail )
+        {
+            if ( invocation.isBypassed( next.configuration.getName() ) )
+            {
+                next = next.nextEntry;
+            }
+            else
+            {
+                return next;
+            }
+        }
+
+        return tail;
+    }
+
+
     public Attributes getRootDSE() throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.getRootDSE( next );
@@ -475,8 +514,9 @@
 
     public Name getMatchedName( Name name, boolean normalized ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.getMatchedName( next, name, normalized );
@@ -495,8 +535,9 @@
 
     public Name getSuffix( Name name, boolean normalized ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.getSuffix( next, name, normalized );
@@ -515,8 +556,9 @@
 
     public boolean compare( Name name, String oid, Object value ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.compare( next, name, oid, value );
@@ -535,8 +577,9 @@
 
     public Iterator listSuffixes( boolean normalized ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.listSuffixes( next, normalized );
@@ -554,8 +597,9 @@
 
     public void addContextPartition( DirectoryPartitionConfiguration cfg ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.addContextPartition( next, cfg );
@@ -573,8 +617,9 @@
 
     public void removeContextPartition( Name suffix ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.removeContextPartition( next, suffix );
@@ -592,8 +637,9 @@
 
     public void delete( Name name ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.delete( next, name );
@@ -611,8 +657,9 @@
 
     public void add( String upName, Name normName, Attributes entry ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry node = getStartingEntry();
+        Interceptor head = node.configuration.getInterceptor();
+        NextInterceptor next = node.nextInterceptor;
         try
         {
             head.add( next, upName, normName, entry );
@@ -630,8 +677,9 @@
 
     public void modify( Name name, int modOp, Attributes mods ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.modify( next, name, modOp, mods );
@@ -649,8 +697,9 @@
 
     public void modify( Name name, ModificationItem[] mods ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.modify( next, name, mods );
@@ -668,8 +717,9 @@
 
     public NamingEnumeration list( Name base ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.list( next, base );
@@ -688,8 +738,9 @@
 
     public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.search( next, base, env, filter, searchCtls );
@@ -708,8 +759,9 @@
 
     public Attributes lookup( Name name ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.lookup( next, name );
@@ -728,8 +780,9 @@
 
     public Attributes lookup( Name dn, String[] attrIds ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.lookup( next, dn, attrIds );
@@ -748,8 +801,9 @@
 
     public boolean hasEntry( Name name ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.hasEntry( next, name );
@@ -768,8 +822,9 @@
 
     public boolean isSuffix( Name name ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             return head.isSuffix( next, name );
@@ -788,8 +843,9 @@
 
     public void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.modifyRn( next, name, newRn, deleteOldRn );
@@ -807,8 +863,9 @@
 
     public void move( Name oriChildName, Name newParentName ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.move( next, oriChildName, newParentName );
@@ -826,8 +883,9 @@
 
     public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException
     {
-        Interceptor head = this.head.configuration.getInterceptor();
-        NextInterceptor next = this.head.nextInterceptor;
+        Entry entry = getStartingEntry();
+        Interceptor head = entry.configuration.getInterceptor();
+        NextInterceptor next = entry.nextInterceptor;
         try
         {
             head.move( next, oriChildName, newParentName, newRn, deleteOldRn );
@@ -870,13 +928,48 @@
             this.configuration = configuration;
             this.nextInterceptor = new NextInterceptor()
             {
+                private Entry getNextEntry()
+                {
+                    if ( InvocationStack.getInstance().isEmpty() )
+                    {
+                        return Entry.this.nextEntry;
+                    }
+
+                    Invocation invocation = InvocationStack.getInstance().peek();
+                    if ( ! invocation.hasBypass() )
+                    {
+                        return Entry.this.nextEntry;
+                    }
+
+                    if ( ! invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
+                    {
+                        return tail;
+                    }
+
+                    Entry next = Entry.this.nextEntry;
+                    while ( next != tail )
+                    {
+                        if ( invocation.isBypassed( next.configuration.getName() ) )
+                        {
+                            next = next.nextEntry;
+                        }
+                        else
+                        {
+                            return next;
+                        }
+                    }
+
+                    return next;
+                }
+
                 public boolean compare( Name name, String oid, Object value ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.compare( Entry.this.nextEntry.nextInterceptor, name, oid, value );
+                        return interceptor.compare( next.nextInterceptor, name, oid, value );
                     }
                     catch ( NamingException ne )
                     {
@@ -892,11 +985,12 @@
 
                 public Attributes getRootDSE() throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.getRootDSE( Entry.this.nextEntry.nextInterceptor );
+                        return interceptor.getRootDSE( next.nextInterceptor );
                     }
                     catch ( NamingException ne )
                     {
@@ -911,11 +1005,12 @@
 
                 public Name getMatchedName( Name dn, boolean normalized ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.getMatchedName( Entry.this.nextEntry.nextInterceptor, dn, normalized );
+                        return interceptor.getMatchedName( next.nextInterceptor, dn, normalized );
                     }
                     catch ( NamingException ne )
                     {
@@ -930,11 +1025,12 @@
 
                 public Name getSuffix( Name dn, boolean normalized ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.getSuffix( Entry.this.nextEntry.nextInterceptor, dn, normalized );
+                        return interceptor.getSuffix( next.nextInterceptor, dn, normalized );
                     }
                     catch ( NamingException ne )
                     {
@@ -949,11 +1045,12 @@
 
                 public Iterator listSuffixes( boolean normalized ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.listSuffixes( Entry.this.nextEntry.nextInterceptor, normalized );
+                        return interceptor.listSuffixes( next.nextInterceptor, normalized );
                     }
                     catch ( NamingException ne )
                     {
@@ -968,11 +1065,12 @@
 
                 public void delete( Name name ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.delete( Entry.this.nextEntry.nextInterceptor, name );
+                        interceptor.delete( next.nextInterceptor, name );
                     }
                     catch ( NamingException ne )
                     {
@@ -986,11 +1084,12 @@
 
                 public void add( String upName, Name normName, Attributes entry ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.add( Entry.this.nextEntry.nextInterceptor, upName, normName, entry );
+                        interceptor.add( next.nextInterceptor, upName, normName, entry );
                     }
                     catch ( NamingException ne )
                     {
@@ -1004,11 +1103,12 @@
 
                 public void modify( Name name, int modOp, Attributes mods ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.modify( Entry.this.nextEntry.nextInterceptor, name, modOp, mods );
+                        interceptor.modify( next.nextInterceptor, name, modOp, mods );
                     }
                     catch ( NamingException ne )
                     {
@@ -1022,11 +1122,12 @@
 
                 public void modify( Name name, ModificationItem[] mods ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.modify( Entry.this.nextEntry.nextInterceptor, name, mods );
+                        interceptor.modify( next.nextInterceptor, name, mods );
                     }
                     catch ( NamingException ne )
                     {
@@ -1040,11 +1141,12 @@
 
                 public NamingEnumeration list( Name base ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.list( Entry.this.nextEntry.nextInterceptor, base );
+                        return interceptor.list( next.nextInterceptor, base );
                     }
                     catch ( NamingException ne )
                     {
@@ -1059,11 +1161,12 @@
 
                 public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.search( Entry.this.nextEntry.nextInterceptor, base, env, filter, searchCtls );
+                        return interceptor.search( next.nextInterceptor, base, env, filter, searchCtls );
                     }
                     catch ( NamingException ne )
                     {
@@ -1078,11 +1181,12 @@
 
                 public Attributes lookup( Name name ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.lookup( Entry.this.nextEntry.nextInterceptor, name );
+                        return interceptor.lookup( next.nextInterceptor, name );
                     }
                     catch ( NamingException ne )
                     {
@@ -1097,11 +1201,12 @@
 
                 public Attributes lookup( Name dn, String[] attrIds ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.lookup( Entry.this.nextEntry.nextInterceptor, dn, attrIds );
+                        return interceptor.lookup( next.nextInterceptor, dn, attrIds );
                     }
                     catch ( NamingException ne )
                     {
@@ -1116,11 +1221,12 @@
 
                 public boolean hasEntry( Name name ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.hasEntry( Entry.this.nextEntry.nextInterceptor, name );
+                        return interceptor.hasEntry( next.nextInterceptor, name );
                     }
                     catch ( NamingException ne )
                     {
@@ -1135,11 +1241,12 @@
 
                 public boolean isSuffix( Name name ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        return interceptor.isSuffix( Entry.this.nextEntry.nextInterceptor, name );
+                        return interceptor.isSuffix( next.nextInterceptor, name );
                     }
                     catch ( NamingException ne )
                     {
@@ -1154,11 +1261,12 @@
 
                 public void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.modifyRn( Entry.this.nextEntry.nextInterceptor, name, newRn, deleteOldRn );
+                        interceptor.modifyRn( next.nextInterceptor, name, newRn, deleteOldRn );
                     }
                     catch ( NamingException ne )
                     {
@@ -1172,11 +1280,12 @@
 
                 public void move( Name oriChildName, Name newParentName ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.move( Entry.this.nextEntry.nextInterceptor, oriChildName, newParentName );
+                        interceptor.move( next.nextInterceptor, oriChildName, newParentName );
                     }
                     catch ( NamingException ne )
                     {
@@ -1190,11 +1299,12 @@
 
                 public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.move( Entry.this.nextEntry.nextInterceptor, oriChildName, newParentName, newRn, deleteOldRn );
+                        interceptor.move( next.nextInterceptor, oriChildName, newParentName, newRn, deleteOldRn );
                     }
                     catch ( NamingException ne )
                     {
@@ -1208,11 +1318,12 @@
 
                 public void addContextPartition( DirectoryPartitionConfiguration cfg ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.addContextPartition( Entry.this.nextEntry.nextInterceptor, cfg );
+                        interceptor.addContextPartition( next.nextInterceptor, cfg );
                     }
                     catch ( NamingException ne )
                     {
@@ -1227,11 +1338,12 @@
 
                 public void removeContextPartition( Name suffix ) throws NamingException
                 {
-                    Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor();
+                    Entry next = getNextEntry();
+                    Interceptor interceptor = next.configuration.getInterceptor();
 
                     try
                     {
-                        interceptor.removeContextPartition( Entry.this.nextEntry.nextInterceptor, suffix );
+                        interceptor.removeContextPartition( next.nextInterceptor, suffix );
                     }
                     catch ( NamingException ne )
                     {
diff --git a/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java b/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java
index 4baeffb..9d3bc90 100644
--- a/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java
+++ b/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java
@@ -20,10 +20,12 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Collection;
 
 import javax.naming.Context;
 
 import org.apache.ldap.server.partition.DirectoryPartitionNexus;
+import org.apache.ldap.server.partition.DirectoryPartitionNexusProxy;
 
 
 /**
@@ -37,27 +39,50 @@
     private final Context caller;
     private final String name;
     private final List parameters;
-    
+    private final Collection bypassed;
+    private final DirectoryPartitionNexusProxy proxy;
+
+
     /**
      * Creates a new instance that represents an invocation without parameters.
      * 
-     * @parem caller the JNDI {@link Context} that made this invocation
+     * @param caller the JNDI {@link Context} that made this invocation
      * @param name the name of the called method
      */
-    public Invocation( Context caller, String name )
+    public Invocation( DirectoryPartitionNexusProxy proxy, Context caller, String name )
     {
-        this( caller, name, null );
+        this( proxy, caller, name, null, Collections.EMPTY_SET );
     }
 
+
+    /**
+     * Creates a new instance.
+     *
+     * @param caller the JNDI {@link Context} that made this invocation
+     * @param name the name of the called method
+     * @param parameters the array of parameters passed to the called method
+     */
+    public Invocation( DirectoryPartitionNexusProxy proxy, Context caller, String name, Object[] parameters )
+    {
+        this( proxy, caller, name, parameters, Collections.EMPTY_SET );
+    }
+
+
     /**
      * Creates a new instance.
      * 
-     * @parem caller the JNDI {@link Context} that made this invocation
+     * @param caller the JNDI {@link Context} that made this invocation
      * @param name the name of the called method
      * @param parameters the array of parameters passed to the called method
+     * @param bypassed the set of bypassed Interceptor names
      */
-    public Invocation( Context caller, String name, Object[] parameters )
+    public Invocation( DirectoryPartitionNexusProxy proxy, Context caller, String name, Object[] parameters,
+                       Collection bypassed )
     {
+        if( proxy == null )
+        {
+            throw new NullPointerException( "proxy" );
+        }
         if( caller == null )
         {
             throw new NullPointerException( "caller" );
@@ -66,24 +91,44 @@
         {
             throw new NullPointerException( "name" );
         }
-        
+
         if( parameters == null )
         {
             parameters = new Object[ 0 ];
         }
-        
+
+        if ( bypassed == null )
+        {
+            this.bypassed = Collections.EMPTY_SET;
+        }
+        else
+        {
+            this.bypassed = Collections.unmodifiableCollection( bypassed );
+        }
+
+        this.proxy = proxy;
         this.caller = caller;
         this.name = name;
-        
+
         List paramList = new ArrayList();
         for( int i = 0; i < parameters.length; i++ )
         {
             paramList.add( parameters[ i ] );
         }
-        
+
         this.parameters = Collections.unmodifiableList( paramList );
     }
-    
+
+
+    /**
+     * Returns the proxy object to the {@link DirectoryPartitionNexus}.
+     */
+    public DirectoryPartitionNexusProxy getProxy()
+    {
+        return proxy;
+    }
+
+
     /**
      * Returns the JNDI {@link Context} which made this invocation.
      */
@@ -91,7 +136,8 @@
     {
         return caller;
     }
-    
+
+
     /**
      * Returns the name of the called method.
      */
@@ -99,7 +145,8 @@
     {
         return name;
     }
-    
+
+
     /**
      * Returns the list of parameters parameters passed to the called method.
      */
@@ -107,4 +154,27 @@
     {
         return parameters;
     }
+
+
+    /**
+     * Checks to see if an interceptor is bypassed.
+     *
+     * @param interceptorName the interceptorName of the interceptor to check for bypass
+     * @return true if the interceptor should be bypassed, false otherwise
+     */
+    public boolean isBypassed( String interceptorName )
+    {
+        return bypassed.contains( interceptorName );
+    }
+
+
+    /**
+     * Checks to see if any interceptors are bypassed by this Invocation.
+     *
+     * @return true if at least one bypass exists
+     */
+    public boolean hasBypass()
+    {
+        return !bypassed.isEmpty();
+    }
 }
diff --git a/core/src/main/java/org/apache/ldap/server/invocation/InvocationStack.java b/core/src/main/java/org/apache/ldap/server/invocation/InvocationStack.java
index 82315e5..bd71636 100644
--- a/core/src/main/java/org/apache/ldap/server/invocation/InvocationStack.java
+++ b/core/src/main/java/org/apache/ldap/server/invocation/InvocationStack.java
@@ -91,7 +91,15 @@
     {
         return ( Invocation ) this.stack.get( 0 );
     }
-    
+
+    /**
+     * Returns true if the stack is empty false otherwise.
+     */
+    public boolean isEmpty()
+    {
+        return this.stack.isEmpty();
+    }
+
     /**
      * Pushes the specified invocation to this stack.
      */
diff --git a/core/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java b/core/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java
index 5891de6..0ebd154 100644
--- a/core/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java
+++ b/core/src/main/java/org/apache/ldap/server/partition/DirectoryPartitionNexusProxy.java
@@ -19,6 +19,8 @@
 
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Collection;
+import java.util.Collections;
 
 import javax.naming.Context;
 import javax.naming.Name;
@@ -28,6 +30,7 @@
 import javax.naming.directory.Attributes;
 import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
+import javax.naming.directory.DirContext;
 import javax.naming.event.EventContext;
 import javax.naming.event.NamingListener;
 import javax.naming.ldap.LdapContext;
@@ -54,6 +57,17 @@
  */
 public class DirectoryPartitionNexusProxy extends DirectoryPartitionNexus
 {
+    /** Bypass String to use when ALL interceptors should be skipped */
+    public static final String BYPASS_ALL = "*";
+    /** Bypass String to use when ALL interceptors should be skipped */
+    public static final Collection BYPASS_ALL_COLLECTION = Collections.singleton( BYPASS_ALL );
+    /** Integer const for DirContext.ADD_ATTRIBUTE */
+    private static final Integer ADD_MODOP = new Integer( DirContext.ADD_ATTRIBUTE );
+    /** Integer const for DirContext.REMOVE_ATTRIBUTE */
+    private static final Integer REMOVE_MODOP = new Integer( DirContext.REMOVE_ATTRIBUTE );
+    /** Integer const for DirContext.REPLACE_ATTRIBUTE */
+    private static final Integer REPLACE_MODOP = new Integer( DirContext.REPLACE_ATTRIBUTE );
+
     private final Context caller;
     private final DirectoryService service;
     private final DirectoryServiceConfiguration configuration;
@@ -105,12 +119,19 @@
         return this.service.isStarted();
     }
 
-    public Name getMatchedName(Name dn, boolean normalized) throws NamingException {
+
+    public Name getMatchedName( Name dn, boolean normalized ) throws NamingException
+    {
+        return getMatchedName( dn, normalized, null );
+    }
+
+
+    public Name getMatchedName( Name dn, boolean normalized, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "getMatchedDn",
-                new Object[] { dn, normalized? Boolean.TRUE : Boolean.FALSE } ) );
+        Object[] args = new Object[] { dn, normalized? Boolean.TRUE : Boolean.FALSE };
+        stack.push( new Invocation( this, caller, "getMatchedDn", args, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().getMatchedName( dn, normalized );
@@ -121,12 +142,19 @@
         }
     }
 
-    public Name getSuffix(Name dn, boolean normalized) throws NamingException {
+
+    public Name getSuffix( Name dn, boolean normalized) throws NamingException
+    {
+        return getSuffix( dn, normalized, null );
+    }
+
+
+    public Name getSuffix( Name dn, boolean normalized, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "getSuffix",
-                new Object[] { dn, normalized? Boolean.TRUE : Boolean.FALSE } ) );
+        Object[] args = new Object[] { dn, normalized? Boolean.TRUE : Boolean.FALSE };
+        stack.push( new Invocation( this, caller, "getSuffix", args, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().getSuffix( dn, normalized );
@@ -137,12 +165,19 @@
         }
     }
 
-    public Iterator listSuffixes(boolean normalized) throws NamingException {
+
+    public Iterator listSuffixes( boolean normalized ) throws NamingException
+    {
+        return listSuffixes( normalized, null );
+    }
+
+
+    public Iterator listSuffixes( boolean normalized, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "listSuffixes",
-                new Object[] { normalized? Boolean.TRUE : Boolean.FALSE } ) );
+        Object[] args = new Object[] { normalized? Boolean.TRUE : Boolean.FALSE };
+        stack.push( new Invocation( this, caller, "listSuffixes", args, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().listSuffixes( normalized );
@@ -153,11 +188,18 @@
         }
     }
 
+
     public boolean compare( Name name, String oid, Object value ) throws NamingException
     {
+        return compare( name, oid, value, null );
+    }
+
+
+    public boolean compare( Name name, String oid, Object value, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation( caller, "compare", new Object[] { name, oid, value } ) );
+        stack.push( new Invocation( this, caller, "compare", new Object[] { name, oid, value }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().compare( name, oid, value );
@@ -169,12 +211,17 @@
     }
 
 
-    public void delete(Name name) throws NamingException {
+    public void delete( Name name ) throws NamingException
+    {
+        delete( name, null );
+    }
+
+
+    public void delete( Name name, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "delete",
-                new Object[] { name } ) );
+        stack.push( new Invocation( this, caller, "delete", new Object[] { name }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().delete( name );
@@ -185,12 +232,18 @@
         }
     }
 
-    public void add(String upName, Name normName, Attributes entry) throws NamingException {
+
+    public void add( String upName, Name normName, Attributes entry ) throws NamingException
+    {
+        add( upName, normName, entry, null );
+    }
+
+
+    public void add( String upName, Name normName, Attributes entry, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "add",
-                new Object[] { upName, normName, entry } ) );
+        stack.push( new Invocation( this, caller, "add", new Object[] { upName, normName, entry }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().add( upName, normName, entry );
@@ -201,13 +254,35 @@
         }
     }
 
-    public void modify(Name name, int modOp, Attributes mods) throws NamingException {
+
+    public void modify( Name name, int modOp, Attributes mods ) throws NamingException
+    {
+        modify( name, modOp, mods, null );
+    }
+
+
+    public void modify( Name name, int modOp, Attributes mods, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        // TODO Use predefined modOp Interger constants.
-        stack.push( new Invocation(
-                caller, "modify",
-                new Object[] { name, new Integer( modOp ), mods } ) );
+        Integer modOpObj;
+
+        switch( modOp )
+        {
+            case( DirContext.ADD_ATTRIBUTE ):
+                modOpObj = ADD_MODOP;
+                break;
+            case( DirContext.REMOVE_ATTRIBUTE ):
+                modOpObj = REMOVE_MODOP;
+                break;
+            case( DirContext.REPLACE_ATTRIBUTE ):
+                modOpObj = REPLACE_MODOP;
+                break;
+            default:
+                throw new IllegalArgumentException( "bad modification operation value: " + modOp );
+        }
+
+        stack.push( new Invocation( this, caller, "modify", new Object[] { name, modOpObj, mods }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().modify( name, modOp, mods );
@@ -218,12 +293,18 @@
         }
     }
 
-    public void modify(Name name, ModificationItem[] mods) throws NamingException {
+
+    public void modify( Name name, ModificationItem[] mods ) throws NamingException
+    {
+        modify( name, mods, null );
+    }
+
+
+    public void modify( Name name, ModificationItem[] mods, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "modify",
-                new Object[] { name, mods } ) );
+        stack.push( new Invocation( this, caller, "modify", new Object[] { name, mods }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().modify( name, mods );
@@ -234,12 +315,18 @@
         }
     }
 
-    public NamingEnumeration list(Name base) throws NamingException {
+
+    public NamingEnumeration list( Name base ) throws NamingException
+    {
+        return list( base, null );
+    }
+
+
+    public NamingEnumeration list( Name base, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "list",
-                new Object[] { base } ) );
+        stack.push( new Invocation( this, caller, "list", new Object[] { base }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().list( base );
@@ -250,12 +337,20 @@
         }
     }
 
-    public NamingEnumeration search(Name base, Map env, ExprNode filter, SearchControls searchCtls) throws NamingException {
+
+    public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls )
+            throws NamingException
+    {
+        return search( base, env, filter, searchCtls, null );
+    }
+
+
+    public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls, Collection bypass )
+            throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "search",
-                new Object[] { base, env, filter, searchCtls } ) );
+        stack.push( new Invocation( this, caller, "search", new Object[] { base, env, filter, searchCtls }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().search( base, env, filter, searchCtls );
@@ -266,12 +361,18 @@
         }
     }
 
-    public Attributes lookup(Name name) throws NamingException {
+
+    public Attributes lookup( Name name ) throws NamingException
+    {
+        return lookup( name, ( Collection ) null );
+    }
+
+
+    public Attributes lookup( Name name, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "lookup",
-                new Object[] { name } ) );
+        stack.push( new Invocation( this, caller, "lookup", new Object[] { name }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().lookup( name );
@@ -282,12 +383,18 @@
         }
     }
 
-    public Attributes lookup(Name dn, String[] attrIds) throws NamingException {
+
+    public Attributes lookup( Name dn, String[] attrIds ) throws NamingException
+    {
+        return lookup( dn, attrIds, null );
+    }
+
+
+    public Attributes lookup( Name dn, String[] attrIds, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "lookup",
-                new Object[] { dn, attrIds } ) );
+        stack.push( new Invocation( this, caller, "lookup", new Object[] { dn, attrIds }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().lookup( dn, attrIds );
@@ -298,12 +405,18 @@
         }
     }
 
-    public boolean hasEntry(Name name) throws NamingException {
+
+    public boolean hasEntry( Name name ) throws NamingException
+    {
+        return hasEntry( name, null );
+    }
+
+
+    public boolean hasEntry( Name name, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "hasEntry",
-                new Object[] { name } ) );
+        stack.push( new Invocation( this, caller, "hasEntry", new Object[] { name }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().hasEntry( name );
@@ -314,12 +427,18 @@
         }
     }
 
-    public boolean isSuffix(Name name) throws NamingException {
+
+    public boolean isSuffix( Name name ) throws NamingException
+    {
+        return isSuffix( name, null );
+    }
+
+
+    public boolean isSuffix( Name name, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "isSuffix",
-                new Object[] { name } ) );
+        stack.push( new Invocation( this, caller, "isSuffix", new Object[] { name }, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().isSuffix( name );
@@ -330,12 +449,19 @@
         }
     }
 
-    public void modifyRn(Name name, String newRn, boolean deleteOldRn) throws NamingException {
+
+    public void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException
+    {
+        modifyRn( name, newRn, deleteOldRn, null );
+    }
+
+
+    public void modifyRn( Name name, String newRn, boolean deleteOldRn, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "modifyRn",
-                new Object[] { name, newRn, deleteOldRn? Boolean.TRUE : Boolean.FALSE } ) );
+        Object[] args = new Object[] { name, newRn, deleteOldRn? Boolean.TRUE : Boolean.FALSE };
+        stack.push( new Invocation( this, caller, "modifyRn", args, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().modifyRn( name, newRn, deleteOldRn );
@@ -346,12 +472,18 @@
         }
     }
 
-    public void move(Name oriChildName, Name newParentName) throws NamingException {
+
+    public void move( Name oriChildName, Name newParentName ) throws NamingException
+    {
+        move( oriChildName, newParentName, null );
+    }
+
+
+    public void move( Name oriChildName, Name newParentName, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "move",
-                new Object[] { oriChildName, newParentName } ) );
+        stack.push( new Invocation( this, caller, "move", new Object[] { oriChildName, newParentName }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().move( oriChildName, newParentName );
@@ -362,12 +494,20 @@
         }
     }
 
-    public void move(Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn) throws NamingException {
+
+    public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException
+    {
+        move( oriChildName, newParentName, newRn, deleteOldRn, null );
+    }
+
+
+    public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn, Collection bypass )
+            throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "move",
-                new Object[] { oriChildName, newParentName, newRn, deleteOldRn? Boolean.TRUE : Boolean.FALSE } ) );
+        Object[] args = new Object[] { oriChildName, newParentName, newRn, deleteOldRn? Boolean.TRUE : Boolean.FALSE };
+        stack.push( new Invocation( this, caller, "move", args, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().move( oriChildName, newParentName, newRn, deleteOldRn );
@@ -378,11 +518,18 @@
         }
     }
 
+
     public Attributes getRootDSE() throws NamingException
     {
+        return getRootDSE( null );
+    }
+
+
+    public Attributes getRootDSE( Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation( caller, "getRootDSE" ) );
+        stack.push( new Invocation( this, caller, "getRootDSE", null, bypass ) );
         try
         {
             return this.configuration.getInterceptorChain().getRootDSE();
@@ -393,13 +540,18 @@
         }
     }
 
+
     public void addContextPartition( DirectoryPartitionConfiguration config ) throws NamingException
     {
+        addContextPartition( config, null );
+    }
+
+
+    public void addContextPartition( DirectoryPartitionConfiguration config, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "addContextPartition",
-                new Object[] { config } ) );
+        stack.push( new Invocation( this, caller, "addContextPartition", new Object[] { config }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().addContextPartition( config );
@@ -410,13 +562,18 @@
         }
     }
 
+
     public void removeContextPartition( Name suffix ) throws NamingException
     {
+        removeContextPartition( suffix, null );
+    }
+
+
+    public void removeContextPartition( Name suffix, Collection bypass ) throws NamingException
+    {
         ensureStarted();
         InvocationStack stack = InvocationStack.getInstance();
-        stack.push( new Invocation(
-                caller, "removeContextPartition",
-                new Object[] { suffix } ) );
+        stack.push( new Invocation( this, caller, "removeContextPartition", new Object[] { suffix }, bypass ) );
         try
         {
             this.configuration.getInterceptorChain().removeContextPartition( suffix );
@@ -427,7 +584,9 @@
         }
     }
 
-    private void ensureStarted() throws ServiceUnavailableException {
+
+    private void ensureStarted() throws ServiceUnavailableException
+    {
         if( !service.isStarted() )
         {
             throw new ServiceUnavailableException( "Directory service is not started." );
diff --git a/core/src/test/org/apache/ldap/server/jndi/RootDSETest.java b/core/src/test/org/apache/ldap/server/jndi/RootDSETest.java
index 615ad1a..987d10b 100644
--- a/core/src/test/org/apache/ldap/server/jndi/RootDSETest.java
+++ b/core/src/test/org/apache/ldap/server/jndi/RootDSETest.java
@@ -299,7 +299,7 @@
 
         try
         {
-            ctx.modifyAttributes( "", 0, null );
+            ctx.modifyAttributes( "", DirContext.ADD_ATTRIBUTE, null );
 
             fail( "we should never get here" );
         }
