JSPF-105 Rely on slf4j-api for logging
diff --git a/pom.xml b/pom.xml
index bdbaf02..3827177 100644
--- a/pom.xml
+++ b/pom.xml
@@ -109,6 +109,11 @@
                 <version>0.2.1</version>
             </dependency>
             <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>1.2.3</version>
+            </dependency>
+            <dependency>
                 <groupId>commons-cli</groupId>
                 <artifactId>commons-cli</artifactId>
                 <version>1.4</version>
@@ -123,6 +128,11 @@
                     </exclusion>
                 </exclusions>
             </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>1.7.27</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/resolver/pom.xml b/resolver/pom.xml
index 47a9cf1..68fffbf 100644
--- a/resolver/pom.xml
+++ b/resolver/pom.xml
@@ -37,6 +37,11 @@
 
     <dependencies>
         <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>dnsjava</groupId>
             <artifactId>dnsjava</artifactId>
         </dependency>
@@ -62,6 +67,10 @@
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/resolver/src/main/java/org/apache/james/jspf/core/LogEnabled.java b/resolver/src/main/java/org/apache/james/jspf/core/LogEnabled.java
deleted file mode 100644
index 0d40ed7..0000000
--- a/resolver/src/main/java/org/apache/james/jspf/core/LogEnabled.java
+++ /dev/null
@@ -1,35 +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.james.jspf.core;
-
-
-/**
- * Components that need to log can implement this interface to be provided
- * Loggers.
- */
-public interface LogEnabled {
-    /**
-     * Provide component with a logger.
-     * 
-     * @param logger
-     *            the logger. Must not be <code>null</code>.
-     */
-    void enableLogging(Logger logger);
-}
\ No newline at end of file
diff --git a/resolver/src/main/java/org/apache/james/jspf/core/Logger.java b/resolver/src/main/java/org/apache/james/jspf/core/Logger.java
deleted file mode 100644
index 15e8025..0000000
--- a/resolver/src/main/java/org/apache/james/jspf/core/Logger.java
+++ /dev/null
@@ -1,163 +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.james.jspf.core;
-
-/**
- * This is a facade for the different logging subsystems. It offers a simplified
- * interface that follows IOC patterns and a simplified priority/level/severity
- * abstraction.
- */
-public interface Logger {
-    /**
-     * Log a debug message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void debug(String message);
-
-    /**
-     * Log a debug message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void debug(String message, Throwable throwable);
-
-    /**
-     * Determine if messages of priority "debug" will be logged.
-     * 
-     * @return true if "debug" messages will be logged
-     */
-    public boolean isDebugEnabled();
-
-    /**
-     * Log a info message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void info(String message);
-
-    /**
-     * Log a info message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void info(String message, Throwable throwable);
-
-    /**
-     * Determine if messages of priority "info" will be logged.
-     * 
-     * @return true if "info" messages will be logged
-     */
-    public boolean isInfoEnabled();
-
-    /**
-     * Log a warn message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void warn(String message);
-
-    /**
-     * Log a warn message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void warn(String message, Throwable throwable);
-
-    /**
-     * Determine if messages of priority "warn" will be logged.
-     * 
-     * @return true if "warn" messages will be logged
-     */
-    public boolean isWarnEnabled();
-
-    /**
-     * Log a error message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void error(String message);
-
-    /**
-     * Log a error message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void error(String message, Throwable throwable);
-
-    /**
-     * Determine if messages of priority "error" will be logged.
-     * 
-     * @return true if "error" messages will be logged
-     */
-    public boolean isErrorEnabled();
-
-    /**
-     * Log a fatalError message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void fatalError(String message);
-
-    /**
-     * Log a fatalError message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void fatalError(String message, Throwable throwable);
-
-    /**
-     * Determine if messages of priority "fatalError" will be logged.
-     * 
-     * @return true if "fatalError" messages will be logged
-     */
-    public boolean isFatalErrorEnabled();
-
-    /**
-     * Create a new child logger. The name of the child logger is
-     * [current-loggers-name].[passed-in-name] Throws
-     * <code>IllegalArgumentException</code> if name has an empty element name
-     * 
-     * @param name
-     *            the subname of this logger
-     * @return the new logger
-     */
-    public Logger getChildLogger(String name);
-}
diff --git a/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java b/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
index 9b4f707..578c671 100644
--- a/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
+++ b/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
@@ -26,12 +26,6 @@
  * 
  */
 
-import org.apache.james.jspf.core.exceptions.NeutralException;
-import org.apache.james.jspf.core.exceptions.NoneException;
-import org.apache.james.jspf.core.exceptions.PermErrorException;
-import org.apache.james.jspf.core.exceptions.TempErrorException;
-import org.apache.james.jspf.core.exceptions.TimeoutException;
-
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
@@ -40,7 +34,16 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.james.jspf.core.exceptions.NeutralException;
+import org.apache.james.jspf.core.exceptions.NoneException;
+import org.apache.james.jspf.core.exceptions.PermErrorException;
+import org.apache.james.jspf.core.exceptions.TempErrorException;
+import org.apache.james.jspf.core.exceptions.TimeoutException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class MacroExpand {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MacroExpand.class);
 
     private Pattern domainSpecPattern;
 
@@ -52,8 +55,6 @@
 
     private Pattern cellPattern;
 
-    private Logger log;
-
     private DNSService dnsProbe;
 
     public static final boolean EXPLANATION = true;
@@ -69,10 +70,9 @@
     /**
      * Construct MacroExpand
      * 
-     * @param logger the logget to use
      * @param dnsProbe the dns service to use
      */
-    public MacroExpand(Logger logger, DNSService dnsProbe) {
+    public MacroExpand(DNSService dnsProbe) {
         // This matches 2 groups
         domainSpecPattern = Pattern.compile(SPFTermsRegexps.DOMAIN_SPEC_REGEX_R);
         // The real pattern replacer
@@ -80,7 +80,6 @@
         // The macro letters pattern
         macroLettersExpPattern = Pattern.compile(SPFTermsRegexps.MACRO_LETTER_PATTERN_EXP);
         macroLettersPattern = Pattern.compile(SPFTermsRegexps.MACRO_LETTER_PATTERN);
-        log = logger;
         this.dnsProbe = dnsProbe;
     }
     
@@ -195,7 +194,7 @@
      */
     private String expandExplanation(String input, MacroData macroData) throws PermErrorException, RequireClientDomainException {
 
-        log.debug("Start do expand explanation: " + input);
+        LOGGER.debug("Start do expand explanation: {}", input);
 
         String[] parts = input.split(" ");
         StringBuffer res = new StringBuffer();
@@ -203,7 +202,7 @@
             if (i > 0) res.append(" ");
             res.append(expandMacroString(parts[i], macroData, true));
         }
-        log.debug("Done expand explanation: " + res);
+        LOGGER.debug("Done expand explanation: {}", res);
         
         return res.toString();
     }
@@ -220,7 +219,7 @@
      */
     private String expandDomain(String input, MacroData macroData) throws PermErrorException, RequireClientDomainException {
 
-        log.debug("Start expand domain: " + input);
+        LOGGER.debug("Start expand domain: {}", input);
 
         Matcher inputMatcher = domainSpecPattern.matcher(input);
         if (!inputMatcher.matches() || inputMatcher.groupCount() != 2) {
@@ -247,7 +246,7 @@
             domainName = domainName.substring(split + 1);
         }
 
-        log.debug("Domain expanded: " + domainName);
+        LOGGER.debug("Domain expanded: {}", domainName);
         
         return domainName;
     }
@@ -456,7 +455,7 @@
             throw new PermErrorException("Unknown command : " + variable);
 
         } else {
-            log.debug("Used macro: " + macro + " replaced with: " + rValue);
+            LOGGER.debug("Used macro: {} replaced with: {}", macro, rValue);
 
             return rValue;
         }
diff --git a/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java b/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
index 18bdcbb..e1ab25d 100644
--- a/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
+++ b/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
@@ -23,8 +23,9 @@
 import java.util.Iterator;

 import java.util.List;

 

