Index: src/main/java/org/apache/directory/shared/ldap/aci/ProtectedItem.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/aci/ProtectedItem.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/aci/ProtectedItem.java	(working copy)
@@ -28,6 +28,7 @@
 import javax.naming.directory.Attribute;
 
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.util.StringTools;
 
 
 /**
@@ -207,7 +208,7 @@
                     throw new IllegalArgumentException( "attributeTypes contains an element which is not a string." );
                 }
 
-                tmp.add( ( ( String ) val ).toLowerCase() );
+                tmp.add( StringTools.lowerCase( (String ) val) );
             }
 
             this.attributeTypes = Collections.unmodifiableCollection( tmp );
Index: src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/codec/add/AddRequest.java	(working copy)
@@ -140,7 +140,8 @@
      */
     public void addAttributeType( LdapString type )
     {
-        currentAttribute = new BasicAttribute( type.getString().toLowerCase() );
+        currentAttribute = new BasicAttribute(
+                StringTools.lowerCase(type.getString()));
         attributes.put( currentAttribute );
     }
 
Index: src/main/java/org/apache/directory/shared/ldap/message/SearchRequestImpl.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/message/SearchRequestImpl.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/message/SearchRequestImpl.java	(working copy)
@@ -22,7 +22,6 @@
 import java.util.Collections;
 import java.util.Iterator;
 
-import org.apache.directory.shared.ldap.codec.LdapConstants;
 import org.apache.directory.shared.ldap.filter.BranchNormalizedVisitor;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 
@@ -449,116 +448,38 @@
         return myFilterString.equals( reqFilterString );
     }
 
-    /**
-     * Return a string the represent a SearchRequest
-     */
     public String toString()
     {
         StringBuffer    sb = new StringBuffer();
 
         sb.append( "    SearchRequest\n" );
-        sb.append( "        baseDn : '" ).append( baseDn ).append( "'\n" );
-        
-        if ( filter != null )
+        sb.append( "        baseDn : '" ).append(baseDn).append("'\n");
+        if (filter != null)
         {
             sb.append( "        filter : '" );
-            filter.printToBuffer( sb );
-            sb.append( "'\n" );
+            filter.printToBuffer(sb);
+            sb.append("'\n");
         }
-        
-        sb.append( "        scope : " );
-        
-        switch ( scope.getValue() )
-        {
-            case LdapConstants.SCOPE_BASE_OBJECT:
-                sb.append( "base object" );
-                break;
-
-            case LdapConstants.SCOPE_SINGLE_LEVEL:
-                sb.append( "single level" );
-                break;
-
-            case LdapConstants.SCOPE_WHOLE_SUBTREE:
-                sb.append( "whole subtree" );
-                break;
-        }
-        
-        sb.append( '\n' );
-        
-        sb.append( "        typesOnly : " ).append( typesOnly ).append( '\n' );
-
-        if ( sizeLimit == 0 )
-        {
-            sb.append( "no limit" );
-        }
-        else
-        {
-            sb.append( sizeLimit );
-        }
-
-        sb.append( '\n' );
-
-        sb.append( "        Time Limit : " );
-
-        if ( timeLimit == 0 )
-        {
-            sb.append( "no limit" );
-        }
-        else
-        {
-            sb.append( timeLimit );
-        }
-
-        sb.append( '\n' );
-
-        sb.append( "        Deref Aliases : " );
-
-        switch ( derefAliases.getValue() )
-        {
-            case LdapConstants.NEVER_DEREF_ALIASES:
-                sb.append( "never Deref Aliases" );
-                break;
-
-            case LdapConstants.DEREF_IN_SEARCHING:
-                sb.append( "deref In Searching" );
-                break;
-
-            case LdapConstants.DEREF_FINDING_BASE_OBJ:
-                sb.append( "deref Finding Base Obj" );
-                break;
-
-            case LdapConstants.DEREF_ALWAYS:
-                sb.append( "deref Always" );
-                break;
-        }
-
-        sb.append( '\n' );
+        sb.append( "        scope : " ).append(scope).append('\n');
+        sb.append( "        typesOnly : " ).append(typesOnly).append('\n');
+        sb.append( "        sizeLimit : " ).append(sizeLimit).append('\n');
+        sb.append( "        timeLimit : " ).append(timeLimit).append('\n');
+        sb.append( "        derefAliases : " ).append(derefAliases).append('\n');
         sb.append( "        attributes : " );
 
-        boolean         isFirst = true;
+        boolean         first = true;
 
-        if ( attributes != null )
-        {
-            Iterator it = attributes.iterator();
-            
-            while ( it.hasNext() )
+        if (attributes != null)
+            for (Iterator it = attributes.iterator(); it.hasNext();)
             {
-                if ( isFirst )
-                {
-                    isFirst = false;
-                }
-                else
-                {
-                    sb.append( ", " );
-                }
-                
-                sb.append( '\'' ).append( (String)it.next() ).append( '\'' );
+                final String    s = (String)it.next();
+
+                if (!first)
+                    sb.append(", ");
+                sb.append('\'').append(s).append('\'');
             }
-            
-        }
+        sb.append('\n');
 
-        sb.append( '\n' );
-
         return sb.toString();
     }
