diff --git a/coordinator/pom.xml b/coordinator/pom.xml
index fee9584..8762423 100644
--- a/coordinator/pom.xml
+++ b/coordinator/pom.xml
@@ -61,7 +61,6 @@
                             org.osgi.service.coordinator
                         </Export-Package>
                         <Private-Package>
-                            org.apache.felix.jmx.service.coordinator,
                             org.apache.felix.coordinator.impl.*
                         </Private-Package>
                         <Bundle-Activator>
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/Activator.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/Activator.java
index 14fe169..d3f8533 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/Activator.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/Activator.java
@@ -34,24 +34,12 @@
 
     private CoordinationMgr mgr;
 
-//    private ServiceTracker mbeanServerTracker;
-
     private ServiceRegistration coordinatorService;
 
     public void start(BundleContext context)
     {
         mgr = new CoordinationMgr();
-/*
-        try
-        {
-            mbeanServerTracker = new MBeanServerTracker(context, mgr);
-            mbeanServerTracker.open();
-        }
-        catch (MalformedObjectNameException e)
-        {
-            // TODO log
-        }
-*/
+
         final ServiceFactory factory = new CoordinatorFactory(mgr);
         final Hashtable<String, String> props = new Hashtable<String, String>();
         props.put(Constants.SERVICE_DESCRIPTION, "Coordinator Service Implementation");
@@ -66,13 +54,7 @@
             coordinatorService.unregister();
             coordinatorService = null;
         }
-/*
-        if (mbeanServerTracker != null)
-        {
-            mbeanServerTracker.close();
-            mbeanServerTracker = null;
-        }
-*/
+
         mgr.cleanUp();
     }
 
@@ -97,52 +79,4 @@
         }
 
     }
-/*
-    static final class MBeanServerTracker extends ServiceTracker
-    {
-
-        private final CoordinationMgr mgr;
-
-        private final ObjectName objectName;
-
-        MBeanServerTracker(final BundleContext context, final CoordinationMgr mgr) throws MalformedObjectNameException
-        {
-            super(context, MBeanServer.class.getName(), null);
-            this.mgr = mgr;
-            this.objectName = new ObjectName(CoordinatorMBean.OBJECTNAME);
-        }
-
-        @Override
-        public Object addingService(ServiceReference reference)
-        {
-            MBeanServer server = (MBeanServer) super.addingService(reference);
-
-            try
-            {
-                server.registerMBean(mgr, objectName);
-            }
-            catch (Exception e)
-            {
-                // TODO: log
-            }
-
-            return server;
-        }
-
-        @Override
-        public void removedService(ServiceReference reference, Object service)
-        {
-            try
-            {
-                ((MBeanServer) service).unregisterMBean(objectName);
-            }
-            catch (Exception e)
-            {
-                // TODO: log
-            }
-
-            super.removedService(reference, service);
-        }
-    }
-*/
 }
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
index e0b5e18..f4e512a 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
@@ -18,7 +18,6 @@
  */
 package org.apache.felix.coordinator.impl;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -32,10 +31,6 @@
 import java.util.TimerTask;
 import java.util.concurrent.atomic.AtomicLong;
 
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.TabularData;
-
-import org.apache.felix.jmx.service.coordinator.CoordinatorMBean;
 import org.osgi.framework.Bundle;
 import org.osgi.service.coordinator.Coordination;
 import org.osgi.service.coordinator.CoordinationException;
@@ -43,17 +38,9 @@
 
 /**
  * The <code>CoordinationMgr</code> is the actual back-end manager of all
- * Coordinations created by the Coordinator implementation. The methods in this
- * class fall into three categories:
- * <ul>
- * <li>Actual implementations of the Coordinator interface on behalf of the
- * per-bundle Coordinator service instances</li>
- * <li>Implementation of the CoordinatorMBean interface allowing JMX management
- * of the coordinations</li>
- * <li>Management support to timeout and cleanup coordinations</li>
- * </ul>
+ * Coordinations created by the Coordinator implementation.
  */