-import org.apache.james.jspf.core.Logger;

 import org.apache.james.jspf.core.SPFSession;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 

 /**

@@ -32,21 +33,15 @@
  *

  */

 public class FutureSPFResult extends SPFResult {

-    

+    private static final Logger LOGGER = LoggerFactory.getLogger(FutureSPFResult.class);

+

     private boolean isReady;

     private List<IFutureSPFResultListener> listeners;

     private int waiters;

-    private final Logger log;

     

     public FutureSPFResult() {

-        this.log = null;

         isReady = false;

     }

-    

-    public FutureSPFResult(Logger log) {

-        this.log = log;   	

-        this.isReady = false;

-    }

 

 	/**

      * Set SPFResult using the given SPFsession

@@ -76,9 +71,7 @@
                     listener.onSPFResult(this);

                 } catch (Throwable e) {

                     // catch exception. See JSPF-95

-                    if (log != null) {

-                        log.warn("An exception was thrown by the listener " + listener, e);

-                    }

+                    LOGGER.warn("An exception was thrown by the listener {}", listener, e);

                 }

             }

             listenerIt = null;

diff --git a/resolver/src/main/java/org/apache/james/jspf/executor/StagedMultipleSPFExecutor.java b/resolver/src/main/java/org/apache/james/jspf/executor/StagedMultipleSPFExecutor.java
index de244b0..f1ee767 100644
--- a/resolver/src/main/java/org/apache/james/jspf/executor/StagedMultipleSPFExecutor.java
+++ b/resolver/src/main/java/org/apache/james/jspf/executor/StagedMultipleSPFExecutor.java
@@ -19,26 +19,27 @@
 

 package org.apache.james.jspf.executor;

 

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.LinkedList;

+import java.util.Map;

+

 import org.apache.james.jspf.core.DNSLookupContinuation;

 import org.apache.james.jspf.core.DNSResponse;

-import org.apache.james.jspf.core.Logger;

 import org.apache.james.jspf.core.SPFChecker;

 import org.apache.james.jspf.core.SPFCheckerExceptionCatcher;

 import org.apache.james.jspf.core.SPFSession;

 import org.apache.james.jspf.core.exceptions.SPFResultException;

 import org.apache.james.jspf.core.exceptions.TimeoutException;

-

-import java.util.Collections;

-import java.util.HashMap;

-import java.util.LinkedList;

-import java.util.Map;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 /**

  * Async implementation of SPFExecutor

  *

  */

 public class StagedMultipleSPFExecutor implements SPFExecutor, Runnable {

-

+    private static final Logger LOGGER = LoggerFactory.getLogger(StagedMultipleSPFExecutor.class);

     private static final String ATTRIBUTE_STAGED_EXECUTOR_CONTINUATION = "StagedMultipleSPFExecutor.continuation";

 

     private static class ResponseQueueImpl extends LinkedList<IResponse> implements IResponseQueue {

@@ -81,16 +82,14 @@
     private synchronized int nextId() {

         return id++;

     }

-    

-    private Logger log;

+

     private DNSAsynchLookupService dnsProbe;

     private Thread worker;

     private Map<Integer,SPFSession> sessions;

     private Map<Integer,FutureSPFResult>results;

     private ResponseQueueImpl responseQueue;

 

-    public StagedMultipleSPFExecutor(Logger log, DNSAsynchLookupService service) {

-        this.log = log;

+    public StagedMultipleSPFExecutor(DNSAsynchLookupService service) {

         this.dnsProbe = service;

 

         this.responseQueue = new ResponseQueueImpl();

@@ -119,7 +118,7 @@
         SPFChecker checker;

         while ((checker = session.popChecker()) != null) {

             // only execute checkers we added (better recursivity)

-            log.debug("Executing checker: " + checker);

+            LOGGER.debug("Executing checker: {}", checker);

             try {

                 DNSLookupContinuation cont = checker.checkSPF(session);

                 // if the checker returns a continuation we return it

diff --git a/resolver/src/main/java/org/apache/james/jspf/executor/SynchronousSPFExecutor.java b/resolver/src/main/java/org/apache/james/jspf/executor/SynchronousSPFExecutor.java
index a68d25a..882a6dc 100644
--- a/resolver/src/main/java/org/apache/james/jspf/executor/SynchronousSPFExecutor.java
+++ b/resolver/src/main/java/org/apache/james/jspf/executor/SynchronousSPFExecutor.java
@@ -22,23 +22,23 @@
 import org.apache.james.jspf.core.DNSLookupContinuation;

 import org.apache.james.jspf.core.DNSResponse;

 import org.apache.james.jspf.core.DNSService;

-import org.apache.james.jspf.core.Logger;

 import org.apache.james.jspf.core.SPFChecker;

 import org.apache.james.jspf.core.SPFCheckerExceptionCatcher;

 import org.apache.james.jspf.core.SPFSession;

 import org.apache.james.jspf.core.exceptions.SPFResultException;

 import org.apache.james.jspf.core.exceptions.TimeoutException;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 /**

  * Synchronous implementation of SPFExecuter. All queries will get executed synchronously

  */

 public class SynchronousSPFExecutor implements SPFExecutor {

-    

-    private Logger log;

+    private static final Logger LOGGER = LoggerFactory.getLogger(SynchronousSPFExecutor.class);

+

     private DNSService dnsProbe;

 

-    public SynchronousSPFExecutor(Logger log, DNSService service) {

-        this.log = log;

+    public SynchronousSPFExecutor(DNSService service) {

         this.dnsProbe = service;

     }

 

@@ -49,7 +49,7 @@
         SPFChecker checker;

         while ((checker = session.popChecker()) != null) {

             // only execute checkers we added (better recursivity)

-            log.debug("Executing checker: " + checker);

+            LOGGER.debug("Executing checker: {}", checker);

             try {

                 DNSLookupContinuation cont = checker.checkSPF(session);

                 // if the checker returns a continuation we return it

diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/DNSServiceXBillImpl.java b/resolver/src/main/java/org/apache/james/jspf/impl/DNSServiceXBillImpl.java
index 2d7b413..99c2690 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/DNSServiceXBillImpl.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/DNSServiceXBillImpl.java
@@ -19,11 +19,18 @@
 
 package org.apache.james.jspf.impl;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSService;
 import org.apache.james.jspf.core.IPAddr;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xbill.DNS.AAAARecord;
 import org.xbill.DNS.ARecord;
 import org.xbill.DNS.Lookup;
@@ -36,21 +43,13 @@
 import org.xbill.DNS.TextParseException;
 import org.xbill.DNS.Type;
 
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * This class contains helper to get all neccassary DNS infos that are needed
  * for SPF
  */
 public class DNSServiceXBillImpl implements DNSService {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DNSServiceXBillImpl.class);
 
-    // The logger
-    protected Logger log;
-    
     // The record limit for lookups
     protected int recordLimit;
 
@@ -61,15 +60,14 @@
      * Default Constructor.
      * Uses the DNSJava static DefaultResolver
      */
-    public DNSServiceXBillImpl(Logger logger) {
-        this(logger, Lookup.getDefaultResolver());
+    public DNSServiceXBillImpl() {
+        this(Lookup.getDefaultResolver());
     }
     
     /**
      * Constructor to specify a custom resolver.
      */
-    public DNSServiceXBillImpl(Logger logger, Resolver resolver) {
-        this.log = logger;
+    public DNSServiceXBillImpl(Resolver resolver) {
         this.resolver = resolver;
         // Default record limit is 10
         this.recordLimit = 10;
@@ -94,7 +92,7 @@
     public List<String> getLocalDomainNames() {
         List<String> names = new ArrayList<String>();
 
-        log.debug("Start Local ipaddress lookup");
+        LOGGER.debug("Start Local ipaddress lookup");
         try {
             InetAddress ia[] = InetAddress.getAllByName(InetAddress
                     .getLocalHost().getHostName());
@@ -103,7 +101,7 @@
                 String host = ia[i].getHostName();
                 names.add(host);
 
-                log.debug("Add hostname " + host + " to list");
+                LOGGER.debug("Add hostname {} to list", host);
             }
         } catch (UnknownHostException e) {
             // just ignore this..
@@ -146,7 +144,7 @@
         }
         try {
 
-            log.debug("Start "+recordTypeDescription+"-Record lookup for : " + request.getHostname());
+            LOGGER.debug("Start {}-Record lookup for : {}", recordTypeDescription, request.getHostname());
 
             Lookup query = new Lookup(request.getHostname(), dnsJavaType);
             query.setResolver(resolver);
@@ -161,11 +159,11 @@
             
             List<String> records = convertRecordsToList(rr);
             
-            log.debug("Found " + (rr != null ? rr.length : 0) + " "+recordTypeDescription+"-Records");
+            LOGGER.debug("Found {} {}-Records", (rr != null ? rr.length : 0), recordTypeDescription);
             return records;
         } catch (TextParseException e) {
             // i think this is the best we could do
-            log.debug("No "+recordTypeDescription+" Record found for host: " + request.getHostname());
+            LOGGER.debug("No {} Record found for host: {}", recordTypeDescription, request.getHostname());
             return null;
         }
     }
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/DefaultSPF.java b/resolver/src/main/java/org/apache/james/jspf/impl/DefaultSPF.java
index f114dae..11172c0 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/DefaultSPF.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/DefaultSPF.java
@@ -19,25 +19,11 @@
 
 package org.apache.james.jspf.impl;
 
-import org.apache.james.jspf.core.Logger;
-
 public class DefaultSPF extends SPF {
-
-    
     /**
-     * Uses default Log4JLogger and DNSJava based dns resolver
+     * Uses DNSJava based dns resolver
      */
     public DefaultSPF() {
-        this(new Log4JLogger(org.apache.log4j.Logger.getLogger(SPF.class)));
+        super(new DNSServiceXBillImpl());
     }
-    
-    /**
-     * Uses passed logger and DNSJava based dns resolver
-     * 
-     * @param logger the logger to use
-     */
-    public DefaultSPF(Logger logger) {
-        super(new DNSServiceXBillImpl(logger), logger);
-    }
-
 }
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/DefaultTermsFactory.java b/resolver/src/main/java/org/apache/james/jspf/impl/DefaultTermsFactory.java
index 5fe3b09..ea751d8 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/DefaultTermsFactory.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/DefaultTermsFactory.java
@@ -19,8 +19,13 @@
 
 package org.apache.james.jspf.impl;
 
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Properties;
+
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.parser.TermDefinition;
 import org.apache.james.jspf.parser.TermsFactory;
@@ -29,38 +34,26 @@
 import org.apache.james.jspf.wiring.WiringService;
 import org.apache.james.jspf.wiring.WiringServiceException;
 import org.apache.james.jspf.wiring.WiringServiceTable;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The default implementation of the TermsFactory
  */
 public class DefaultTermsFactory implements TermsFactory {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTermsFactory.class);
     
     private String termFile = "org/apache/james/jspf/parser/jspf.default.terms";
-    
     private Collection<TermDefinition> mechanismsCollection;
-
     private Collection<TermDefinition> modifiersCollection;
-
-    private Logger log;
-    
     private WiringService wiringService;
 
-    public DefaultTermsFactory(Logger log) {
-        this.log = log;
+    public DefaultTermsFactory() {
         this.wiringService = new WiringServiceTable();
-        ((WiringServiceTable) this.wiringService).put(LogEnabled.class, log);
         init();
     }
 
-    public DefaultTermsFactory(Logger log, WiringService wiringService) {
-        this.log = log;
+    public DefaultTermsFactory(WiringService wiringService) {
         this.wiringService = wiringService;
         init();
     }
@@ -83,8 +76,7 @@
             classes = mechs.split(",");
             Class<?>[] knownMechanisms = new Class[classes.length];
             for (int i = 0; i < classes.length; i++) {
-                log.debug("Add following class as known mechanismn: "
-                        + classes[i]);
+                LOGGER.debug("Add following class as known mechanismn: {}", classes[i]);
                 knownMechanisms[i] = Thread.currentThread()
                         .getContextClassLoader().loadClass(classes[i]);
             }
@@ -92,8 +84,7 @@
             classes = mods.split(",");
             Class<?>[] knownModifiers = new Class[classes.length];
             for (int i = 0; i < classes.length; i++) {
-                log.debug("Add following class as known modifier: "
-                        + classes[i]);
+                LOGGER.debug("Add following class as known modifier: {}", classes[i]);
                 knownModifiers[i] = Thread.currentThread()
                         .getContextClassLoader().loadClass(classes[i]);
             }
@@ -124,7 +115,7 @@
             try {
                 l.add(new DefaultTermDefinition(classes[j]));
             } catch (Exception e) {
-                log.debug("Unable to create the term collection", e);
+                LOGGER.debug("Unable to create the term collection", e);
                 throw new IllegalStateException(
                         "Unable to create the term collection");
             }
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/Log4JLogger.java b/resolver/src/main/java/org/apache/james/jspf/impl/Log4JLogger.java
deleted file mode 100644
index b3eb123..0000000
--- a/resolver/src/main/java/org/apache/james/jspf/impl/Log4JLogger.java
+++ /dev/null
@@ -1,207 +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.james.jspf.impl;
-
-import org.apache.james.jspf.core.Logger;
-import org.apache.log4j.Level;
-
-/**
- * Implementation of the Logger interface using the Log4J implementation
- * strategy.
- */
-public class Log4JLogger implements Logger {
-    private org.apache.log4j.Logger m_Logger;
-
-    public Log4JLogger(org.apache.log4j.Logger log4jLogger) {
-        m_Logger = log4jLogger;
-    }
-
-    /**
-     * Log a debug message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void debug(String message) {
-        m_Logger.debug(message);
-    }
-
-    /**
-     * Log a debug message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void debug(String message, Throwable throwable) {
-        m_Logger.debug(message, throwable);
-    }
-
-    /**
-     * Determine if messages of priority "debug" will be logged.
-     * 
-     * @return true if "debug" messages will be logged
-     */
-    public boolean isDebugEnabled() {
-        return m_Logger.isDebugEnabled();
-    }
-
-    /**
-     * Log a info message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void info(String message) {
-        m_Logger.info(message);
-    }
-
-    /**
-     * Log a info message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void info(String message, Throwable throwable) {
-        m_Logger.info(message, throwable);
-    }
-
-    /**
-     * Determine if messages of priority "info" will be logged.
-     * 
-     * @return true if "info" messages will be logged
-     */
-    public boolean isInfoEnabled() {
-        return m_Logger.isInfoEnabled();
-    }
-
-    /**
-     * Log a warn message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void warn(String message) {
-        m_Logger.warn(message);
-    }
-
-    /**
-     * Log a warn message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void warn(String message, Throwable throwable) {
-        m_Logger.warn(message, throwable);
-    }
-
-    /**
-     * Determine if messages of priority "warn" will be logged.
-     * 
-     * @return true if "warn" messages will be logged
-     */
-    public boolean isWarnEnabled() {
-        return m_Logger.isEnabledFor(Level.WARN);
-    }
-
-    /**
-     * Log a error message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void error(String message) {
-        m_Logger.error(message);
-    }
-
-    /**
-     * Log a error message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void error(String message, Throwable throwable) {
-        m_Logger.error(message, throwable);
-    }
-
-    /**
-     * Determine if messages of priority "error" will be logged.
-     * 
-     * @return true if "error" messages will be logged
-     */
-    public boolean isErrorEnabled() {
-        return m_Logger.isEnabledFor(Level.ERROR);
-    }
-
-    /**
-     * Log a fatalError message.
-     * 
-     * @param message
-     *            the message
-     */
-    public void fatalError(String message) {
-        m_Logger.fatal(message);
-    }
-
-    /**
-     * Log a fatalError message.
-     * 
-     * @param message
-     *            the message
-     * @param throwable
-     *            the throwable
-     */
-    public void fatalError(String message, Throwable throwable) {
-        m_Logger.fatal(message, throwable);
-    }
-
-    /**
-     * Determine if messages of priority "fatalError" will be logged.
-     * 
-     * @return true if "fatalError" messages will be logged
-     */
-    public boolean isFatalErrorEnabled() {
-        return m_Logger.isEnabledFor(Level.FATAL);
-    }
-
-    /**
-     * Create a new child logger. The name of the child logger is
-     * [current-loggers-name].[passed-in-name] Throws
-     * <code>IllegalArgumentException</code> if name has an empty element name
-     * 
-     * @param name
-     *            the subname of this logger
-     * @return the new logger
-     */
-    public Logger getChildLogger(String name) {
-        String newName = m_Logger.getName() + "." + name;
-        org.apache.log4j.Logger childLog4JLogger = org.apache.log4j.Logger
-                .getLogger(newName);
-        Log4JLogger child = new Log4JLogger(childLog4JLogger);
-        return child;
-    }
-}
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java b/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
index 494418e..8f665ee 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/SPF.java
@@ -20,11 +20,12 @@
 
 package org.apache.james.jspf.impl;
 
+import java.util.Iterator;
+import java.util.LinkedList;
+
 import org.apache.james.jspf.core.DNSLookupContinuation;
 import org.apache.james.jspf.core.DNSService;
 import org.apache.james.jspf.core.DNSServiceEnabled;
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.MacroExpandEnabled;
 import org.apache.james.jspf.core.SPF1Record;
@@ -59,14 +60,14 @@
 import org.apache.james.jspf.policies.local.OverridePolicy;
 import org.apache.james.jspf.policies.local.TrustedForwarderPolicy;
 import org.apache.james.jspf.wiring.WiringServiceTable;
-
-import java.util.Iterator;
-import java.util.LinkedList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class is used to generate a SPF-Test and provided all intressting data.
  */
 public class SPF implements SPFChecker {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SPF.class);
 
     private static final class SPFRecordChecker implements SPFChecker {
         
@@ -182,8 +183,6 @@
     private DNSService dnsProbe;
 
     private SPFRecordParser parser;
-
-    private Logger log;
     
     private String defaultExplanation = null;
     
@@ -205,21 +204,18 @@
      * Uses passed logger and passed dnsServicer
      * 
      * @param dnsProbe the dns provider
-     * @param logger the logger to use
      */
-    public SPF(DNSService dnsProbe, Logger logger) {
+    public SPF(DNSService dnsProbe) {
         super();
         this.dnsProbe = dnsProbe;
-        this.log = logger;
         WiringServiceTable wiringService = new WiringServiceTable();
-        wiringService.put(LogEnabled.class, this.log);
         wiringService.put(DNSServiceEnabled.class, this.dnsProbe);
-        this.macroExpand = new MacroExpand(logger.getChildLogger("macroExpand"), this.dnsProbe);
+        this.macroExpand = new MacroExpand(this.dnsProbe);
         wiringService.put(MacroExpandEnabled.class, this.macroExpand);
-        this.parser = new RFC4408SPF1Parser(logger.getChildLogger("parser"), new DefaultTermsFactory(logger.getChildLogger("termsfactory"), wiringService));
+        this.parser = new RFC4408SPF1Parser(new DefaultTermsFactory(wiringService));
         // We add this after the parser creation because services cannot be null
         wiringService.put(SPFCheckEnabled.class, this);
-        this.executor = new SynchronousSPFExecutor(log, dnsProbe);
+        this.executor = new SynchronousSPFExecutor(dnsProbe);
     }
     
     
@@ -228,25 +224,17 @@
      * 
      * @param dnsProbe the dns provider
      * @param parser the parser to use
-     * @param logger the logger to use
      */
-    public SPF(DNSService dnsProbe, SPFRecordParser parser, Logger logger, MacroExpand macroExpand, SPFExecutor executor) {
+    public SPF(DNSService dnsProbe, SPFRecordParser parser, MacroExpand macroExpand, SPFExecutor executor) {
         super();
         this.dnsProbe = dnsProbe;
         this.parser = parser;
-        this.log = logger;
         this.macroExpand = macroExpand;
         this.executor = executor;
     }
 
     
     private static final class DefaultSPFChecker implements SPFChecker, SPFCheckerExceptionCatcher {
-        
-        private Logger log;
-
-        public DefaultSPFChecker(Logger log) {
-            this.log = log;
-        }
 
         /**
          * @see org.apache.james.jspf.core.SPFChecker#checkSPF(org.apache.james.jspf.core.SPFSession)
@@ -274,12 +262,12 @@
             if (exception instanceof SPFResultException) {
                 result = ((SPFResultException) exception).getResult();
                 if (!SPFErrorConstants.NEUTRAL_CONV.equals(result)) {
-                    log.warn(exception.getMessage(),exception);
+                    LOGGER.warn(exception.getMessage(),exception);
                 }
             } else {
                 // this should never happen at all. But anyway we will set the
                 // result to neutral. Safety first ..
-                log.error(exception.getMessage(),exception);
+                LOGGER.error(exception.getMessage(),exception);
                 result = SPFErrorConstants.NEUTRAL_CONV;
             }
             session.setCurrentResultExpanded(result);
@@ -305,12 +293,12 @@
         spfData = new SPFSession(mailFrom, hostName, ipAddress);
       
 
-        SPFChecker resultHandler = new DefaultSPFChecker(log);
+        SPFChecker resultHandler = new DefaultSPFChecker();
         
         spfData.pushChecker(resultHandler);
         spfData.pushChecker(this);
         
-        FutureSPFResult ret = new FutureSPFResult(log);
+        FutureSPFResult ret = new FutureSPFResult();
         
         executor.execute(spfData, ret);
 
@@ -374,12 +362,12 @@
         
         // trustedForwarder support is enabled
         if (useTrustedForwarder) {
-            policies.add(new SPFPolicyPostFilterChecker(new TrustedForwarderPolicy(log)));
+            policies.add(new SPFPolicyPostFilterChecker(new TrustedForwarderPolicy()));
         }
 
         policies.add(new SPFPolicyPostFilterChecker(new NeutralIfNotMatchPolicy()));
 
-        policies.add(new SPFPolicyPostFilterChecker(new DefaultExplanationPolicy(log, defaultExplanation, macroExpand)));
+        policies.add(new SPFPolicyPostFilterChecker(new DefaultExplanationPolicy(defaultExplanation, macroExpand)));
         
         return policies;
     }
@@ -391,7 +379,7 @@
      * @param timeOut The timout in seconds
      */
     public synchronized void setTimeOut(int timeOut) {
-        log.debug("TimeOut was set to: " + timeOut);
+        LOGGER.debug("TimeOut was set to: {}", timeOut);
         dnsProbe.setTimeOut(timeOut);
     }
     
@@ -425,7 +413,7 @@
     public synchronized FallbackPolicy getFallbackPolicy() {
         // Initialize fallback policy
         if (fallBack == null) {
-            this.fallBack =  new FallbackPolicy(log.getChildLogger("fallbackpolicy"), parser);
+            this.fallBack =  new FallbackPolicy(parser);
         }
         return fallBack;
     }
@@ -450,7 +438,7 @@
      */
     public synchronized OverridePolicy getOverridePolicy() {
         if (override == null) {
-            override = new OverridePolicy(log.getChildLogger("overridepolicy"), parser);
+            override = new OverridePolicy(parser);
         }
         return override;
     }
diff --git a/resolver/src/main/java/org/apache/james/jspf/impl/SPFQuery.java b/resolver/src/main/java/org/apache/james/jspf/impl/SPFQuery.java
index 98dd921..008a260 100644
--- a/resolver/src/main/java/org/apache/james/jspf/impl/SPFQuery.java
+++ b/resolver/src/main/java/org/apache/james/jspf/impl/SPFQuery.java
@@ -120,7 +120,7 @@
                 if (line.hasOption(CHAR_VERBOSE))
                     logger.setLevel(Level.TRACE);
 
-                SPF spf = new DefaultSPF(new Log4JLogger(logger));
+                SPF spf = new DefaultSPF();
 
                 // Check if we should set a costum default explanation
                 if (defaultExplanation != null) {
diff --git a/resolver/src/main/java/org/apache/james/jspf/parser/RFC4408SPF1Parser.java b/resolver/src/main/java/org/apache/james/jspf/parser/RFC4408SPF1Parser.java
index b7b47ab..fc75791 100644
--- a/resolver/src/main/java/org/apache/james/jspf/parser/RFC4408SPF1Parser.java
+++ b/resolver/src/main/java/org/apache/james/jspf/parser/RFC4408SPF1Parser.java
@@ -20,17 +20,19 @@
 
 package org.apache.james.jspf.parser;
 
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPF1Constants;
 import org.apache.james.jspf.core.SPF1Record;
 import org.apache.james.jspf.core.SPFRecordParser;
 import org.apache.james.jspf.core.exceptions.NeutralException;
 import org.apache.james.jspf.core.exceptions.NoneException;
 import org.apache.james.jspf.core.exceptions.PermErrorException;
+import org.apache.james.jspf.executor.FutureSPFResult;
 import org.apache.james.jspf.terms.Configuration;
 import org.apache.james.jspf.terms.Directive;
 import org.apache.james.jspf.terms.Mechanism;
 import org.apache.james.jspf.terms.Modifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -77,6 +79,7 @@
  * 
  */
 public class RFC4408SPF1Parser implements SPFRecordParser {
+    private static final Logger LOGGER = LoggerFactory.getLogger(RFC4408SPF1Parser.class);
 
     /**
      * Regex based on http://www.ietf.org/rfc/rfc4408.txt.
@@ -107,18 +110,14 @@
 
     private List<TermDefinition> matchResultPositions;
 
-    private Logger log;
-
     private TermsFactory termsFactory;
 
     /**
      * Constructor. Creates all the values needed to run the parsing
      * 
-     * @param logger the logger to use
      * @param termsFactory the TermsFactory implementation
      */
-    public RFC4408SPF1Parser(Logger logger, TermsFactory termsFactory) {
-        this.log = logger;
+    public RFC4408SPF1Parser(TermsFactory termsFactory) {
         this.termsFactory = termsFactory;
         
         /**
@@ -201,16 +200,13 @@
             }
         }
 
-        if (log.isDebugEnabled()) {
-            log.debug("Parsing catch group positions: Modifiers["
-                    + TERM_STEP_REGEX_MODIFIER_POS + "] Qualifier["
-                    + TERM_STEP_REGEX_QUALIFIER_POS + "] Mechanism["
-                    + TERM_STEP_REGEX_MECHANISM_POS + "]");
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Parsing catch group positions: Modifiers[{}] Qualifier[{}] Mechanism[{}]",
+                TERM_STEP_REGEX_MODIFIER_POS, TERM_STEP_REGEX_QUALIFIER_POS, TERM_STEP_REGEX_MECHANISM_POS);
             for (int k = 0; k < matchResultPositions.size(); k++) {
-                log
-                        .debug(k
-                                + ") "
-                                + (matchResultPositions.get(k) != null ? ((TermDefinition) matchResultPositions
+                LOGGER
+                        .debug("{}) {}", k,
+                            (matchResultPositions.get(k) != null ? ((TermDefinition) matchResultPositions
                                         .get(k)).getPattern().pattern()
                                         : null));
             }
@@ -254,7 +250,7 @@
     public SPF1Record parse(String spfRecord) throws PermErrorException,
             NoneException, NeutralException {
 
-        log.debug("Start parsing SPF-Record: " + spfRecord);
+        LOGGER.debug("Start parsing SPF-Record: " + spfRecord);
 
         SPF1Record result = new SPF1Record();
 
@@ -311,7 +307,7 @@
                             TERM_STEP_REGEX_MECHANISM_POS);
 
                     result.getDirectives().add(
-                            new Directive(qualifier, (Mechanism) mech, log.getChildLogger(qualifier+"directive")));
+                            new Directive(qualifier, (Mechanism) mech));
 
                 }
 
diff --git a/resolver/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java b/resolver/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java
index 8f6f728..aa73b48 100644
--- a/resolver/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java
+++ b/resolver/src/main/java/org/apache/james/jspf/policies/local/DefaultExplanationPolicy.java
@@ -20,7 +20,6 @@
 package org.apache.james.jspf.policies.local;
 
 import org.apache.james.jspf.core.DNSLookupContinuation;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.SPF1Constants;
 import org.apache.james.jspf.core.SPF1Record;
@@ -31,14 +30,17 @@
 import org.apache.james.jspf.core.exceptions.NoneException;
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
+import org.apache.james.jspf.executor.FutureSPFResult;
 import org.apache.james.jspf.policies.PolicyPostFilter;
 import org.apache.james.jspf.terms.Modifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Policy to add a default explanation
  */
 public final class DefaultExplanationPolicy implements PolicyPostFilter {
-
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExplanationPolicy.class);
     
     private final class ExplanationChecker implements SPFChecker {
         
@@ -56,7 +58,7 @@
                 spfData.setExplanation(explanation);
             } catch (PermErrorException e) {
                 // Should never happen !
-                log.debug("Invalid defaulfExplanation: " + attExplanation);
+                LOGGER.debug("Invalid defaulfExplanation: {}", attExplanation);
             }
             return null;
         }
@@ -106,11 +108,7 @@
     }
 
     private static final String ATTRIBUTE_DEFAULT_EXPLANATION_POLICY_EXPLANATION = "DefaultExplanationPolicy.explanation";
-    
-    /**
-     * log
-     */
-    private Logger log;
+
     /**
      * the default explanation
      */
@@ -119,12 +117,10 @@
     private MacroExpand macroExpand;
     
     /**
-     * @param log the logger
      * @param explanation the default explanation
      * @param macroExpand the MacroExpand service
      */
-    public DefaultExplanationPolicy(Logger log, String explanation, MacroExpand macroExpand) {
-        this.log = log;
+    public DefaultExplanationPolicy(String explanation, MacroExpand macroExpand) {
         this.defExplanation = explanation;
         this.macroExpand = macroExpand;
     }
diff --git a/resolver/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java b/resolver/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java
index 37f04c8..d2c6209 100644
--- a/resolver/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java
+++ b/resolver/src/main/java/org/apache/james/jspf/policies/local/FallbackPolicy.java
@@ -19,7 +19,11 @@
 
 package org.apache.james.jspf.policies.local;
 
-import org.apache.james.jspf.core.Logger;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 import org.apache.james.jspf.core.SPF1Record;
 import org.apache.james.jspf.core.SPFRecordParser;
 import org.apache.james.jspf.core.exceptions.NeutralException;
@@ -28,25 +32,20 @@
 import org.apache.james.jspf.core.exceptions.SPFResultException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
 import org.apache.james.jspf.policies.PolicyPostFilter;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to support Fallback feature
  */
 public class FallbackPolicy implements PolicyPostFilter {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FallbackPolicy.class);
 
     private Map<String,SPF1Record> entryMap;
 
     private SPFRecordParser parser;
 
-    private Logger log;
-
-    public FallbackPolicy(Logger log, SPFRecordParser parser) {
-        this.log = log;
+    public FallbackPolicy(SPFRecordParser parser) {
         entryMap = Collections.synchronizedMap(new HashMap<String,SPF1Record>());
         this.parser = parser;
     }
@@ -65,15 +64,15 @@
             throws IllegalArgumentException {
         String host;
         try {
-            log.debug("Start parsing SPF-Record: " + rawSpfRecord);
+            LOGGER.debug("Start parsing SPF-Record: {}", rawSpfRecord);
             SPF1Record spfRecord = parser.parse(rawSpfRecord);
             if (rawHost.startsWith("*")) {
                 host = rawHost.substring(1);
-                log.debug("Convert host " + rawHost + " to " + host);
+                LOGGER.debug("Convert host {} to {}", rawHost, host);
             } else if (rawHost.endsWith("*")) {
                 int length = rawHost.length();
                 host = rawHost.substring(length - 1, length);
-                log.debug("Convert host " + rawHost + " to " + host);
+                LOGGER.debug("Convert host {} to {}", rawHost, host);
             } else {
                 host = rawHost;
             }
@@ -91,7 +90,7 @@
      * 
      */
     public void clearEntrys() {
-        log.debug("Clear all entries");
+        LOGGER.debug("Clear all entries");
         entryMap.clear();
     }
 
@@ -102,7 +101,7 @@
      *            The host
      */
     public void removeEntry(String host) {
-        log.debug("Remove fallback entry for host: " + host);
+        LOGGER.debug("Remove fallback entry for host: {}", host);
         synchronized (entryMap) {
             entryMap.remove(getRawEntry(host));
         }
diff --git a/resolver/src/main/java/org/apache/james/jspf/policies/local/OverridePolicy.java b/resolver/src/main/java/org/apache/james/jspf/policies/local/OverridePolicy.java
index 43f328f..099ffff 100644
--- a/resolver/src/main/java/org/apache/james/jspf/policies/local/OverridePolicy.java
+++ b/resolver/src/main/java/org/apache/james/jspf/policies/local/OverridePolicy.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.jspf.policies.local;
 
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPF1Record;
 import org.apache.james.jspf.core.SPFRecordParser;
 import org.apache.james.jspf.core.exceptions.NeutralException;
@@ -30,10 +29,9 @@
 
 public class OverridePolicy extends FallbackPolicy implements Policy {
 
-    public OverridePolicy(Logger log, SPFRecordParser parser) {
-        super(log, parser);
+    public OverridePolicy(SPFRecordParser parser) {
+        super(parser);
     }
-    
 
     /**
      * @see org.apache.james.jspf.policies.Policy#getSPFRecord(java.lang.String)
diff --git a/resolver/src/main/java/org/apache/james/jspf/policies/local/TrustedForwarderPolicy.java b/resolver/src/main/java/org/apache/james/jspf/policies/local/TrustedForwarderPolicy.java
index 313cc38..2cca5d7 100644
--- a/resolver/src/main/java/org/apache/james/jspf/policies/local/TrustedForwarderPolicy.java
+++ b/resolver/src/main/java/org/apache/james/jspf/policies/local/TrustedForwarderPolicy.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.jspf.policies.local;
 
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPF1Record;
 import org.apache.james.jspf.core.exceptions.NeutralException;
 import org.apache.james.jspf.core.exceptions.NoneException;
@@ -28,6 +27,8 @@
 import org.apache.james.jspf.policies.PolicyPostFilter;
 import org.apache.james.jspf.terms.Directive;
 import org.apache.james.jspf.terms.IncludeMechanism;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * PolicyPostFilter which implements trusted forwared. 
@@ -35,22 +36,13 @@
  *
  */
 public class TrustedForwarderPolicy implements PolicyPostFilter {
+    private static final Logger LOGGER = LoggerFactory.getLogger(TrustedForwarderPolicy.class);
 
     /**
      * The hostname to include
      */
     public static final String TRUSTED_FORWARDER_HOST = "spf.trusted-forwarder.org";
 
-    
-    private Logger log;
-
-    /**
-     * @param log the logger
-     */
-    public TrustedForwarderPolicy(Logger log) {
-        this.log = log;
-    }
-
     /**
      * @see org.apache.james.jspf.policies.PolicyPostFilter#getSPFRecord(java.lang.String, org.apache.james.jspf.core.SPF1Record)
      */
@@ -58,7 +50,7 @@
         if (spfRecord == null) return null;
         String mechanism = ((Directive) spfRecord.getDirectives().get(spfRecord.getDirectives().size())).toString();
         if (mechanism.equals("-all") || mechanism.equals("?all")) {
-            log.debug("Add TrustedForwarderPolicy = include:"+TRUSTED_FORWARDER_HOST);
+            LOGGER.debug("Add TrustedForwarderPolicy = include:{}", TRUSTED_FORWARDER_HOST);
             try {
                 IncludeMechanism trusted = new IncludeMechanism() {
                     /**
@@ -71,7 +63,7 @@
                         return this;
                     }
                 }.setHost(TRUSTED_FORWARDER_HOST);
-                spfRecord.getDirectives().add(spfRecord.getDirectives().size()-1, new Directive(null, trusted, log.getChildLogger("trustedforwarder")));
+                spfRecord.getDirectives().add(spfRecord.getDirectives().size()-1, new Directive(null, trusted));
             } catch (PermErrorException e) {
                 // will never happen
             }
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/AMechanism.java b/resolver/src/main/java/org/apache/james/jspf/terms/AMechanism.java
index 3433dc2..68784ff 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/AMechanism.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/AMechanism.java
@@ -20,6 +20,9 @@
 
 package org.apache.james.jspf.terms;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.james.jspf.core.DNSLookupContinuation;
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSResponse;
@@ -35,15 +38,15 @@
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
-
-import java.util.ArrayList;
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class represent the a mechanism
  * 
  */
 public class AMechanism extends GenericMechanism implements SPFCheckerDNSResponseListener {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AMechanism.class);
 
     private static final String ATTRIBUTE_AMECHANISM_IPV4CHECK = "AMechanism.ipv4check";
 
@@ -106,7 +109,7 @@
             // PermError / TempError
             // TODO: Should we replace this with the "right" Exceptions ?
             } catch (Exception e) {
-                log.debug("No valid ipAddress: ",e);
+                LOGGER.debug("No valid ipAddress: ", e);
                 throw new PermErrorException("No valid ipAddress: "
                         + spfData.getIpAddress());
             }
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/Directive.java b/resolver/src/main/java/org/apache/james/jspf/terms/Directive.java
index 12b2fa1..792f1ca 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/Directive.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/Directive.java
@@ -21,7 +21,6 @@
 package org.apache.james.jspf.terms;
 
 import org.apache.james.jspf.core.DNSLookupContinuation;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPF1Constants;
 import org.apache.james.jspf.core.SPFChecker;
 import org.apache.james.jspf.core.SPFSession;
@@ -29,11 +28,15 @@
 import org.apache.james.jspf.core.exceptions.NoneException;
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
+import org.apache.james.jspf.executor.FutureSPFResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A Directive is a mechanism with a resulting qualifier.
  */
 public class Directive implements SPFChecker {
+    private static final Logger LOGGER = LoggerFactory.getLogger(Directive.class);
 
     private final class MechanismResultChecker implements SPFChecker {
 
@@ -50,10 +53,10 @@
                 } else {
                     spfData.setCurrentResult(qualifier);
                 }
-                
-                log.info("Processed directive matched: " + Directive.this + " returned " + spfData.getCurrentResult());
+
+                LOGGER.info("Processed directive matched: {} returned {}", Directive.this, spfData.getCurrentResult());
             } else {
-                log.debug("Processed directive NOT matched: " + this);
+                LOGGER.debug("Processed directive NOT matched: {}", this);
             }
             return null;
         }
@@ -66,8 +69,6 @@
 
     private Mechanism mechanism = null;
 
-    private Logger log;
-
     private MechanismResultChecker resultChecker;
 
     /**
@@ -77,10 +78,9 @@
      * @param mechanism The Mechanism 
      * @throws PermErrorException Get thrown if a PermError should returned
      */
-    public Directive(String qualifier, Mechanism mechanism, Logger logger)
+    public Directive(String qualifier, Mechanism mechanism)
             throws PermErrorException {
         super();
-        this.log = logger;
         if (qualifier == null) {
             throw new PermErrorException("Qualifier cannot be null");
         }
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/ExpModifier.java b/resolver/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
index d97fe30..5c664b0 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.jspf.terms;
 
+import java.util.List;
+
 import org.apache.james.jspf.core.DNSLookupContinuation;
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSResponse;
@@ -35,8 +37,8 @@
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
-
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class represent the exp modifier
@@ -44,6 +46,8 @@
  */
 public class ExpModifier extends GenericModifier implements MacroExpandEnabled, SPFCheckerDNSResponseListener {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExpModifier.class);
+
     private final class ExpandedExplanationChecker implements SPFChecker {
        
         /**
@@ -165,7 +169,7 @@
             // errors in the explanation string, then proceed as if no exp modifier was given.   
             if (records.size() > 1) {
                 
-                log.debug("More then one TXT-Record found for explanation");
+                LOGGER.debug("More then one TXT-Record found for explanation");
                 // Only catch the error and return null
                 
             } else {
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/GenericMechanism.java b/resolver/src/main/java/org/apache/james/jspf/terms/GenericMechanism.java
index aa3d1c6..8453277 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/GenericMechanism.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/GenericMechanism.java
@@ -20,8 +20,6 @@
 
 package org.apache.james.jspf.terms;
 
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.MacroExpandEnabled;
 import org.apache.james.jspf.core.SPFSession;
@@ -31,7 +29,7 @@
  * This abstract class represent a gerneric mechanism
  *  
  */
-public abstract class GenericMechanism implements Mechanism, ConfigurationEnabled, LogEnabled, MacroExpandEnabled {
+public abstract class GenericMechanism implements Mechanism, ConfigurationEnabled, MacroExpandEnabled {
 
     /**
      * ABNF: ip4-cidr-length = "/" 1*DIGIT
@@ -52,8 +50,6 @@
 
     private String domain;
 
-    protected Logger log;
-
     protected MacroExpand macroExpand;
 
     /**
@@ -92,13 +88,6 @@
     }
 
     /**
-     * @see org.apache.james.jspf.core.LogEnabled#enableLogging(org.apache.james.jspf.core.Logger)
-     */
-    public void enableLogging(Logger logger) {
-        this.log = logger;
-    }
-
-    /**
      * @see org.apache.james.jspf.core.MacroExpandEnabled#enableMacroExpand(org.apache.james.jspf.core.MacroExpand)
      */
     public void enableMacroExpand(MacroExpand macroExpand) {
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/GenericModifier.java b/resolver/src/main/java/org/apache/james/jspf/terms/GenericModifier.java
index 16051a5..01a5c62 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/GenericModifier.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/GenericModifier.java
@@ -21,33 +21,32 @@
 package org.apache.james.jspf.terms;
 
 import org.apache.james.jspf.core.DNSLookupContinuation;
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.SPFSession;
 import org.apache.james.jspf.core.exceptions.NeutralException;
 import org.apache.james.jspf.core.exceptions.NoneException;
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This abstract class represent a gerneric modifier
  * 
  */
-public abstract class GenericModifier implements Modifier, ConfigurationEnabled, LogEnabled {
+public abstract class GenericModifier implements Modifier, ConfigurationEnabled {
+    private static final Logger LOGGER = LoggerFactory.getLogger(GenericModifier.class);
 
     private String host;
 
-    protected Logger log;
-
     /**
      * @see org.apache.james.jspf.core.SPFChecker#checkSPF(org.apache.james.jspf.core.SPFSession)
      */
     public DNSLookupContinuation checkSPF(SPFSession spfData) throws PermErrorException,
             TempErrorException, NeutralException, NoneException {
-        log.debug("Processing modifier: " + this);
+        LOGGER.debug("Processing modifier: {}", this);
         DNSLookupContinuation res = checkSPFLogged(spfData);
-        log.debug("Processed modifier: " + this + " resulted in "
-                + res == null ? spfData.getCurrentResult() : " dns continuation...");
+        LOGGER.debug("Processed modifier: {} resulted in {} ",
+            this, res == null ? spfData.getCurrentResult() : "dns continuation...");
         return res;
     }
     
@@ -77,14 +76,4 @@
     protected synchronized String getHost() {
         return host;
     }
-    
-
-    /**
-     * @see org.apache.james.jspf.core.LogEnabled#enableLogging(org.apache.james.jspf.core.Logger)
-     */
-    public void enableLogging(Logger logger) {
-        this.log = logger;
-    }
-
-
 }
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java b/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
index 3391665..6c01e21 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/IncludeMechanism.java
@@ -21,8 +21,6 @@
 package org.apache.james.jspf.terms;
 
 import org.apache.james.jspf.core.DNSLookupContinuation;
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.MacroExpandEnabled;
 import org.apache.james.jspf.core.SPF1Constants;
@@ -40,7 +38,7 @@
  * This class represent the incude mechanism
  * 
  */
-public class IncludeMechanism implements Mechanism, ConfigurationEnabled, LogEnabled, SPFCheckEnabled, MacroExpandEnabled {
+public class IncludeMechanism implements Mechanism, ConfigurationEnabled, SPFCheckEnabled, MacroExpandEnabled {
 
     private final class ExpandedChecker implements SPFChecker {
       
@@ -147,8 +145,6 @@
             + SPFTermsRegexps.DOMAIN_SPEC_REGEX;
 
     protected String host;
-    
-    protected Logger log;
 
     private SPFChecker spfChecker;
 
@@ -186,13 +182,6 @@
     }
 
     /**
-     * @see org.apache.james.jspf.core.LogEnabled#enableLogging(org.apache.james.jspf.core.Logger)
-     */
-    public void enableLogging(Logger logger) {
-        this.log = logger;
-    }
-
-    /**
      * @see java.lang.Object#toString()
      */
     public String toString() {
diff --git a/resolver/src/main/java/org/apache/james/jspf/terms/MXMechanism.java b/resolver/src/main/java/org/apache/james/jspf/terms/MXMechanism.java
index d866d70..1e54ad9 100644
--- a/resolver/src/main/java/org/apache/james/jspf/terms/MXMechanism.java
+++ b/resolver/src/main/java/org/apache/james/jspf/terms/MXMechanism.java
@@ -20,6 +20,9 @@
 
 package org.apache.james.jspf.terms;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.james.jspf.core.DNSLookupContinuation;
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSResponse;
@@ -34,15 +37,15 @@
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 import org.apache.james.jspf.core.exceptions.TempErrorException;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
-
-import java.util.ArrayList;
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class represent the mx mechanism
  * 
  */
 public class MXMechanism extends AMechanism implements SPFCheckerDNSResponseListener {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MXMechanism.class);
 
     private final class ExpandedChecker implements SPFChecker {
         
@@ -125,7 +128,7 @@
 
             String mx;
             while (records.size() > 0 && (mx = records.remove(0)) != null && mx.length() > 0) {
-                log.debug("Add MX-Record " + mx + " to list");
+                LOGGER.debug("Add MX-Record {} to list", mx);
 
                 return new DNSLookupContinuation(new DNSRequest(mx, isIPv6 ? DNSRequest.AAAA : DNSRequest.A), MXMechanism.this);
                 
diff --git a/resolver/src/test/java/org/apache/james/jspf/AbstractYamlTest.java b/resolver/src/test/java/org/apache/james/jspf/AbstractYamlTest.java
index aeae913..fa6af83 100644
--- a/resolver/src/test/java/org/apache/james/jspf/AbstractYamlTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/AbstractYamlTest.java
@@ -19,17 +19,23 @@
 
 package org.apache.james.jspf;
 
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSService;
 import org.apache.james.jspf.core.DNSServiceEnabled;
-import org.apache.james.jspf.core.LogEnabled;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.MacroExpandEnabled;
 import org.apache.james.jspf.core.SPFCheckEnabled;
 import org.apache.james.jspf.core.SPFRecordParser;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
-import org.apache.james.jspf.tester.DNSTestingServer;
 import org.apache.james.jspf.executor.SPFExecutor;
 import org.apache.james.jspf.executor.SPFResult;
 import org.apache.james.jspf.executor.StagedMultipleSPFExecutor;
@@ -40,9 +46,11 @@
 import org.apache.james.jspf.impl.DefaultTermsFactory;
 import org.apache.james.jspf.impl.SPF;
 import org.apache.james.jspf.parser.RFC4408SPF1Parser;
-import org.apache.james.jspf.wiring.WiringService;
-import org.apache.james.jspf.wiring.WiringServiceException;
+import org.apache.james.jspf.tester.DNSTestingServer;
 import org.apache.james.jspf.tester.SPFYamlTestDescriptor;
+import org.apache.james.jspf.wiring.WiringService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xbill.DNS.Cache;
 import org.xbill.DNS.DClass;
 import org.xbill.DNS.Lookup;
@@ -51,23 +59,14 @@
 import org.xbill.DNS.SimpleResolver;
 import org.xbill.DNS.TextParseException;
 
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
 import uk.nominet.dnsjnio.ExtendedNonblockingResolver;
 import uk.nominet.dnsjnio.LookupAsynch;
 import uk.nominet.dnsjnio.NonblockingResolver;
 
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
-
 public abstract class AbstractYamlTest extends TestCase {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractYamlTest.class);
 
     private static final int FAKE_SERVER_PORT = 31348;
     protected static final int TIMEOUT = 10;
@@ -84,7 +83,6 @@
 
     SPFYamlTestDescriptor data;
     String test;
-    protected Logger log;
     private SPFExecutor executor;
     protected static MacroExpand macroExpand;
     protected static SPF spf;
@@ -132,25 +130,16 @@
     }
 
     protected void runTest() throws Throwable {
-
-        if (log == null) {
-                log = new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG, "root");
-        }
         
-        log.info("Running test: "+getName()+" ...");
+        LOGGER.info("Running test: "+getName()+" ...");
 
         if (parser == null) {
             /* PREVIOUS SLOW WAY 
             enabledServices = new WiringServiceTable();
             enabledServices.put(LogEnabled.class, log);
             */
-            parser = new RFC4408SPF1Parser(log.getChildLogger("parser"), new DefaultTermsFactory(log.getChildLogger("termsfactory"), new WiringService() {
-
-                public void wire(Object component) throws WiringServiceException {
-                    if (component instanceof LogEnabled) {
-                        String[] path = component.getClass().toString().split("\\.");
-                        ((LogEnabled) component).enableLogging(log.getChildLogger("dep").getChildLogger(path[path.length-1].toLowerCase()));
-                    }
+            parser = new RFC4408SPF1Parser(new DefaultTermsFactory(new WiringService() {
+                public void wire(Object component) {
                     if (component instanceof MacroExpandEnabled) {
                         ((MacroExpandEnabled) component).enableMacroExpand(macroExpand);
                     }
@@ -161,18 +150,17 @@
                         ((SPFCheckEnabled) component).enableSPFChecking(spf);
                     }
                 }
-                
             }));
         }
         if (this.data != AbstractYamlTest.prevData) {
-            dns = new LoggingDNSService(getDNSService(), log.getChildLogger("dns"));
+            dns = new LoggingDNSService(getDNSService());
             AbstractYamlTest.prevData = this.data;
         }
-        macroExpand = new MacroExpand(log.getChildLogger("macroExpand"), dns);
+        macroExpand = new MacroExpand(dns);
         if (getSpfExecutorType() == SYNCHRONOUS_EXECUTOR) {  // synchronous
-            executor = new SynchronousSPFExecutor(log, dns);
+            executor = new SynchronousSPFExecutor(dns);
         } else if (getSpfExecutorType() == STAGED_EXECUTOR || getSpfExecutorType() == STAGED_EXECUTOR_MULTITHREADED){
-            executor = new StagedMultipleSPFExecutor(log, new DNSServiceAsynchSimulator(dns, getSpfExecutorType() == STAGED_EXECUTOR_MULTITHREADED));
+            executor = new StagedMultipleSPFExecutor(new DNSServiceAsynchSimulator(dns, getSpfExecutorType() == STAGED_EXECUTOR_MULTITHREADED));
         } else if (getSpfExecutorType() == STAGED_EXECUTOR_DNSJNIO) {
             
             // reset cache between usages of the asynchronous lookuper
@@ -200,7 +188,7 @@
                 
                 DNSJnioAsynchService jnioAsynchService = new DNSJnioAsynchService(resolver);
                 jnioAsynchService.setTimeout(TIMEOUT);
-                executor = new StagedMultipleSPFExecutor(log, jnioAsynchService);
+                executor = new StagedMultipleSPFExecutor(jnioAsynchService);
 
             } catch (UnknownHostException e) {
                 // TODO Auto-generated catch block
@@ -210,7 +198,7 @@
         } else {
             throw new UnsupportedOperationException("Unknown executor type");
         }
-        spf = new SPF(dns, parser, log.getChildLogger("spf"), macroExpand, executor);
+        spf = new SPF(dns, parser, macroExpand, executor);
 
         if (test != null) {
             String next = test;
@@ -229,7 +217,7 @@
                 try {
                     verifyResult(next, queries.get(next));
                 } catch (AssertionFailedError e) {
-                    log.getChildLogger(next).info("FAILED. "+e.getMessage()+" ("+getName()+")", e.getMessage()==null ? e : null);
+                    LOGGER.info("FAILED. {} ({})", e.getMessage(), getName(), e);
                     if (firstError == null) firstError = e;
                 }
             }
@@ -240,8 +228,7 @@
 
     private SPFResult runSingleTest(String testName) {
         Map<String, ?> currentTest = data.getTests().get(testName);
-        Logger testLogger = log.getChildLogger(testName);
-        testLogger.info("TESTING "+testName+": "+currentTest.get("description"));
+        LOGGER.info("TESTING {}: {}", testName, currentTest.get("description"));
 
         String ip = null;
         String sender = null;
@@ -267,7 +254,6 @@
     private void verifyResult(String testName, SPFResult res) {
         String resultSPF = res.getResult();
         Map<String,?> currentTest = data.getTests().get(testName);
-        Logger testLogger = log.getChildLogger(testName+"-verify");
         if (currentTest.get("result") instanceof String) {
             assertEquals("Test "+testName+" ("+currentTest.get("description")+") failed. Returned: "+resultSPF+" Expected: "+currentTest.get("result")+" [["+resultSPF+"||"+res.getHeaderText()+"]]", currentTest.get("result"), resultSPF);
         } else {
@@ -296,7 +282,7 @@
     
         }
     
-        testLogger.info("PASSED. Result="+resultSPF+" Explanation="+res.getExplanation()+" Header="+res.getHeaderText());
+        LOGGER.info("PASSED. Result={} Explanation={} Header={}", resultSPF, res.getExplanation(), res.getHeaderText());
     }
 
     /**
@@ -353,7 +339,7 @@
         
         dnsTestServer.setData((Map<String, List<?>>) data.getZonedata());
         
-        DNSServiceXBillImpl serviceXBillImpl = new DNSServiceXBillImpl(log) {
+        DNSServiceXBillImpl serviceXBillImpl = new DNSServiceXBillImpl() {
 
             public List<String> getLocalDomainNames() {
                 List<String> l = new ArrayList<String>();
@@ -371,7 +357,7 @@
      * @return a real dns resolver
      */
     protected DNSService getDNSServiceReal() {
-        DNSServiceXBillImpl serviceXBillImpl = new DNSServiceXBillImpl(log);
+        DNSServiceXBillImpl serviceXBillImpl = new DNSServiceXBillImpl();
         // TIMEOUT 2 seconds
         serviceXBillImpl.setTimeOut(TIMEOUT);
         return serviceXBillImpl;
diff --git a/resolver/src/test/java/org/apache/james/jspf/ConsoleLogger.java b/resolver/src/test/java/org/apache/james/jspf/ConsoleLogger.java
deleted file mode 100644
index 3d43e2d..0000000
--- a/resolver/src/test/java/org/apache/james/jspf/ConsoleLogger.java
+++ /dev/null
@@ -1,289 +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.james.jspf;
-
-import org.apache.james.jspf.core.Logger;
-
-/**
- * Logger sending everything to the standard output streams.
- * This is mainly for the cases when you have a utility that
- * does not have a logger to supply.
- */
-public final class ConsoleLogger implements Logger {
-    
-    /** Typecode for debugging messages. */
-    public static final int LEVEL_DEBUG = 0;
-
-    /** Typecode for informational messages. */
-    public static final int LEVEL_INFO = 1;
-
-    /** Typecode for warning messages. */
-    public static final int LEVEL_WARN = 2;
-
-    /** Typecode for error messages. */
-    public static final int LEVEL_ERROR = 3;
-
-    /** Typecode for fatal error messages. */
-    public static final int LEVEL_FATAL = 4;
-
-    /** Typecode for disabled log levels. */
-    public static final int LEVEL_DISABLED = 5;
-
-    private final int m_logLevel;
-
-    /**
-     * Current logger path.
-     */
-    private String m_path;
-
-    /**
-     * Creates a new ConsoleLogger with the priority set to DEBUG.
-     */
-    public ConsoleLogger()
-    {
-        this( LEVEL_DEBUG , "ROOT");
-    }
-
-    /**
-     * Creates a new ConsoleLogger.
-     * @param logLevel log level typecode
-     */
-    public ConsoleLogger( final int logLevel, final String path )
-    {
-        m_logLevel = logLevel;
-        m_path = path;
-    }
-
-    /**
-     * Logs a debugging message.
-     *
-     * @param message a <code>String</code> value
-     */
-    public void debug( final String message )
-    {
-        debug( message, null );
-    }
-
-    /**
-     * Logs a debugging message and an exception.
-     *
-     * @param message a <code>String</code> value
-     * @param throwable a <code>Throwable</code> value
-     */
-    public void debug( final String message, final Throwable throwable )
-    {
-        if( m_logLevel <= LEVEL_DEBUG )
-        {
-            System.out.print( "[DEBUG] " );
-            System.out.print( m_path+" " );
-            System.out.println( message );
-
-            if( null != throwable )
-            {
-                throwable.printStackTrace( System.out );
-            }
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if debug-level logging is enabled, false otherwise.
-     *
-     * @return <code>true</code> if debug-level logging
-     */
-    public boolean isDebugEnabled()
-    {
-        return m_logLevel <= LEVEL_DEBUG;
-    }
-
-    /**
-     * Logs an informational message.
-     *
-     * @param message a <code>String</code> value
-     */
-    public void info( final String message )
-    {
-        info( message, null );
-    }
-
-    /**
-     * Logs an informational message and an exception.
-     *
-     * @param message a <code>String</code> value
-     * @param throwable a <code>Throwable</code> value
-     */
-    public void info( final String message, final Throwable throwable )
-    {
-        if( m_logLevel <= LEVEL_INFO )
-        {
-            System.out.print( "[INFO] " );
-            System.out.print( m_path+" " );
-            System.out.println( message );
-
-            if( null != throwable )
-            {
-                throwable.printStackTrace( System.out );
-            }
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if info-level logging is enabled, false otherwise.
-     *
-     * @return <code>true</code> if info-level logging is enabled
-     */
-    public boolean isInfoEnabled()
-    {
-        return m_logLevel <= LEVEL_INFO;
-    }
-
-    /**
-     * Logs a warning message.
-     *
-     * @param message a <code>String</code> value
-     */
-    public void warn( final String message )
-    {
-        warn( message, null );
-    }
-
-    /**
-     * Logs a warning message and an exception.
-     *
-     * @param message a <code>String</code> value
-     * @param throwable a <code>Throwable</code> value
-     */
-    public void warn( final String message, final Throwable throwable )
-    {
-        if( m_logLevel <= LEVEL_WARN )
-        {
-            System.out.print( "[WARNING] " );
-            System.out.print( m_path+" " );
-            System.out.println( message );
-
-            if( null != throwable )
-            {
-                throwable.printStackTrace( System.out );
-            }
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if warn-level logging is enabled, false otherwise.
-     *
-     * @return <code>true</code> if warn-level logging is enabled
-     */
-    public boolean isWarnEnabled()
-    {
-        return m_logLevel <= LEVEL_WARN;
-    }
-
-    /**
-     * Logs an error message.
-     *
-     * @param message a <code>String</code> value
-     */
-    public void error( final String message )
-    {
-        error( message, null );
-    }
-
-    /**
-     * Logs an error message and an exception.
-     *
-     * @param message a <code>String</code> value
-     * @param throwable a <code>Throwable</code> value
-     */
-    public void error( final String message, final Throwable throwable )
-    {
-        if( m_logLevel <= LEVEL_ERROR )
-        {
-            System.out.print( "[ERROR] " );
-            System.out.print( m_path+" " );
-            System.out.println( message );
-
-            if( null != throwable )
-            {
-                throwable.printStackTrace( System.out );
-            }
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if error-level logging is enabled, false otherwise.
-     *
-     * @return <code>true</code> if error-level logging is enabled
-     */
-    public boolean isErrorEnabled()
-    {
-        return m_logLevel <= LEVEL_ERROR;
-    }
-
-    /**
-     * Logs a fatal error message.
-     *
-     * @param message a <code>String</code> value
-     */
-    public void fatalError( final String message )
-    {
-        fatalError( message, null );
-    }
-
-    /**
-     * Logs a fatal error message and an exception.
-     *
-     * @param message a <code>String</code> value
-     * @param throwable a <code>Throwable</code> value
-     */
-    public void fatalError( final String message, final Throwable throwable )
-    {
-        if( m_logLevel <= LEVEL_FATAL )
-        {
-            System.out.print( "[FATAL ERROR] " );
-            System.out.print( m_path+" " );
-            System.out.println( message );
-
-            if( null != throwable )
-            {
-                throwable.printStackTrace( System.out );
-            }
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if fatal-level logging is enabled, false otherwise.
-     *
-     * @return <code>true</code> if fatal-level logging is enabled
-     */
-    public boolean isFatalErrorEnabled()
-    {
-        return m_logLevel <= LEVEL_FATAL;
-    }
-
-    /**
-     * Just returns this logger (<code>ConsoleLogger</code> is not hierarchical).
-     *
-     * @param name ignored
-     * @return this logger
-     */
-    public Logger getChildLogger( final String name )
-    {
-        return new ConsoleLogger(m_logLevel, m_path+"."+name);
-    }
-}
\ No newline at end of file
diff --git a/resolver/src/test/java/org/apache/james/jspf/LoggingDNSService.java b/resolver/src/test/java/org/apache/james/jspf/LoggingDNSService.java
index 39b098e..f755c58 100644
--- a/resolver/src/test/java/org/apache/james/jspf/LoggingDNSService.java
+++ b/resolver/src/test/java/org/apache/james/jspf/LoggingDNSService.java
@@ -21,19 +21,20 @@
 
 import org.apache.james.jspf.core.DNSRequest;
 import org.apache.james.jspf.core.DNSService;
-import org.apache.james.jspf.core.Logger;
 import org.apache.james.jspf.core.exceptions.TimeoutException;
+import org.apache.james.jspf.executor.FutureSPFResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
 
 public class LoggingDNSService implements DNSService {
+    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingDNSService.class);
 
     private DNSService dnsService;
-    private Logger logger;
 
-    public LoggingDNSService(DNSService service, Logger logger) {
+    public LoggingDNSService(DNSService service) {
         this.dnsService = service;
-        this.logger = logger;
     }
 
     /**
@@ -72,7 +73,7 @@
         } else {
             logBuff.append("getLocalDomainNames-ret: null");
         }
-        logger.debug(logBuff.toString());
+        LOGGER.debug(logBuff.toString());
         return res;
 
     }
@@ -106,11 +107,11 @@
             } else {
                 logBuff.append("getRecords-ret: null");
             }
-            logger.debug(logBuff.toString());
+            LOGGER.debug(logBuff.toString());
             return result;
         } catch (TimeoutException e) {
-            logger.debug("getRecords(" + request.getHostname()
-                    + ") = TempErrorException[" + e.getMessage() + "]");
+            LOGGER.debug("getRecords({}) = TempErrorException[{}]",
+                request.getHostname(), e.getMessage());
             throw e;
         }
     }
diff --git a/resolver/src/test/java/org/apache/james/jspf/RFC4408AsynchronousYamlTest.java b/resolver/src/test/java/org/apache/james/jspf/RFC4408AsynchronousYamlTest.java
index b04fd9b..c0f4e7a 100644
--- a/resolver/src/test/java/org/apache/james/jspf/RFC4408AsynchronousYamlTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/RFC4408AsynchronousYamlTest.java
@@ -19,14 +19,12 @@
 

 package org.apache.james.jspf;

 

-import org.apache.james.jspf.core.Logger;

-import org.apache.james.jspf.impl.Log4JLogger;

-import org.apache.james.jspf.tester.SPFYamlTestDescriptor;

-

 import java.io.IOException;

 import java.util.Iterator;

 import java.util.List;

 

+import org.apache.james.jspf.tester.SPFYamlTestDescriptor;

+

 import junit.framework.Test;

 import junit.framework.TestSuite;

 import junit.textui.TestRunner;

@@ -80,10 +78,6 @@
 

     }

     

-    protected void setLogger(Logger logger) {

-        this.log = logger;

-    }

-    

     /**

      * This method has been created for spf spec people to let them better read the

      * output of our tests against their yaml file

@@ -92,8 +86,6 @@
      * @throws Throwable 

      */

     public static void main(String[] args) throws Throwable {

-        Logger l = new Log4JLogger(org.apache.log4j.Logger.getLogger("ROOT"));

-

         List<SPFYamlTestDescriptor> tests = SPFYamlTestDescriptor.loadTests(YAMLFILE2);

         Iterator<SPFYamlTestDescriptor> i = tests.iterator();

         while (i.hasNext()) {

@@ -101,7 +93,6 @@
             Iterator<String> ttt = o.getTests().keySet().iterator();

             while (ttt.hasNext()) {

                 RFC4408AsynchronousYamlTest t = new RFC4408AsynchronousYamlTest(o, ttt.next());

-                t.setLogger(l);

                 TestRunner.run(t);

             }

         }

diff --git a/resolver/src/test/java/org/apache/james/jspf/RFC4408YamlTest.java b/resolver/src/test/java/org/apache/james/jspf/RFC4408YamlTest.java
index 26da529..32a0766 100644
--- a/resolver/src/test/java/org/apache/james/jspf/RFC4408YamlTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/RFC4408YamlTest.java
@@ -19,14 +19,12 @@
 
 package org.apache.james.jspf;
 
-import org.apache.james.jspf.core.Logger;
-import org.apache.james.jspf.impl.Log4JLogger;
-import org.apache.james.jspf.tester.SPFYamlTestDescriptor;
-
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.james.jspf.tester.SPFYamlTestDescriptor;
+
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
@@ -86,10 +84,6 @@
 
     }
     
-    protected void setLogger(Logger logger) {
-        this.log = logger;
-    }
-    
     /**
      * This method has been created for spf spec people to let them better read the
      * output of our tests against their yaml file
@@ -98,8 +92,6 @@
      * @throws Throwable 
      */
     public static void main(String[] args) throws Throwable {
-        Logger l = new Log4JLogger(org.apache.log4j.Logger.getLogger("ROOT"));
-
         List<SPFYamlTestDescriptor> tests = SPFYamlTestDescriptor.loadTests(YAMLFILE2);
         Iterator<SPFYamlTestDescriptor> i = tests.iterator();
         while (i.hasNext()) {
@@ -107,7 +99,6 @@
             Iterator<String> ttt = o.getTests().keySet().iterator();
             while (ttt.hasNext()) {
                 RFC4408YamlTest t = new RFC4408YamlTest(o,(String) ttt.next());
-                t.setLogger(l);
                 TestRunner.run(t);
             }
         }
diff --git a/resolver/src/test/java/org/apache/james/jspf/SPF1ParserTest.java b/resolver/src/test/java/org/apache/james/jspf/SPF1ParserTest.java
index 882e5cf..21d2f73 100644
--- a/resolver/src/test/java/org/apache/james/jspf/SPF1ParserTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/SPF1ParserTest.java
@@ -52,7 +52,7 @@
             }
         }
         assertNotNull(data);
-        parser = new RFC4408SPF1Parser(new ConsoleLogger(), new DefaultTermsFactory(new ConsoleLogger()));
+        parser = new RFC4408SPF1Parser(new DefaultTermsFactory());
     }
 
     public static Test suite() throws IOException {
@@ -171,7 +171,7 @@
             super();
             List<SPF1RecordTestDef> tests = loadTests();
             Iterator<SPF1RecordTestDef> i = tests.iterator();
-            SPFRecordParser parser = new RFC4408SPF1Parser(new ConsoleLogger(), new DefaultTermsFactory(new ConsoleLogger()));
+            SPFRecordParser parser = new RFC4408SPF1Parser(new DefaultTermsFactory());
             while (i.hasNext()) {
                 addTest(new SPF1ParserTest((SPF1RecordTestDef) i.next(), parser));
             }
diff --git a/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java b/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
index e3ca4a9..020ab69 100644
--- a/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
+++ b/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
@@ -19,9 +19,6 @@
 
 package org.apache.james.jspf.core;
 
-import org.apache.james.jspf.ConsoleLogger;
-import org.apache.james.jspf.core.MacroData;
-import org.apache.james.jspf.core.MacroExpand;
 import org.apache.james.jspf.core.exceptions.PermErrorException;
 
 import junit.framework.TestCase;
@@ -97,8 +94,8 @@
 
     protected void setUp() throws Exception {
         super.setUp();
-        defIp4me = new MacroExpand(new ConsoleLogger(), null);
-        defIp6me = new MacroExpand(new ConsoleLogger(), null);
+        defIp4me = new MacroExpand(null);
+        defIp6me = new MacroExpand(null);
     }
 
     public void testPercS() throws PermErrorException {
diff --git a/resolver/src/test/resources/log4j.properties b/resolver/src/test/resources/log4j.properties
deleted file mode 100644
index 665e4c1..0000000
--- a/resolver/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,35 +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.                                           #
-#################################################################
-
-#
-# The logging properties
-#
-log4j.rootLogger=DEBUG, stdout
-
-# CONSOLE appender not used by default
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
-
-# File appender
-log4j.appender.out=org.apache.log4j.FileAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
-log4j.appender.out.file=target/log.txt
-log4j.appender.out.append=false
diff --git a/resolver/src/test/resources/logback-test.xml b/resolver/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..19ebfff
--- /dev/null
+++ b/resolver/src/test/resources/logback-test.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+                <file>test-run.log</file>
+                <append>false</append>
+                <!-- set immediateFlush to false for much higher logging throughput -->
+                <immediateFlush>false</immediateFlush>
+                <!-- encoders are assigned the type
+                     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+                <encoder>
+                        <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{35} - %msg%n%rEx</pattern>
+                </encoder>
+        </appender>
+
+
+        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+                <encoder>
+                        <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern>
+                </encoder>
+                <immediateFlush>false</immediateFlush>
+                <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                        <level>ERROR</level>
+                </filter>
+        </appender>
+
+        <root level="WARN">
+                <appender-ref ref="CONSOLE" />
+                <appender-ref ref="FILE" />
+        </root>
+        <logger name="org.apache.james" level="DEBUG" />
+
+</configuration>