-}
\ No newline at end of file
+}
Index: src/main/java/org/apache/directory/shared/ldap/name/LdapDN.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/name/LdapDN.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/name/LdapDN.java	(working copy)
@@ -1098,7 +1098,7 @@
             type = type.substring( 4 );
         }
 
-        if ( StringTools.isNotEmpty( StringTools.lowerCase( type ) ) )
+        if ( StringTools.isNotEmpty( type ) )
         {
             OidNormalizer oidNormalizer = ( OidNormalizer ) oids.get( type );
 
@@ -1219,7 +1219,16 @@
             return dn;
         }
 
-        LdapDN newDn = ( LdapDN ) dn.clone();
+        LdapDN newDn = null;
+        try
+        {
+            newDn = ( LdapDN ) dn.clone();
+        }
+        catch (ClassCastException e)
+        {
+            log.error("class cast", e);
+            throw e;
+        }
 
         Enumeration rdns = newDn.getAllRdn();
 
Index: src/main/java/org/apache/directory/shared/ldap/name/LdapName.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/name/LdapName.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/name/LdapName.java	(working copy)
@@ -35,6 +35,7 @@
 import java.util.NoSuchElementException;
 
 import org.apache.directory.shared.ldap.util.NamespaceTools;
+import org.apache.directory.shared.ldap.util.StringTools;
 
 import javax.naming.InvalidNameException;
 import javax.naming.Name;
@@ -801,7 +802,7 @@
             StringBuffer buf = new StringBuffer();
             String attr = NamespaceTools.getRdnAttribute( comps0[ii] );
             String value = NamespaceTools.getRdnValue( comps0[ii] );
-            buf.append( attr.toLowerCase() );
+            buf.append( StringTools.lowerCase(attr) );
             buf.append( "=" );
             buf.append( value );
             set0.add( buf.toString() );
@@ -809,7 +810,7 @@
             buf.setLength( 0 );
             attr = NamespaceTools.getRdnAttribute( comps1[ii] );
             value = NamespaceTools.getRdnValue( comps1[ii] );
-            buf.append( attr.toLowerCase() );
+            buf.append( StringTools.lowerCase(attr) );
             buf.append( "=" );
             buf.append( value );
             set1.add( buf.toString() );
Index: src/main/java/org/apache/directory/shared/ldap/util/NamespaceTools.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/util/NamespaceTools.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/util/NamespaceTools.java	(working copy)
@@ -574,7 +574,7 @@
 
         attr = getRdnAttribute( nameComponent );
         value = getRdnValue( nameComponent );
-        buf.append( attr.toLowerCase() );
+        buf.append( StringTools.lowerCase(attr) );
         buf.append( "=" );
         buf.append( value );
         return buf.toString();
Index: src/main/java/org/apache/directory/shared/ldap/util/StringTools.java
===================================================================
--- src/main/java/org/apache/directory/shared/ldap/util/StringTools.java	(revision 393373)
+++ src/main/java/org/apache/directory/shared/ldap/util/StringTools.java	(working copy)
@@ -148,7 +148,7 @@
             // filter out all uppercase characters
             if ( toLowerCase )
             {
-                if ( Character.isUpperCase( ch ) )
+                if ( normalize && Character.isUpperCase( ch ) )
                 {
                     ch = Character.toLowerCase( ch );
                 }
@@ -1984,7 +1984,18 @@
         return str.toUpperCase();
     }
 
+    private static boolean   normalize = true;
 
+    public static boolean getNormalize()
+    {
+        return normalize;
+    }
+
+    public static void setNormalize(final boolean b)
+    {
+        normalize = b;
+    }
+
     /**
      * <p>
      * Converts a String to lower case as per {@link String#toLowerCase()}.
@@ -2009,7 +2020,11 @@
         {
             return null;
         }
-        return str.toLowerCase();
+            // hopno02: horrible hack to avoid normalisation
+        if (!normalize)
+            return str;
+        else
+            return str.toLowerCase();
     }
 
 
