diff --git a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
index 8fce1f6..52e9ffd 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
@@ -138,7 +138,7 @@
                 // 112.4.1 If an XML document specified by the header cannot be located in the bundle and its attached
                 // fragments, SCR must log an error message with the Log Service, if present, and continue.
                 log( LogService.LOG_ERROR, "Component descriptor entry ''{0}'' not found", new Object[]
-                    { descriptorLocation }, null, null );
+                    { descriptorLocation }, null, null, null );
                 continue;
             }
 
@@ -252,7 +252,7 @@
                 {
                     // There is a problem with this particular component, we'll log the error
                     // and proceed to the next one
-                    log( LogService.LOG_ERROR, "Cannot register Component", metadata, t );
+                    log( LogService.LOG_ERROR, "Cannot register Component", metadata, null, t );
 
                     // make sure the name is not reserved any more
                     if ( key != null )
@@ -268,12 +268,12 @@
             // fragments, SCR must log an error message with the Log Service, if present, and continue.
 
             log( LogService.LOG_ERROR, "Problem reading descriptor entry ''{0}''", new Object[]
-                { descriptorLocation }, null, ex );
+                { descriptorLocation }, null, null, ex );
         }
         catch ( Exception ex )
         {
             log( LogService.LOG_ERROR, "General problem with descriptor entry ''{0}''", new Object[]
-                { descriptorLocation }, null, ex );
+                { descriptorLocation }, null, null, ex );
         }
         finally
         {
@@ -306,7 +306,7 @@
         m_active = false;
 
         log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [{0}] will destroy {1} instances", new Object[]
-            { new Long( m_context.getBundle().getBundleId() ), new Integer( m_managers.size() ) }, null, null );
+            { new Long( m_context.getBundle().getBundleId() ), new Integer( m_managers.size() ) }, null, null, null );
 
         while ( m_managers.size() != 0 )
         {
@@ -319,7 +319,7 @@
             catch ( Exception e )
             {
                 log( LogService.LOG_ERROR, "BundleComponentActivator : Exception invalidating", holder
-                    .getComponentMetadata(), e );
+                    .getComponentMetadata(), null, e );
             }
             finally
             {
@@ -330,7 +330,7 @@
         }
 
         log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [{0}] STOPPED", new Object[]
-            {m_context.getBundle().getBundleId()}, null, null );
+            {m_context.getBundle().getBundleId()}, null, null, null );
 
         if (m_logService != null) {
             m_logService.close();
@@ -394,12 +394,12 @@
         {
             try
             {
-                log( LogService.LOG_DEBUG, "Enabling Component", aHolder.getComponentMetadata(), null );
+                log( LogService.LOG_DEBUG, "Enabling Component", aHolder.getComponentMetadata(), null, null );
                 aHolder.enableComponents( true );
             }
             catch ( Throwable t )
             {
-                log( LogService.LOG_ERROR, "Cannot enable component", aHolder.getComponentMetadata(), t );
+                log( LogService.LOG_ERROR, "Cannot enable component", aHolder.getComponentMetadata(), null, t );
             }
         }
     }
@@ -426,12 +426,12 @@
         {
             try
             {
-                log( LogService.LOG_DEBUG, "Disabling Component", aHolder.getComponentMetadata(), null );
+                log( LogService.LOG_DEBUG, "Disabling Component", aHolder.getComponentMetadata(), null, null );
                 aHolder.disableComponents( true );
             }
             catch ( Throwable t )
             {
-                log( LogService.LOG_ERROR, "Cannot disable component", aHolder.getComponentMetadata(), t );
+                log( LogService.LOG_ERROR, "Cannot disable component", aHolder.getComponentMetadata(), null, t );
             }
         }
     }
@@ -501,7 +501,7 @@
             }
             else
             {
-                log( LogService.LOG_DEBUG, "Component Actor Thread not running, calling synchronously", null, null );
+                log( LogService.LOG_DEBUG, "Component Actor Thread not running, calling synchronously", null, null, null );
                 try
                 {
                     synchronized ( this )
@@ -511,14 +511,14 @@
                 }
                 catch ( Throwable t )
                 {
-                    log( LogService.LOG_WARNING, "Unexpected problem executing task", null, t );
+                    log( LogService.LOG_WARNING, "Unexpected problem executing task", null, null, t );
                 }
             }
         }
         else
         {
             log( LogService.LOG_WARNING, "BundleComponentActivator is not active; not scheduling {0}", new Object[]
-                { task }, null, null );
+                { task }, null, null, null );
         }
     }
 
@@ -541,16 +541,16 @@
      * @param pattern The <code>java.text.MessageFormat</code> message format
      *      string for preparing the message
      * @param arguments The format arguments for the <code>pattern</code>
-     *      string.
+ *      string.
+     * @param componentId
      * @param ex An optional <code>Throwable</code> whose stack trace is written,
-     *      or <code>null</code> to not log a stack trace.
      */
-    public void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Throwable ex )
+    public void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Long componentId, Throwable ex )
     {
         if ( isLogEnabled( level ) )
         {
             final String message = MessageFormat.format( pattern, arguments );
-            log( level, message, metadata, ex );
+            log( level, message, metadata, componentId, ex );
         }
     }
 
@@ -562,17 +562,24 @@
      *
      * @param level The log level to log the message at
      * @param message The message to log
+     * @param componentId
      * @param ex An optional <code>Throwable</code> whose stack trace is written,
-     *      or <code>null</code> to not log a stack trace.
      */
