diff --git a/fabric/fabric-groups/pom.xml b/fabric/fabric-groups/pom.xml
index 24d10dd..a477e6d 100644
--- a/fabric/fabric-groups/pom.xml
+++ b/fabric/fabric-groups/pom.xml
@@ -85,23 +85,4 @@
 
   </dependencies>
 
-  <build>
-    <plugins>
-
-      <!-- Tests are failing on windows, need to investigate -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          
-          <excludes>
-            <!-- ESB-1687 -->
-            <exclude>**/ClusteredSingletonTest.*</exclude>
-          </excludes> 
-         
-        </configuration>
-      </plugin>
-      
-    </plugins>
-  </build>
 </project>
diff --git a/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/ClusteredSingleton.scala b/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/ClusteredSingleton.scala
index ccc80b5..bec52e6 100644
--- a/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/ClusteredSingleton.scala
+++ b/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/ClusteredSingleton.scala
@@ -189,15 +189,24 @@ class ClusteredSingleton[T <: NodeState ](stateClass:Class[T]) extends Clustered
   }
 
   override def fireConnected = this.synchronized {
-    if (_state!=null && _eid==null)
+    if (_state!=null) {
+      if (_eid !=null) {
+        // leave on disconnect failed
+        group.leave(_eid);
+      }
       _eid = group.join(encode(_state, mapper))
+    }
     super.fireConnected
   }
 
   override def fireDisconnected = this.synchronized {
     if (_eid!=null) {
-      group.leave(_eid)
-      _eid = null
+      try {
+        group.leave(_eid)
+        _eid = null
+      } catch {
+          case x: Throwable => // will cleanup on connected event
+      }
     }
     super.fireDisconnected
   }
diff --git a/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/internal/ZooKeeperGroup.scala b/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/internal/ZooKeeperGroup.scala
index 1a5f75d..ffb0988 100644
--- a/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/internal/ZooKeeperGroup.scala
+++ b/fabric/fabric-groups/src/main/scala/org/fusesource/fabric/groups/internal/ZooKeeperGroup.scala
@@ -22,11 +22,9 @@ import java.lang.String
 import org.linkedin.zookeeper.tracker._
 import org.fusesource.fabric.groups.{ChangeListener, Group}
 import scala.collection.mutable.HashMap
-import org.apache.zookeeper.data.ACL
 import org.linkedin.zookeeper.client.LifecycleListener
 import collection.JavaConversions._
 import java.util.{LinkedHashMap, Collection}