-public class CoordinationMgr implements CoordinatorMBean
+public class CoordinationMgr
 {
 
     private ThreadLocal<Stack<CoordinationImpl>> perThreadStack;
@@ -67,13 +54,6 @@
     private final Timer coordinationTimer;
 
     /**
-     * Default coordination timeout. Currently hard coded to be 30s (the
-     * specified minimum timeout). Should be made configurable, but not less
-     * than 30s.
-     */
-    private long defaultTimeOut = 30 * 1000L;
-
-    /**
      * Wait at most 60 seconds for participant to be eligible for participation
      * in a coordination.
      *
@@ -135,9 +115,8 @@
         return stack;
     }
 
-    void configure(final long coordinationTimeout, final long participationTimeout)
+    void configure(final long participationTimeout)
     {
-        this.defaultTimeOut = coordinationTimeout;
         this.participationTimeOut = participationTimeout;
     }
 
@@ -158,12 +137,14 @@
         synchronized (participants)
         {
             // wait for participant to be released
-            long cutOff = System.currentTimeMillis() + participationTimeOut;
-            long waitTime = (participationTimeOut > 500) ? participationTimeOut / 500 : participationTimeOut;
-            // TODO - the above wait time looks wrong e.g. if it's 800, the wait time 1ms
+            long completeWaitTime = participationTimeOut;
+            long cutOff = System.currentTimeMillis() + completeWaitTime;
+
             CoordinationImpl current = participants.get(p);
             while (current != null && current != c)
             {
+                final long waitTime = (completeWaitTime > 500) ? 500 : completeWaitTime;
+                completeWaitTime = completeWaitTime - waitTime;
                 if (current.getThread() != null && current.getThread() == c.getThread())
                 {
                     throw new CoordinationException("Participant " + p + " already participating in Coordination "
@@ -296,79 +277,6 @@
         }
     }
 
-    // ---------- CoordinatorMBean interface
-
-    public TabularData listCoordinations(String regexFilter)
-    {
-        return null;
-/*
-        Pattern p = Pattern.compile(regexFilter);
-        TabularData td = new TabularDataSupport(COORDINATIONS_TYPE);
-        for (CoordinationImpl c : coordinations.values())
-        {
-            if (p.matcher(c.getName()).matches())
-            {
-                try
-                {
-                    td.put(fromCoordination(c));
-                }
-                catch (OpenDataException e)
-                {
-                    // TODO: log
-                }
-            }
-        }
-        return td;
-*/
-    }
-
-    public CompositeData getCoordination(long id) throws IOException
-    {
-        return null;
-        /*
-        Coordination c = getCoordinationById(id);
-        if (c != null)
-        {
-            try
-            {
-                return fromCoordination((CoordinationImpl) c);
-            }
-            catch (OpenDataException e)
-            {
-                throw new IOException(e.toString());
-            }
-        }
-        throw new IOException("No such Coordination " + id);
-        */
-    }
-
-    public boolean fail(long id, String reason)
-    {
-        Coordination c = getCoordinationById(id);
-        if (c != null)
-        {
-            return c.fail(new Exception(reason));
-        }
-        return false;
-    }
-
-    public void addTimeout(long id, long timeout)
-    {
-        Coordination c = getCoordinationById(id);
-        if (c != null)
-        {
-            c.extendTimeout(timeout);
-        }
-    }
-/*
-    private CompositeData fromCoordination(final CoordinationImpl c) throws OpenDataException
-    {
-        return new CompositeDataSupport(COORDINATION_TYPE, new String[]
-            { ID, NAME, TIMEOUT }, new Object[]
-            { c.getId(), c.getName(), c.getDeadLine() });
-    }
-    */
-
 	public Coordination getEnclosingCoordination(final CoordinationImpl c)
 	{
         final Stack<CoordinationImpl> stack = this.getThreadStack(false);
diff --git a/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/CoordinatorMBean.java b/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/CoordinatorMBean.java
deleted file mode 100644
index 61e3ce4..0000000
--- a/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/CoordinatorMBean.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2010). All Rights Reserved.
- *
- * Licensed 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.felix.jmx.service.coordinator;
-
-import java.io.IOException;
-
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.TabularData;
-
-import org.osgi.service.coordinator.Coordination;
-
-/**
- * This MBean provides the management interface to the OSGi Coordinator Service
- *
- * @ThreadSafe
- * @Provisional
- */
-@Deprecated
-public interface CoordinatorMBean
-{
-
-    /**
-     * User Admin MBean object name.
-     */
-    public static final String OBJECTNAME = "osgi.compendium:service=coordinator,version=1.0";
-
-    /**
-     * The key NAME, used in NAME_ITEM.
-     */
-    public static final String NAME = "Name";
-
-    /**
-     * The item for the user name for an authorization object. The key is NAME
-     * and the type is SimpleType.STRING.
-     */
-//    public static final org.osgi.jmx.Item NAME_ITEM = new Item(NAME, null, SimpleType.STRING, (String[]) null);
-
-    /**
-     * The key ID, used in ID_ITEM.
-     */
-    public static final String ID = "Id";
-
-    /**
-     * The item for the id of an Coordination object. The key is ID and the type
-     * is SimpleType.LONG. The id must be generated by the Mbean and map to a
-     * unique Coordination (which should no be pinned in memory because of
-     * this).
-     */
-//    public static final org.osgi.jmx.Item ID_ITEM = new Item(ID, null, SimpleType.LONG, (String[]) null);
-
-    /**
-     * The key TIMEOUT, used in TIMEOUT_ITEM.
-     */
-    public static final String TIMEOUT = "Timeout";
-
-    /**
-     * The item for the id of an Coordination object. The key is TIMEOUT and the
-     * type is SimpleType.LONG.
-     */
-//    public static final org.osgi.jmx.Item TIMEOUT_ITEM = new Item(TIMEOUT, null, SimpleType.LONG, (String[]) null);
-
-    /**
-     * The key COORDINATION, used in COORDINATION_TYPE
-     */
-    public static final String COORDINATION = "Coordination";
-
-    /**
-     * Interface Coordination
-    public static final CompositeType COORDINATION_TYPE = Item
-        .compositeType("", null, ID_ITEM, NAME_ITEM, TIMEOUT_ITEM);
-     */
-
-    /**
-     * The key COORDINATIONS, used in COORDINATIONS_TYPE
-     * <p>
-     * fmeschbe note: This constant is added because it is needed for the
-     * {@link #COORDINATIONS_TYPE} definition
-     */
-    public static final String COORDINATIONS = "Coordinations";
-
-    /**
-     * Defines a list of COORDINATION_TYPE
-     * <p>
-     * fmeschbe note: The draft 2 spec defines this to be ArrayType but to use
-     * it for {@link #listCoordinations(String)} this constant must be a
-     * <code>TabularType</code>.
-    public static final TabularType COORDINATIONS_TYPE = Item.tabularType(COORDINATIONS, null, COORDINATION_TYPE, ID,
-        NAME, TIMEOUT);
-     */
-
-    /**
-     * List the current coordinations. The Composite Data is typed by
-     * COORDINATIONS_TYPE.
-     *
-     * @param regexFilter a regular expression filter on the coordination name
-     * @return the Coordinations typed by COORDINATIONS_TYPE.
-     * @throws IOException if the operation fails
-     */
-    TabularData listCoordinations(String regexFilter) throws IOException;
-
-    /**
-     * Get a Coordination. The Composite Data is typed by COORDINATION_TYPE.
-     *
-     * @param id The id of a Coordination
-     * @return the Coordinations typed by COORDINATION_TYPE.
-     * @throws IOException if the operation fails
-     */
-    CompositeData getCoordination(long id) throws IOException;
-
-    /**
-     * Fail a Coordination.
-     *
-     * @param id The id of the coordination to be failed.
-     * @param reason The reason the coordination should be failed. The
-     *            implementation of the MBean should create a
-     *            Throwable/Exception with this reason in order to fail the
-     *            specified Coordination
-     * @return true if the coordination was failed by this call, otherwise
-     *         false.
-     * @throws IOException
-     * @see Coordination#fail(Throwable)
-     */
-    boolean fail(long id, String reason) throws IOException;
-
-    /**
-     * Set/Change the timeout of a Coordination.
-     *
-     * @param id The id of the Coordination
-     * @param timeout The nr of milliseconds for the next timeout.
-     * @throws IOException
-     */
-    void addTimeout(long id, long timeout) throws IOException;
-}
diff --git a/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/package-info.java b/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/package-info.java
deleted file mode 100644
index 2c3417e..0000000
--- a/coordinator/src/main/java/org/apache/felix/jmx/service/coordinator/package-info.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2010). All Rights Reserved.
- * 
- * Licensed 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.
- */
-/**
- * OSGi JMX Coordination Package Version 1.0.
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest.
- * <p>
- * This package has two types of users: the consumers that use the API in this
- * package and the providers that implement the API in this package.
- * <p>
- * Example import for consumers using the API in this package: <blockquote>
- * <code>Import-Package: org.apache.felix.jmx.service.coordination; version="[1.0,2.0)"; status="provisional"</code>
- * </blockquote>
- * <p>
- * Example import for providers implementing the API in this package:
- * <blockquote>
- * <code>Import-Package: org.apache.felix.jmx.service.coordination; version="[1.0,1.1)"; status="provisional"</code>
- * </blockquote>
- * 
- * @Provisional
- */
-@Deprecated
-package org.apache.felix.jmx.service.coordinator;
-
diff --git a/coordinator/src/test/java/org/apache/felix/coordinator/impl/CoordinatorImplTest.java b/coordinator/src/test/java/org/apache/felix/coordinator/impl/CoordinatorImplTest.java
index 294957a..ecd94da 100644
--- a/coordinator/src/test/java/org/apache/felix/coordinator/impl/CoordinatorImplTest.java
+++ b/coordinator/src/test/java/org/apache/felix/coordinator/impl/CoordinatorImplTest.java
@@ -307,7 +307,7 @@
         final MockParticipant p1 = new MockParticipant();
 
         // ensure short timeout for participation
-        mgr.configure(60000, 200);
+        mgr.configure(200);
 
         final Coordination c1 = coordinator.create(name1, 0);
         c1.addParticipant(p1);