-    public void log( int level, String message, ComponentMetadata metadata, Throwable ex )
+    public void log( int level, String message, ComponentMetadata metadata, Long componentId, Throwable ex )
     {
         if ( isLogEnabled( level ) )
         {
             // prepend the metadata name to the message
             if ( metadata != null )
             {
-                message = "[" + metadata.getName() + "] " + message;
+                if ( componentId != null )
+                {
+                    message = "[" + metadata.getName() + "(" + componentId + ")] " + message;
+                }
+                else
+                {
+                    message = "[" + metadata.getName() + "] " + message;
+                }
             }
 
             ServiceTracker logService = m_logService;
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
index 33297b6..63220f8 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
@@ -525,7 +525,7 @@
         BundleComponentActivator activator = getActivator();
         if ( activator != null )
         {
-            activator.log( level, message, getComponentMetadata(), ex );
+            activator.log( level, message, getComponentMetadata(), null, ex );
         }
     }
 
@@ -534,7 +534,7 @@
         BundleComponentActivator activator = getActivator();
         if ( activator != null )
         {
-            activator.log( level, message, arguments, getComponentMetadata(), ex );
+            activator.log( level, message, arguments, getComponentMetadata(), null, ex );
         }
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
index 51cea8c..df96e65 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
@@ -45,11 +45,12 @@
      * @param pattern The <code>java.text.MessageFormat</code> message format
      *      string for preparing the message
      * @param arguments The format arguments for the <code>pattern</code>
-     *      string.
+ *      string.
+     * @param metadata  component metadata if known
+     * @param componentId  component ID if known
      * @param ex An optional <code>Throwable</code> whose stack trace is written,
-     *      or <code>null</code> to not log a stack trace.
      */
-    void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Throwable ex );
+    void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Long componentId, Throwable ex );
 
 
     /**
@@ -58,12 +59,12 @@
      * @param level The log level of the messages. This corresponds to the log
      *          levels defined by the OSGi LogService.
      * @param message The message to print
-     * @param metadata The {@link ComponentMetadata} whose processing caused
-     *          the message. This may be <code>null</code> if the component
-     *          metadata is not known or applicable.
+     * @param metadata The {@link org.apache.felix.scr.impl.metadata.ComponentMetadata} whose processing caused
+ *          the message. This may be <code>null</code> if the component
+ *          metadata is not known or applicable.
+     * @param componentId
      * @param ex The <code>Throwable</code> causing the message to be logged.
-     *          This may be <code>null</code>.
      */
-    void log( int level, String message, ComponentMetadata metadata, Throwable ex );
+    void log( int level, String message, ComponentMetadata metadata, Long componentId, Throwable ex );
 
 }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index c52693b..719fee7 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -221,7 +221,7 @@
             while ( ceiling  < trackingCount || ( !missing.isEmpty() && missing.iterator().next() < trackingCount))
             {
                 log( LogService.LOG_DEBUG, "waitForTracked trackingCount: {0} ceiling: {1} missing: {2}",
-                        new Object[] {trackingCount, ceiling, missing}, null);
+                        new Object[] {trackingCount, ceiling, missing}, null );
                 try
                 {
                     missing.wait( );
@@ -895,7 +895,7 @@
         BundleComponentActivator activator = getActivator();
         if ( activator != null )
         {
-            activator.log( level, message, getComponentMetadata(), ex );
+            activator.log( level, message, getComponentMetadata(), m_componentId, ex );
         }
     }
 
@@ -904,7 +904,7 @@
         BundleComponentActivator activator = getActivator();
         if ( activator != null )
         {
-            activator.log( level, message, arguments, getComponentMetadata(), ex );
+            activator.log( level, message, arguments, getComponentMetadata(), m_componentId, ex );
         }
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
index 49304d9..0ded76d 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
@@ -254,7 +254,7 @@
                 {
                     m_logger.log( LogService.LOG_DEBUG,
                         "Not currently parsing a component; ignoring element {0} (bundle {1})", new Object[]
-                            { localName, m_bundle.getLocation() }, null, null );
+                            { localName, m_bundle.getLocation() }, null, null, null );
                 }
 
                 // 112.4.4 Implementation
@@ -356,7 +356,7 @@
                 else if ( !localName.equals( "components" ) )
                 {
                     m_logger.log( LogService.LOG_DEBUG, "Ignoring unsupported element {0} (bundle {1})", new Object[]
-                        { localName, m_bundle.getLocation() }, null, null );
+                        { localName, m_bundle.getLocation() }, null, null, null );
                 }
             }
             catch ( Exception ex )
@@ -370,7 +370,7 @@
         else if ( !localName.equals( "components" ) )
         {
             m_logger.log( LogService.LOG_DEBUG, "Ignoring unsupported element '{'{0}'}'{1} (bundle {2})", new Object[]
-                { uri, localName, m_bundle.getLocation() }, null, null );
+                { uri, localName, m_bundle.getLocation() }, null, null, null );
         }
     }
 
diff --git a/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java b/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
index 31087ca..c21014b 100644
--- a/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
+++ b/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
@@ -36,16 +36,16 @@
     }
 
 
-    public void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Throwable ex )
+    public void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Long componentId, Throwable ex )
     {
         if ( isLogEnabled( level ) )
         {
-            log( level, MessageFormat.format( pattern, arguments ), metadata, ex );
+            log( level, MessageFormat.format( pattern, arguments ), metadata, null, ex );
         }
     }
 
 
-    public void log( int level, String message, ComponentMetadata metadata, Throwable ex )
+    public void log( int level, String message, ComponentMetadata metadata, Long componentId, Throwable ex )
     {
         lastMessage = message;
     }