-import org.apache.zookeeper.KeeperException.{ConnectionLossException, NoNodeException, Code}
 import org.fusesource.fabric.zookeeper.IZKClient
 
 /**
@@ -61,7 +59,7 @@ object ZooKeeperGroup {
  */
 class ZooKeeperGroup(val zk: IZKClient, val root: String) extends Group with LifecycleListener with ChangeListenerSupport {
 
-  val tree = new ZooKeeperTreeTracker[Array[Byte]](zk, new ZKByteArrayDataReader, root, 1)
+  var tree:ZooKeeperTreeTracker[Array[Byte]] = null
   val joins = HashMap[String, Int]()
 
   var members = new LinkedHashMap[String, Array[Byte]]
@@ -70,32 +68,32 @@ class ZooKeeperGroup(val zk: IZKClient, val root: String) extends Group with Lif
 
   zk.registerListener(this)
 
-  create(root)
-  tree.track(new NodeEventsListener[Array[Byte]]() {
-    def onEvents(events: Collection[NodeEvent[Array[Byte]]]): Unit = {
-      fire_cluster_change
-    }
-  })
-  fire_cluster_change
-
-
   def close = this.synchronized {
     joins.foreach { case (path, version) =>
       try {
         zk.delete(member_path_prefix + path, version)
       } catch {
-        case x:NoNodeException => // Already deleted.
+        case x:Throwable => // continue
       }
     }
     joins.clear
-    tree.destroy
+    if (tree != null) tree.destroy
     zk.removeListener(this)
   }
 
   def connected = zk.isConnected
   def onConnected() = {
     create(root)
+    if (tree == null) {
+      tree = new ZooKeeperTreeTracker[Array[Byte]](zk, new ZKByteArrayDataReader, root, 1)
+      tree.registerListener(new NodeEventsListener[Array[Byte]]() {
+          def onEvents(events: Collection[NodeEvent[Array[Byte]]]): Unit = {
+            fire_cluster_change
+          }
+        })
+    }
     tree.track()
+    fire_cluster_change
     fireConnected()
   }
   def onDisconnected() = {
@@ -120,12 +118,7 @@ class ZooKeeperGroup(val zk: IZKClient, val root: String) extends Group with Lif
   def leave(path:String): Unit = this.synchronized {
     joins.remove(path).foreach {
       case version =>
-          try {
-            zk.delete(member_path_prefix + path, version)
-          } catch {
-            case x: NoNodeException => // Already deleted.
-            case x: ConnectionLossException => // disconnected
-          }
+         zk.delete(member_path_prefix + path, version)
     }
   }
 
diff --git a/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/ClusteredSingletonTest.scala b/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/ClusteredSingletonTest.scala
index 7657ab3..42c2622 100644
--- a/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/ClusteredSingletonTest.scala
+++ b/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/ClusteredSingletonTest.scala
@@ -58,7 +58,8 @@ class ClusteredSingletonTest extends ZooKeeperFunSuiteSupport with ShouldMatcher
 
     val node1_group = ZooKeeperGroupFactory.create(create_zk_client, "/example")
     val singleton1 = new AddressSingleton("node", "localhost:80")
-    val node2_group = ZooKeeperGroupFactory.create(create_zk_client, "/example")
+    val node2zk = create_zk_client
+    val node2_group = ZooKeeperGroupFactory.create(node2zk, "/example")
     val singleton2 = new AddressSingleton("node", "localhost:81")
 
     // First node in becomes the master.
@@ -104,6 +105,21 @@ class ClusteredSingletonTest extends ZooKeeperFunSuiteSupport with ShouldMatcher
       expect(true)(singleton2.isMaster)
     }
 
+    // verify master leave on disconnected
+    connector.closeSession(node2zk.getSessionId)
+    within(10, SECONDS) {
+      // They can never both be masters..
+      breaks_within { expect(false)(singleton1.isMaster && singleton2.isMaster) }
+
+      expect(false)(singleton1.isMaster)
+      expect(false)(singleton2.isMaster)
+    }
+
+    node2zk.waitForConnected
+    within(10, SECONDS) {
+      expect(true)(singleton1.isMaster || singleton2.isMaster)
+    }
+
   }
 
 
diff --git a/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/GroupsTest.scala b/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/GroupsTest.scala
index e54100c..3a5b81b 100644
--- a/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/GroupsTest.scala
+++ b/fabric/fabric-groups/src/test/scala/org/fusesource/fabric/groups/GroupsTest.scala
@@ -141,12 +141,12 @@ abstract class ZooKeeperFunSuiteSupport extends FunSuite with BeforeAndAfterAll
 
 
 class GroupsTest extends ZooKeeperFunSuiteSupport with ShouldMatchers {
+  import TimeUnit._
 
   test("cluster events") {
 
     val cluster1 = ZooKeeperGroupFactory.create(create_zk_client, "/example")
     val cluster2 = ZooKeeperGroupFactory.create(create_zk_client, "/example")
-    import TimeUnit._
 
     val c1id1 = cluster1.join("1".getBytes)
     within(2, SECONDS) {
@@ -176,4 +176,17 @@ class GroupsTest extends ZooKeeperFunSuiteSupport with ShouldMatchers {
 
   }
 
+  test("create while not connected works ok") {
+
+    val client = new ZKClient("localhost:"+connector.getLocalPort, Timespan.parse("30s"), null)
+    val cluster1 = ZooKeeperGroupFactory.create(client, "/example")
+
+    // ensure we can create a group while disconnected
+    client.start
+    cluster1.join("1".getBytes)
+    within(2, SECONDS) {
+      expect(List("1"))(cluster1.members.toMap.values.map(new String(_)).toList)
+    }
+  }
+
 }
diff --git a/pom.xml b/pom.xml
index 6b08673..8e193cb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -545,7 +545,7 @@
         <repository>
             <id>fusesource.m2</id>
             <name>FuseSource Community Release Repository</name>
-            <url>http://repo.fusesource.com/nexus/content/groups/public</url>
+            <url>http://repo.fusesource.com/nexus/content/groups/fs-public</url>
             <snapshots>
                 <enabled>false</enabled>
             </snapshots>
