diff --git a/eventadmin/impl/DEPENDENCIES b/eventadmin/impl/DEPENDENCIES
new file mode 100644
index 0000000..be382e0
--- /dev/null
+++ b/eventadmin/impl/DEPENDENCIES
@@ -0,0 +1,36 @@
+Apache Felix Event Admin
+Copyright 2006-2010 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0. 
+
+This product includes software developed at
+Sun Microsystems, Inc.
+Copyright (c) 1994-2000.
+Licensed under a BSD license.
+
+
+II. Used Software
+
+This product uses software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0. 
+
+
+III. License Summary
+- Apache License 2.0
+- BSD License
diff --git a/eventadmin/impl/pom.xml b/eventadmin/impl/pom.xml
index d249294..5c9b67d1 100644
--- a/eventadmin/impl/pom.xml
+++ b/eventadmin/impl/pom.xml
@@ -49,6 +49,20 @@
         </dependency>
     </dependencies>
     <build>
+        <resources>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+            </resource>
+            <resource>
+                <targetPath>META-INF</targetPath>
+                <directory>${basedir}</directory>
+                <includes>
+                    <include>LICENSE*</include>
+                    <include>NOTICE</include>
+                    <include>DEPENDENCIES</include>
+                </includes>
+            </resource>
+        </resources>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
diff --git a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
index 34ac45c..85d1e6c 100644
--- a/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
+++ b/eventadmin/impl/src/main/java/org/apache/felix/eventadmin/impl/Configuration.java
@@ -156,11 +156,9 @@
         {
             Object service = new ManagedService()
             {
-                public synchronized void updated( Dictionary properties ) throws ConfigurationException
+                public void updated( Dictionary properties ) throws ConfigurationException
                 {
-                    configure( properties );
-                    stop();
-                    start();
+                    updateFromConfigAdmin(properties);
                 }
             };
             // add meta type provider if interfaces are available
@@ -185,6 +183,43 @@
         }
     }
 
+    void updateFromConfigAdmin(final Dictionary config)
+    {
+        // do this in the background as we don't want to stop
+        // the config admin
+        new Thread()
+        {
+
+            public void run()
+            {
+                final ThreadPool aSyncPool;
+                final ThreadPool syncPool;
+                synchronized ( Configuration.this )
+                {
+                    // we will shutdown the pools later
+                    // to make the downtime as small as possible
+                    aSyncPool = m_async_pool;
+                    m_async_pool = null;
+                    syncPool = m_sync_pool;
+                    m_sync_pool = null;
+                    Configuration.this.stop();
+                    Configuration.this.configure( config );
+                    Configuration.this.start();
+                }
+                if (aSyncPool != null )
+                {
+                    aSyncPool.close();
+                }
+                if ( syncPool != null )
+                {
+                    syncPool.close();
+                }
+            }
+
+        }.start();
+
+    }
+
     /**
      * Configures this instance.
      */
@@ -262,7 +297,7 @@
         }
     }
 
-    public synchronized void start()
+    private void start()
     {
         LogWrapper.getLogger().log(LogWrapper.LOG_DEBUG,
                 PROP_CACHE_SIZE + "=" + m_cacheSize);
@@ -320,9 +355,9 @@
     }
 
     /**
-     * Called to stop the event admin and restart it.
+     * Called to stop the event admin.
      */
-    public synchronized void stop()
+    private void stop()
     {
         // We need to unregister manually
         if ( m_registration != null )
@@ -335,7 +370,7 @@
             m_admin.stop();
             m_admin = null;
         }
-        if ( m_async_pool != null )
+        if (m_async_pool != null )
         {
             m_async_pool.close();
             m_async_pool = null;
@@ -354,20 +389,24 @@
      * down which is somewhat cumbersome given that the spec asks for return in
      * a timely manner.
      */
-    public synchronized void destroy()
+    public void destroy()
     {
-        if ( m_adapters != null )
+        synchronized ( this )
         {
-            for(int i=0;i<m_adapters.length;i++)
+            if ( m_adapters != null )
             {
-                m_adapters[i].destroy(m_bundleContext);
+                for(int i=0;i<m_adapters.length;i++)
+                {
+                    m_adapters[i].destroy(m_bundleContext);
+                }
+                m_adapters = null;
             }
-            m_adapters = null;
-        }
-        if ( m_managedServiceReg != null )
-        {
-            m_managedServiceReg.unregister();
-            m_managedServiceReg = null;
+            if ( m_managedServiceReg != null )
+            {
+                m_managedServiceReg.unregister();
+                m_managedServiceReg = null;
+            }
+            stop();
         }
     }
 
