diff --git a/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java.fix b/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java.fix
deleted file mode 100644
index 473e507..0000000
--- a/ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlJob.java.fix
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *  
- *    http://www.apache.org/licenses/LICENSE-2.0
- *  
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License. 
- *  
- */
-
-package org.apache.directory.studio.ldapbrowser.core.jobs;
-
-
-import java.io.BufferedWriter;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.naming.InvalidNameException;
-import javax.naming.NamingEnumeration;
-import javax.naming.directory.SearchResult;
-
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.directory.shared.asn1.codec.DecoderException;
-import org.apache.directory.shared.ldap.codec.AttributeValueAssertion;
-import org.apache.directory.shared.ldap.codec.LdapConstants;
-import org.apache.directory.shared.ldap.codec.search.AndFilter;
-import org.apache.directory.shared.ldap.codec.search.AttributeValueAssertionFilter;
-import org.apache.directory.shared.ldap.codec.search.ExtensibleMatchFilter;
-import org.apache.directory.shared.ldap.codec.search.Filter;
-import org.apache.directory.shared.ldap.codec.search.NotFilter;
-import org.apache.directory.shared.ldap.codec.search.OrFilter;
-import org.apache.directory.shared.ldap.codec.search.PresentFilter;
-import org.apache.directory.shared.ldap.codec.search.SearchResultDone;
-import org.apache.directory.shared.ldap.codec.search.SearchResultEntry;
-import org.apache.directory.shared.ldap.codec.search.SubstringFilter;
-import org.apache.directory.shared.ldap.filter.AndNode;
-import org.apache.directory.shared.ldap.filter.ApproximateNode;
-import org.apache.directory.shared.ldap.filter.BranchNode;
-import org.apache.directory.shared.ldap.filter.EqualityNode;
-import org.apache.directory.shared.ldap.filter.ExprNode;
-import org.apache.directory.shared.ldap.filter.ExtensibleNode;
-import org.apache.directory.shared.ldap.filter.FilterParser;
-import org.apache.directory.shared.ldap.filter.GreaterEqNode;
-import org.apache.directory.shared.ldap.filter.LessEqNode;
-import org.apache.directory.shared.ldap.filter.NotNode;
-import org.apache.directory.shared.ldap.filter.OrNode;
-import org.apache.directory.shared.ldap.filter.PresenceNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
-import org.apache.directory.shared.ldap.filter.SubstringNode;
-import org.apache.directory.shared.ldap.name.LdapDN;
-import org.apache.directory.studio.connection.core.Connection;
-import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
-import org.apache.directory.studio.dsmlv2.reponse.BatchResponseDsml;
-import org.apache.directory.studio.dsmlv2.reponse.SearchResultDoneDsml;
-import org.apache.directory.studio.dsmlv2.reponse.SearchResultEntryDsml;
-import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
-import org.apache.directory.studio.ldapbrowser.core.model.Control;
-import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
-import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
-import org.dom4j.io.OutputFormat;
-import org.dom4j.io.XMLWriter;
-
-
-/**
- * This class implements a Job for Exporting a part of a LDAP Server into a DSML File.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class ExportDsmlJob extends AbstractEclipseJob
-{
-    /** The name of the DSML file to export to */
-    private String exportDsmlFilename;
-
-    /** The connection to use */
-    private IBrowserConnection browserConnection;
-
-    /** The Search Parameter of the export*/
-    private SearchParameter searchParameter;
-
-
-    /**
-     * Creates a new instance of ExportDsmlJob.
-     *
-     * @param exportDsmlFilename
-     *          the name of the DSML file to export to
-     * @param connection
-     *          the connection to use
-     * @param searchParameter
-     *          the Search Parameter of the export
-     */
-    public ExportDsmlJob( String exportDsmlFilename, IBrowserConnection connection, SearchParameter searchParameter )
-    {
-        this.exportDsmlFilename = exportDsmlFilename;
-        this.browserConnection = connection;
-        this.searchParameter = searchParameter;
-
-        setName( BrowserCoreMessages.jobs__export_dsml_name );
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
-     */
-    protected Connection[] getConnections()
-    {
-        return new Connection[]
-            { browserConnection.getConnection() };
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
-     */
-    protected Object[] getLockedObjects()
-    {
-        List<String> l = new ArrayList<String>();
-        l.add( browserConnection.getUrl() + "_" + DigestUtils.shaHex( exportDsmlFilename ) );
-        return l.toArray();
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#executeAsyncJob(org.apache.directory.studio.ldapbrowser.core.jobs.ExtendedProgressMonitor)
-     */
-    protected void executeAsyncJob( StudioProgressMonitor monitor )
-    {
-        monitor.beginTask( BrowserCoreMessages.jobs__export_dsml_task, 2 );
-        monitor.reportProgress( " " ); //$NON-NLS-1$
-        monitor.worked( 1 );
-
-        try
-        {
-            BatchResponseDsml batchResponse = new BatchResponseDsml();
-
-            NamingEnumeration<SearchResult> result = SearchRunnable
-                .search( browserConnection, searchParameter, monitor );
-
-            while ( result.hasMoreElements() )
-            {
-                SearchResult searchResult = ( SearchResult ) result.nextElement();
-                SearchResultEntryDsml sreDsml = convertToDsmlSearchResult( searchResult );
-                batchResponse.addResponse( sreDsml );
-            }
-
-            batchResponse.addResponse( new SearchResultDoneDsml( new SearchResultDone() ) );
-
-            FileOutputStream fos = new FileOutputStream( exportDsmlFilename );
-            OutputStreamWriter osw = new OutputStreamWriter( fos );
-            BufferedWriter bufferedWriter = new BufferedWriter( osw );
-            bufferedWriter.write( batchResponse.toDsml() );
-            bufferedWriter.close();
-            osw.close();
-            fos.close();
-        }
-        catch ( Exception e )
-        {
-            monitor.reportError( e );
-        }
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
-     */
-    protected String getErrorMessage()
-    {
-        return BrowserCoreMessages.jobs__export_dsml_error;
-    }
-
-
-    private SearchResultEntryDsml convertToDsmlSearchResult( SearchResult searchResult )
-    {
-        try
-        {
-            SearchResultEntry sre = new SearchResultEntry();
-            sre.setObjectName( new LdapDN( searchResult.getNameInNamespace() ) );
-            sre.setPartialAttributeList( searchResult.getAttributes() );
-
-            return new SearchResultEntryDsml( sre );
-        }
-        catch ( InvalidNameException e )
-        {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Converts a String filter into a Shared LDAP Filter.
-     *
-     * @param filter
-     *      the filter String to convert
-     * @return
-     *      the corresponding Shared LDAP Filter
-     * @throws ParseException 
-     * @throws IOException 
-     * @throws DecoderException 
-     */
-    public static Filter convertToSharedLdapFilter( String filter ) throws IOException, ParseException,
-        DecoderException
-    {
-        ExprNode exprNode = FilterParser.parse( filter );
-        return convertToSharedLdapFilter( exprNode );
-    }
-
-
-    /**
-     * Converts a ExprNode Filter Model into a Shared LDAP Model.
-     *
-     * @param exprNode
-     *      the filter
-     * @return
-     *      the corresponding filter in the Shared LDAP Model
-     * @throws DecoderException 
-     */
-    public static Filter convertToSharedLdapFilter( ExprNode exprNode ) throws DecoderException
-    {
-        Filter sharedLdapFilter = null;
-
-        if ( exprNode instanceof BranchNode )
-        {
-            BranchNode branchNode = ( BranchNode ) exprNode;
-
-            if ( branchNode instanceof AndNode )
-            {
-                AndFilter andFilter = new AndFilter();
-                sharedLdapFilter = andFilter;
-
-                List<Filter> andFilters = iterateOnFilters( branchNode.getChildren() );
-                for ( int i = 0; i < andFilters.size(); i++ )
-                {
-                    andFilter.addFilter( andFilters.get( i ) );
-                }
-            }
-            else if ( branchNode instanceof OrNode )
-            {
-                OrFilter orFilter = new OrFilter();
-                sharedLdapFilter = orFilter;
-
-                List<Filter> orFilters = iterateOnFilters( branchNode.getChildren() );
-                for ( int i = 0; i < orFilters.size(); i++ )
-                {
-                    orFilter.addFilter( orFilters.get( i ) );
-                }
-            }
-            else if ( branchNode instanceof NotNode )
-            {
-                NotFilter notFilter = new NotFilter();
-                sharedLdapFilter = notFilter;
-
-                List<Filter> notFilters = iterateOnFilters( branchNode.getChildren() );
-                notFilter.setNotFilter( notFilters.get( 0 ) );
-            }
-        }
-        else if ( exprNode instanceof PresenceNode )
-        {
-            PresenceNode presenceNode = ( PresenceNode ) exprNode;
-
-            PresentFilter presentFilter = new PresentFilter();
-            sharedLdapFilter = presentFilter;
-
-            presentFilter.setAttributeDescription( presenceNode.getAttribute() );
-        }
-        else if ( exprNode instanceof SimpleNode )
-        {
-            SimpleNode simpleNode = ( SimpleNode ) exprNode;
-
-            if ( simpleNode instanceof ApproximateNode )
-            {
-                AttributeValueAssertionFilter approxMatchFilter = createAttributeValueAssertionFilter( simpleNode,
-                    LdapConstants.APPROX_MATCH_FILTER );
-                sharedLdapFilter = approxMatchFilter;
-            }
-            else if ( simpleNode instanceof EqualityNode )
-            {
-                AttributeValueAssertionFilter equalityMatchFilter = createAttributeValueAssertionFilter( simpleNode,
-                    LdapConstants.EQUALITY_MATCH_FILTER );
-                sharedLdapFilter = equalityMatchFilter;
-            }
-            else if ( simpleNode instanceof GreaterEqNode )
-            {
-                AttributeValueAssertionFilter greaterOrEqualFilter = createAttributeValueAssertionFilter( simpleNode,
-                    LdapConstants.GREATER_OR_EQUAL_FILTER );
-                sharedLdapFilter = greaterOrEqualFilter;
-            }
-            else if ( simpleNode instanceof LessEqNode )
-            {
-                AttributeValueAssertionFilter lessOrEqualFilter = createAttributeValueAssertionFilter( simpleNode,
-                    LdapConstants.LESS_OR_EQUAL_FILTER );
-                sharedLdapFilter = lessOrEqualFilter;
-            }
-        }
-        else if ( exprNode instanceof ExtensibleNode )
-        {
-            ExtensibleNode extensibleNode = ( ExtensibleNode ) exprNode;
-
-            ExtensibleMatchFilter extensibleMatchFilter = new ExtensibleMatchFilter();
-            sharedLdapFilter = extensibleMatchFilter;
-
-            extensibleMatchFilter.setDnAttributes( extensibleNode.hasDnAttributes() );
-            extensibleMatchFilter.setMatchingRule( extensibleNode.getMatchingRuleId() );
-            extensibleMatchFilter.setMatchValue( extensibleNode.getValue() );
-            extensibleMatchFilter.setType( extensibleNode.getAttribute() );
-        }
-        else if ( exprNode instanceof SubstringNode )
-        {
-            SubstringNode substringNode = ( SubstringNode ) exprNode;
-
-            SubstringFilter substringFilter = new SubstringFilter();
-            sharedLdapFilter = substringFilter;
-
-            substringFilter.setType( substringNode.getAttribute() );
-            substringFilter.setInitialSubstrings( substringNode.getInitial() );
-            substringFilter.setFinalSubstrings( substringNode.getFinal() );
-            List<String> anys = substringNode.getAny();
-            for ( int i = 0; i < anys.size(); i++ )
-            {
-                substringFilter.addAnySubstrings( anys.get( i ) );
-            }
-        }
-
-        return sharedLdapFilter;
-    }
-
-
-    /**
-     * Iterates the conversion on the given List of notdes.
-     *
-     * @param filters
-     *      the List of nodes to convert
-     * @return
-     *      an array containing the conversion for each Ldap Filter into its Shared LDAP Model
-     * @throws DecoderException 
-     */
-    private static List<Filter> iterateOnFilters( List<ExprNode> filters ) throws DecoderException
-    {
-        List<Filter> filtersList = new ArrayList<Filter>();
-
-        for ( int c = 0; c < filters.size(); c++ )
-        {
-            filtersList.add( convertToSharedLdapFilter( filters.get( c ) ) );
-        }
-
-        return filtersList;
-    }
-
-
-    /**
-     * Create and returns an Attribute Value Assertion Filter from the given SimpleNode ant the given type.
-     *
-     * @param node
-     *      the filter to convert
-     * @param type
-     *      the type of the Attribute Value Assertion Filter
-     * @return
-     *      the corresponding Attribute Value Assertion Filter
-     */
-    private static AttributeValueAssertionFilter createAttributeValueAssertionFilter( SimpleNode node, int type )
-    {
-        AttributeValueAssertionFilter avaFilter = new AttributeValueAssertionFilter( type );
-
-        AttributeValueAssertion assertion = new AttributeValueAssertion();
-        avaFilter.setAssertion( assertion );
-        assertion.setAttributeDesc( node.getAttribute() );
-        assertion.setAssertionValue( node.getValue() );
-
-        return avaFilter;
-    }
-
-
-    /**
-     * Converts the given array of Controls into their corresponding representation in the Shared LDAP Model.
-     *
-     * @param controls
-     *      the array of Controls to convert
-     * @return
-     *      a List of Shared LDAP Control Objects corresponding to the given Controls
-     */
-    private List<org.apache.directory.shared.ldap.codec.Control> convertToSharedLdapControls( Control[] controls )
-    {
-        List<org.apache.directory.shared.ldap.codec.Control> returnList = new ArrayList<org.apache.directory.shared.ldap.codec.Control>();
-
-        if ( controls != null )
-        {
-            for ( int i = 0; i < controls.length; i++ )
-            {
-                returnList.add( convertToSharedLDAP( controls[i] ) );
-            }
-        }
-
-        return returnList;
-    }
-
-
-    /**
-     * Converts the given Control into its corresponding representation in the Shared LDAP Model.
-     *
-     * @param control
-     *      the Control to convert
-     * @return
-     *      the corresponding Control in the Shared LDAP Model
-     */
-    private static org.apache.directory.shared.ldap.codec.Control convertToSharedLDAP( Control control )
-    {
-        org.apache.directory.shared.ldap.codec.Control sharedLdapControl = new org.apache.directory.shared.ldap.codec.Control();
-
-        sharedLdapControl.setControlType( control.getOid() );
-        sharedLdapControl.setControlValue( control.getControlValue() );
-
-        return sharedLdapControl;
-    }
-}
