diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index d02d27a..3511b6f 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -849,10 +849,6 @@
                     throw new RuntimeException("Unable to start system bundle.");
                 }
 
-                // Now that the system bundle is successfully created we can give
-                // its bundle context to the logger so that it can track log services.
-                m_logger.setSystemBundleContext(_getBundleContext());
-
                 // We have to check with the security provider (if there is one).
                 // This is to avoid having bundles in the cache that have been tampered with
                 SecurityProvider sp = getFramework().getSecurityProvider();
@@ -4603,7 +4599,7 @@
             }
         }
     }
-    
+
     private void loadPrefixFromDefaultIfNotDefined(Map configMap, Properties defaultProperties, String prefix)
     {
         Map<String, String> defaultPropsWithPrefix = Util.getDefaultPropertiesWithPrefix(defaultProperties, prefix);
diff --git a/framework/src/main/java/org/apache/felix/framework/Logger.java b/framework/src/main/java/org/apache/felix/framework/Logger.java
index 42f3b13..6398689 100644
--- a/framework/src/main/java/org/apache/felix/framework/Logger.java
+++ b/framework/src/main/java/org/apache/felix/framework/Logger.java
@@ -18,15 +18,8 @@
  */
 package org.apache.felix.framework;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -41,42 +34,14 @@
  * The log levels match those specified in the OSGi Log Service (i.e., 1 = error,
  * 2 = warning, 3 = information, and 4 = debug). The default value is 1.
  * </p>
- * <p>
- * This class also uses the System Bundle's context to track log services
- * and will use the highest ranking log service, if present, as a back end
- * instead of printing to standard out. The class uses reflection to invoking
- * the log service's method to avoid a dependency on the log interface.
- * </p>
 **/
-public class Logger extends org.apache.felix.resolver.Logger implements ServiceListener
+public class Logger extends org.apache.felix.resolver.Logger
 {
-    // TODO see if this class can be cleaned up a little more
-    private BundleContext m_context = null;
-
-    private final static int LOGGER_OBJECT_IDX = 0;
-    private final static int LOGGER_METHOD_IDX = 1;
-    private ServiceReference m_logRef = null;
-    private Object[] m_logger = null;
-
     public Logger()
     {
         super(LOG_ERROR);
     }
 
-    protected void setSystemBundleContext(BundleContext context)
-    {
-        // TODO: Find a way to log to a log service inside the framework.
-        // The issue is that we log messages while holding framework
-        // internal locks -- hence, when a log service calls back into
-        // the framework (e.g., by loading a class) we might deadlock.
-        // One instance of this problem is tracked in FELIX-536.
-        // For now we just disable logging to log services inside the
-        // framework.
-
-        // m_context = context;
-        // startListeningForLogService();
-    }
-
     public final void log(ServiceReference sr, int level, String msg)
     {
         _log(null, sr, level, msg, null);
@@ -147,161 +112,10 @@
         Bundle bundle, ServiceReference sr, int level,
         String msg, Throwable throwable)
     {
-        // Save our own copy just in case it changes. We could try to do
-        // more conservative locking here, but let's be optimistic.
-        Object[] logger = m_logger;
-
         if (getLogLevel() >= level)
         {
-            // Use the log service if available.
-            if (logger != null)
-            {
-                _logReflectively(logger, sr, level, msg, throwable);
-            }
-            // Otherwise, default logging action.
-            else
-            {
-                doLog(bundle, sr, level, msg, throwable);
-            }
-        }
-    }
-
-    private void _logReflectively(
-        Object[] logger, ServiceReference sr, int level, String msg, Throwable throwable)
-    {
-        if (logger != null)
-        {
-            Object[] params = {
-                sr, new Integer(level), msg, throwable
-            };
-            try
-            {
-                ((Method) logger[LOGGER_METHOD_IDX]).invoke(logger[LOGGER_OBJECT_IDX], params);
-            }
-            catch (InvocationTargetException ex)
-            {
-                System.err.println("Logger: " + ex);
-            }
-            catch (IllegalAccessException ex)
-            {
-                System.err.println("Logger: " + ex);
-            }
-        }
-    }
-
-    /**
-     * This method is called when the system bundle context is set;
-     * it simply adds a service listener so that the system bundle can track
-     * log services to be used as the back end of the logging mechanism. It also
-     * attempts to get an existing log service, if present, but in general
-     * there will never be a log service present since the system bundle is
-     * started before every other bundle.
-    **/
-    private synchronized void startListeningForLogService()
-    {
-        // Add a service listener for log services.
-        try
-        {
-            m_context.addServiceListener(
-                this, "(objectClass=org.osgi.service.log.LogService)");
-        }
-        catch (InvalidSyntaxException ex) {
-            // This will never happen since the filter is hard coded.
-        }
-        // Try to get an existing log service.
-        m_logRef = m_context.getServiceReference("org.osgi.service.log.LogService");
-        // Get the service object if available and set it in the logger.
-        if (m_logRef != null)
-        {
-            setLogger(m_context.getService(m_logRef));
-        }
-    }
-
-    /**
-     * This method implements the callback for the ServiceListener interface.
-     * It is public as a byproduct of implementing the interface and should
-     * not be called directly. This method tracks run-time changes to log
-     * service availability. If the log service being used by the framework's
-     * logging mechanism goes away, then this will try to find an alternative.
-     * If a higher ranking log service is registered, then this will switch
-     * to the higher ranking log service.
-    **/
-    public final synchronized void serviceChanged(ServiceEvent event)
-    {
-        // If no logger is in use, then grab this one.
-        if ((event.getType() == ServiceEvent.REGISTERED) && (m_logRef == null))
-        {
-            m_logRef = event.getServiceReference();
-            // Get the service object and set it in the logger.
-            setLogger(m_context.getService(m_logRef));
-        }
-        // If a logger is in use, but this one has a higher ranking, then swap
-        // it for the existing logger.
-        else if ((event.getType() == ServiceEvent.REGISTERED) && (m_logRef != null))
-        {
-            ServiceReference ref =
-                m_context.getServiceReference("org.osgi.service.log.LogService");
-            if (!ref.equals(m_logRef))
-            {
-                m_context.ungetService(m_logRef);
-                m_logRef = ref;
-                setLogger(m_context.getService(m_logRef));
-            }
-
-        }
-        // If the current logger is going away, release it and try to
-        // find another one.
-        else if ((event.getType() == ServiceEvent.UNREGISTERING) &&
-            m_logRef.equals(event.getServiceReference()))
-        {
-            // Unget the service object.
-            m_context.ungetService(m_logRef);
-            // Try to get an existing log service.
-            m_logRef = m_context.getServiceReference(
-                "org.osgi.service.log.LogService");
-            // Get the service object if available and set it in the logger.
-            if (m_logRef != null)
-            {
-                setLogger(m_context.getService(m_logRef));
-            }
-            else
-            {
-                setLogger(null);
-            }
-        }
-    }
-
-    /**
-     * This method sets the new log service object. It also caches the method to
-     * invoke. The service object and method are stored in array to optimistically
-     * eliminate the need to locking when logging.
-    **/
-    private void setLogger(Object logObj)
-    {
-        if (logObj == null)
-        {
-            m_logger = null;
-        }
-        else
-        {
-            Class[] formalParams = {
-                ServiceReference.class,
-                Integer.TYPE,
-                String.class,
-                Throwable.class
-            };
-
-            try
-            {
-                Method logMethod = logObj.getClass().getMethod("log", formalParams);
-                logMethod.setAccessible(true);
-                m_logger = new Object[] { logObj, logMethod };
-            }
-            catch (NoSuchMethodException ex)
-            {
-                System.err.println("Logger: " + ex);
-                m_logger = null;
-            }
+            // Default logging action.
+            doLog(bundle, sr, level, msg, throwable);
         }
     }
 }
