You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/06/22 15:25:49 UTC

[3/8] usergrid git commit: Unique values test passes with new "actor system" module

Unique values test passes with new "actor system" module


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/ee18950f
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/ee18950f
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/ee18950f

Branch: refs/heads/usergrid-1268-akka-211
Commit: ee18950f6e605dc114257b4678802ba80039e959
Parents: 97aec4d
Author: Dave Johnson <sn...@apache.org>
Authored: Tue Jun 21 08:02:26 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Tue Jun 21 08:02:26 2016 -0400

----------------------------------------------------------------------
 stack/core/pom.xml                              | 821 ++++++++++---------
 .../corepersistence/CpEntityManager.java        |   8 +-
 .../corepersistence/CpEntityManagerFactory.java |  12 +-
 .../service/ApplicationServiceImpl.java         |   8 +-
 stack/corepersistence/actorsystem/pom.xml       |  99 +++
 .../persistence/actorsystem/ActorSystemFig.java | 116 +++
 .../actorsystem/ActorSystemManager.java         |  39 +
 .../actorsystem/ActorSystemManagerImpl.java     | 398 +++++++++
 .../actorsystem/ActorSystemModule.java          |  34 +
 .../persistence/actorsystem/ClientActor.java    | 205 +++++
 .../actorsystem/GuiceActorProducer.java         |  46 ++
 .../persistence/actorsystem/RouterProducer.java |  45 +
 .../src/main/resources/application.conf         |  28 +
 .../src/main/resources/cluster-singleton.conf   |  25 +
 .../actorsystem/ActorServiceServiceTest.java    |  57 ++
 stack/corepersistence/collection/pom.xml        |  22 +
 .../collection/EntityCollectionManager.java     |   6 -
 .../collection/guice/CollectionModule.java      |   4 +-
 .../EntityCollectionManagerFactoryImpl.java     |   5 +
 .../impl/EntityCollectionManagerImpl.java       |  23 +-
 .../mvcc/stage/write/WriteCommit.java           |  12 +-
 .../mvcc/stage/write/WriteUniqueVerify.java     |  12 +-
 .../collection/uniquevalues/AkkaFig.java        | 116 ---
 .../uniquevalues/ClusterSingletonRouter.java    |  70 --
 .../uniquevalues/GuiceActorProducer.java        |  46 --
 .../collection/uniquevalues/RequestActor.java   | 186 -----
 .../uniquevalues/ReservationCache.java          |   3 +-
 .../uniquevalues/UniqueValueActor.java          |   2 +-
 .../uniquevalues/UniqueValuesRouter.java        |  70 ++
 .../uniquevalues/UniqueValuesService.java       |  20 +-
 .../uniquevalues/UniqueValuesServiceImpl.java   | 442 ++--------
 .../uniquevalues/UniqueValuesTableImpl.java     |   9 +-
 .../src/main/resources/application.conf         |  28 -
 .../src/main/resources/cluster-singleton.conf   |  25 -
 .../collection/EntityCollectionManagerIT.java   |  20 +-
 .../mvcc/stage/write/WriteUniqueVerifyIT.java   |  19 +-
 .../mvcc/stage/write/WriteUniqueVerifyTest.java |  19 +-
 .../uniquevalues/UniqueValuesServiceTest.java   |  38 +-
 stack/corepersistence/common/pom.xml            |  17 +-
 stack/corepersistence/model/pom.xml             |  16 +
 stack/corepersistence/pom.xml                   |   1 +
 stack/corepersistence/queryindex/pom.xml        |  18 +-
 42 files changed, 1835 insertions(+), 1355 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/core/pom.xml
----------------------------------------------------------------------
diff --git a/stack/core/pom.xml b/stack/core/pom.xml
index 090f46b..9c6497e 100644
--- a/stack/core/pom.xml
+++ b/stack/core/pom.xml
@@ -17,30 +17,30 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.usergrid</groupId>
-    <artifactId>usergrid</artifactId>
-    <version>2.1.1-SNAPSHOT</version>
-    <relativePath>../</relativePath>
-  </parent>
-
-  <artifactId>usergrid-core</artifactId>
-  <name>Usergrid Core</name>
-  <description>Core services for Usergrid system.</description>
-  <packaging>jar</packaging>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <build>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.usergrid</groupId>
+        <artifactId>usergrid</artifactId>
+        <version>2.1.1-SNAPSHOT</version>
+        <relativePath>../</relativePath>
+    </parent>
+
+    <artifactId>usergrid-core</artifactId>
+    <name>Usergrid Core</name>
+    <description>Core services for Usergrid system.</description>
+    <packaging>jar</packaging>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </reporting>
+
+
+    <build>
 
         <resources>
             <resource>
@@ -55,390 +55,395 @@
                 </includes>
             </resource>
         </resources>
-    <testResources>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>**/*.yaml</include>
-          <include>**/*.properties</include>
-          <include>**/*.xml</include>
-        </includes>
-      </testResource>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>largeentity.json</include>
-        </includes>
-      </testResource>
-    </testResources>
-
-    <plugins>
-
-      <!--
-      Do not need to configure surefire plugin here, parent POM configuration is sufficient.
-      -->
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>test-jar-execution</id>
-            <phase>package</phase>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-            <configuration>
-              <includes>
-                <include>**/org/apache/usergrid/**</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <dependencies>
-
-
-      <!-- dependent on wiring guice and spring -->
-      <dependency>
-          <groupId>com.google.inject.extensions</groupId>
-          <artifactId>guice-spring</artifactId>
-          <version>4.0-beta5</version>
-      </dependency>
-
-    <!-- Apache Dependencies -->
-
-    <dependency>
-      <groupId>org.apache.cassandra</groupId>
-      <artifactId>cassandra-all</artifactId>
-      <!-- Exclude the old and problematic Snappy -->
-      <exclusions>
-        <exclusion>
-          <artifactId>snappy-java</artifactId>
-          <groupId>org.xerial.snappy</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>org.antlr</groupId>
-        </exclusion>
-          <exclusion>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.yaml</include>
+                    <include>**/*.properties</include>
+                    <include>**/*.xml</include>
+                </includes>
+            </testResource>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>largeentity.json</include>
+                </includes>
+            </testResource>
+        </testResources>
+
+        <plugins>
+
+            <!--
+            Do not need to configure surefire plugin here, parent POM configuration is sufficient.
+            -->
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>test-jar-execution</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                        <configuration>
+                            <includes>
+                                <include>**/org/apache/usergrid/**</include>
+                            </includes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <dependencies>
+
+
+        <!-- dependent on wiring guice and spring -->
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-spring</artifactId>
+            <version>4.0-beta5</version>
+        </dependency>
+
+        <!-- Apache Dependencies -->
+
+        <dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-all</artifactId>
+            <!-- Exclude the old and problematic Snappy -->
+            <exclusions>
+                <exclusion>
+                    <artifactId>snappy-java</artifactId>
+                    <groupId>org.xerial.snappy</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>org.antlr</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>netty</artifactId>
+                    <groupId>io.netty</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-thrift</artifactId>
+        </dependency>
+
+        <!-- Include the slighly newer and less problematic snappy -->
+        <dependency>
+            <artifactId>snappy-java</artifactId>
+            <groupId>org.xerial.snappy</groupId>
+            <version>1.0.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+        </dependency>
+
+        <!-- SUN, Javax Package, and Other Commercial Dependencies -->
+
+        <dependency>
+            <groupId>com.beust</groupId>
+            <artifactId>jcommander</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.persistence</groupId>
+            <artifactId>persistence-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.uuid</groupId>
+            <artifactId>java-uuid-generator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.hazelcast</groupId>
+            <artifactId>hazelcast-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netflix.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netflix.astyanax</groupId>
+            <artifactId>astyanax-recipes</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <!-- Codehaus, Spring and Other Org Dependencies -->
+
+        <dependency>
+            <groupId>org.hectorclient</groupId>
+            <artifactId>hector-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>aopalliance</groupId>
+            <artifactId>aopalliance</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.perf4j</groupId>
+            <artifactId>perf4j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib-nodep</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+        </dependency>
+
+        <!--
+            <dependency>
+              <groupId>org.jboss.netty</groupId>
               <artifactId>netty</artifactId>
-              <groupId>io.netty</groupId>
-          </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.cassandra</groupId>
-      <artifactId>cassandra-thrift</artifactId>
-    </dependency>
-
-    <!-- Include the slighly newer and less problematic snappy -->
-    <dependency>
-      <artifactId>snappy-java</artifactId>
-      <groupId>org.xerial.snappy</groupId>
-      <version>1.0.5</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-beanutils</groupId>
-      <artifactId>commons-beanutils</artifactId>
-    </dependency>
-
-    <!-- SUN, Javax Package, and Other Commercial Dependencies -->
-
-    <dependency>
-      <groupId>com.beust</groupId>
-      <artifactId>jcommander</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.sun.mail</groupId>
-      <artifactId>javax.mail</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.persistence</groupId>
-      <artifactId>persistence-api</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.fasterxml.uuid</groupId>
-      <artifactId>java-uuid-generator</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.hazelcast</groupId>
-      <artifactId>hazelcast-all</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>com.netflix.curator</groupId>
-      <artifactId>curator-recipes</artifactId>
-    </dependency>
-
-      <dependency>
-          <groupId>com.netflix.astyanax</groupId>
-          <artifactId>astyanax-recipes</artifactId>
-      </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-
-    <!-- Codehaus, Spring and Other Org Dependencies -->
-
-    <dependency>
-      <groupId>org.hectorclient</groupId>
-      <artifactId>hector-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-expression</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-beans</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-aop</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>aopalliance</groupId>
-      <artifactId>aopalliance</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context-support</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-web</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.yaml</groupId>
-      <artifactId>snakeyaml</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jsoup</groupId>
-      <artifactId>jsoup</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.perf4j</groupId>
-      <artifactId>perf4j</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjweaver</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjrt</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>cglib</groupId>
-      <artifactId>cglib-nodep</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>jline</groupId>
-      <artifactId>jline</artifactId>
-    </dependency>
-
-<!--
-    <dependency>
-      <groupId>org.jboss.netty</groupId>
-      <artifactId>netty</artifactId>
-    </dependency>
--->
-
-    <!-- Test and Logging Dependencies -->
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>usergrid-config</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-      <classifier>tests</classifier>
-    </dependency>
-
-    <dependency>
-      <groupId>org.hectorclient</groupId>
-      <artifactId>hector-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>${mockito.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.jvnet.mock-javamail</groupId>
-      <artifactId>mock-javamail</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>usergrid-test-utils</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-
-       <dependency>
-        <groupId>org.apache.usergrid</groupId>
-        <artifactId>common</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
-        <type>test-jar</type>
-           <scope>test</scope>
-       </dependency>
-
-
-    <!-- Core Persistence deps -->
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>collection</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-      <exclusions>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>org.antlr</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>antlr</artifactId>
-          <groupId>antlr</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>queryindex</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-    </dependency>
-
-    <dependency>
-	    <groupId>org.apache.usergrid</groupId>
-	    <artifactId>graph</artifactId>
-	    <version>2.1.1-SNAPSHOT</version>
-	    <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>map</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
-      <type>jar</type>
-    </dependency>
-
-      <dependency>
-          <groupId>org.apache.usergrid</groupId>
-          <artifactId>cache</artifactId>
-          <version>2.1.1-SNAPSHOT</version>
-      </dependency>
-
-      <dependency>
-      <groupId>org.apache.usergrid</groupId>
-      <artifactId>queue</artifactId>
-      <version>2.1.1-SNAPSHOT</version>
-      <type>jar</type>
-    </dependency>
-
-    <dependency>
-      <groupId>com.codahale.metrics</groupId>
-      <artifactId>metrics-core</artifactId>
-      <version>${metrics.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.codahale.metrics</groupId>
-      <artifactId>metrics-graphite</artifactId>
-      <version>${metrics.version}</version>
-    </dependency>
-
-  </dependencies>
-
-  <!--
-  Do not need jacoco profile here because we do not override the surefire plugin in this POM
-  -->
+            </dependency>
+        -->
+
+        <!-- Test and Logging Dependencies -->
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>usergrid-config</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+            <classifier>tests</classifier>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hectorclient</groupId>
+            <artifactId>hector-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jvnet.mock-javamail</groupId>
+            <artifactId>mock-javamail</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>usergrid-test-utils</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+
+        <!-- Core Persistence deps -->
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>collection</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+            <exclusions>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>org.antlr</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>antlr</artifactId>
+                    <groupId>antlr</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>queryindex</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>graph</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>map</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>cache</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>actorsystem</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>queue</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+        </dependency>
+
+        <dependency>
+            <groupId>com.codahale.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+            <version>${metrics.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.codahale.metrics</groupId>
+            <artifactId>metrics-graphite</artifactId>
+            <version>${metrics.version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <!--
+    Do not need jacoco profile here because we do not override the surefire plugin in this POM
+    -->
 
 </project>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
index b0d3f59..6c06104 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
@@ -37,13 +37,13 @@ import org.apache.usergrid.corepersistence.util.CpEntityMapUtils;
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
 import org.apache.usergrid.persistence.*;
 import org.apache.usergrid.persistence.Query.Level;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.cassandra.*;
 import org.apache.usergrid.persistence.cassandra.util.TraceParticipant;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.collection.EntitySet;
 import org.apache.usergrid.persistence.collection.FieldSet;
 import org.apache.usergrid.persistence.collection.exception.WriteUniqueVerifyException;
-import org.apache.usergrid.persistence.collection.uniquevalues.AkkaFig;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.entities.*;
@@ -105,7 +105,7 @@ public class CpEntityManager implements EntityManager {
 
     private final UUID applicationId;
     private final EntityManagerFig entityManagerFig;
-    private final AkkaFig akkaFig;
+    private final ActorSystemFig actorSystemFig;
 
     private Application application;
 
@@ -171,7 +171,7 @@ public class CpEntityManager implements EntityManager {
                             final AsyncEventService indexService,
                             final ManagerCache managerCache,
                             final MetricsFactory metricsFactory,
-                            final AkkaFig akkaFig,
+                            final ActorSystemFig actorSystemFig,
                             final EntityManagerFig entityManagerFig,
                             final GraphManagerFactory graphManagerFactory,
                             final CollectionService collectionService,
@@ -180,7 +180,7 @@ public class CpEntityManager implements EntityManager {
                             final UUID applicationId ) {
 
         this.entityManagerFig = entityManagerFig;
-        this.akkaFig = akkaFig;
+        this.actorSystemFig = actorSystemFig;
 
         Preconditions.checkNotNull( cass, "cass must not be null" );
         Preconditions.checkNotNull( counterUtils, "counterUtils must not be null" );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index bc1b335..99bf1e0 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -35,13 +35,13 @@ import org.apache.usergrid.corepersistence.util.CpNamingUtils;
 import org.apache.usergrid.exception.ConflictException;
 import org.apache.usergrid.locking.LockManager;
 import org.apache.usergrid.persistence.*;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.cassandra.CassandraService;
 import org.apache.usergrid.persistence.cassandra.CounterUtils;
 import org.apache.usergrid.persistence.cassandra.Setup;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.EntityIdScope;
-import org.apache.usergrid.persistence.collection.uniquevalues.AkkaFig;
 import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.core.migration.data.MigrationDataProvider;
@@ -82,7 +82,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     private static final Logger logger = LoggerFactory.getLogger( CpEntityManagerFactory.class );
 
     private final EntityManagerFig entityManagerFig;
-    private final AkkaFig akkaFig;
+    private final ActorSystemFig actorSystemFig;
 
     private ApplicationContext applicationContext;
 
@@ -125,7 +125,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         this.injector = injector;
         this.reIndexService = injector.getInstance(ReIndexService.class);
         this.entityManagerFig = injector.getInstance(EntityManagerFig.class);
-        this.akkaFig = injector.getInstance( AkkaFig.class );
+        this.actorSystemFig = injector.getInstance( ActorSystemFig.class );
         this.managerCache = injector.getInstance( ManagerCache.class );
         this.metricsFactory = injector.getInstance( MetricsFactory.class );
         this.indexService = injector.getInstance( AsyncEventService.class );
@@ -139,11 +139,11 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
 
         logger.info("EntityManagerFactoring starting...");
 
-        if ( akkaFig.getAkkaEnabled() ) {
+        if ( actorSystemFig.getAkkaEnabled() ) {
             try {
                 logger.info("Akka cluster starting...");
                 this.uniqueValuesService = injector.getInstance( UniqueValuesService.class );
-                this.uniqueValuesService.start();
+                // TODO: this.uniqueValuesService.start();
             } catch (Throwable t) {
                 logger.error("Error starting Akka", t);
                 throw t;
@@ -360,7 +360,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
             indexService,
             managerCache,
             metricsFactory,
-            akkaFig,
+            actorSystemFig,
             entityManagerFig,
             graphManagerFactory,
             collectionService,

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ApplicationServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ApplicationServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ApplicationServiceImpl.java
index c6b3b15..ea16d8b 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ApplicationServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ApplicationServiceImpl.java
@@ -28,10 +28,10 @@ import org.apache.usergrid.corepersistence.index.CollectionSettingsCacheFactory;
 import org.apache.usergrid.corepersistence.rx.impl.AllEntityIdsObservable;
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
 import org.apache.usergrid.persistence.Schema;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
 import org.apache.usergrid.persistence.collection.serialization.impl.migration.EntityIdScope;
-import org.apache.usergrid.persistence.collection.uniquevalues.AkkaFig;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.GraphManager;
 import org.apache.usergrid.persistence.graph.GraphManagerFactory;
@@ -61,7 +61,7 @@ public class ApplicationServiceImpl  implements ApplicationService{
     private final MapManagerFactory mapManagerFactory;
     private final GraphManagerFactory graphManagerFactory;
     private final CollectionSettingsCacheFactory collectionSettingsCacheFactory;
-    private final AkkaFig akkaFig;
+    private final ActorSystemFig actorSystemFig;
 
 
     @Inject
@@ -72,7 +72,7 @@ public class ApplicationServiceImpl  implements ApplicationService{
                                   MapManagerFactory mapManagerFactory,
                                   GraphManagerFactory graphManagerFactory,
                                   CollectionSettingsCacheFactory collectionSettingsCacheFactory,
-                                  AkkaFig akkaFig
+                                  ActorSystemFig actorSystemFig
     ){
 
         this.allEntityIdsObservable = allEntityIdsObservable;
@@ -82,7 +82,7 @@ public class ApplicationServiceImpl  implements ApplicationService{
         this.mapManagerFactory = mapManagerFactory;
         this.graphManagerFactory = graphManagerFactory;
         this.collectionSettingsCacheFactory = collectionSettingsCacheFactory;
-        this.akkaFig = akkaFig;
+        this.actorSystemFig = actorSystemFig;
     }
 
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/pom.xml b/stack/corepersistence/actorsystem/pom.xml
new file mode 100644
index 0000000..85c0d60
--- /dev/null
+++ b/stack/corepersistence/actorsystem/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <artifactId>persistence</artifactId>
+        <groupId>org.apache.usergrid</groupId>
+        <version>2.1.1-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <name>Usergrid ActorSystem</name>
+    <artifactId>actorsystem</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-actor_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-remote_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-cluster_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-cluster-tools_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-cluster-metrics_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-slf4j_2.11</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>${guice.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.safehaus.guicyfig</groupId>
+            <artifactId>guicyfig</artifactId>
+            <version>${guicyfig.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemFig.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemFig.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemFig.java
new file mode 100644
index 0000000..7af510c
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemFig.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+
+import org.safehaus.guicyfig.Default;
+import org.safehaus.guicyfig.FigSingleton;
+import org.safehaus.guicyfig.GuicyFig;
+import org.safehaus.guicyfig.Key;
+
+import java.io.Serializable;
+
+@FigSingleton
+public interface ActorSystemFig extends GuicyFig, Serializable {
+
+    String AKKA_ENABLED = "collection.akka.enabled";
+
+    String AKKA_HOSTNAME = "collection.akka.hostname";
+
+    String AKKA_PORT = "collection.akka.port";
+
+    String AKKA_REGION = "collection.akka.region";
+
+    String AKKA_REGION_LIST = "usergrid.queue.regionList"; // same region list used by queues
+
+    String AKKA_REGION_SEEDS = "collection.akka.region.seeds";
+
+    String AKKA_UNIQUEVALUE_ACTORS = "collection.akka.uniquevalue.actors";
+
+    String AKKA_UNIQUEVALUE_CACHE_TTL = "collection.akka.uniquevalue.cache.ttl";
+
+    String AKKA_UNIQUEVALUE_RESERVATION_TTL= "collection.akka.uniquevalue.reservation.ttl";
+
+    String AKKA_AUTHORITATIVE_REGION = "collection.akka.uniquevalue.authoritative.region";
+
+    /**
+     * Use Akka or nah
+     */
+    @Key(AKKA_ENABLED)
+    @Default("true")
+    boolean getAkkaEnabled();
+
+    /**
+     * Hostname to be used in Akka configuration.
+     */
+    @Key(AKKA_HOSTNAME)
+    String getHostname();
+
+    /**
+     * local port to be used in Akka configuration.
+     */
+    @Key(AKKA_PORT)
+    int getPort();
+
+    /**
+     * Local region to be used in Akka configuration.
+     */
+    @Key(AKKA_REGION)
+    String getRegion();
+
+    /**
+     * Comma separated list of regions known to cluster.
+     */
+    @Key(AKKA_REGION_LIST)
+    String getRegionList();
+
+    /**
+     * Number of UniqueValueActors to be started on each node
+     */
+    @Key(AKKA_UNIQUEVALUE_ACTORS)
+    @Default("300")
+    int getUniqueValueActors();
+
+    /**
+     * Comma-separated lists of seeds each with format {region}:{hostname}:{port}.
+     * Regions MUST be listed in the 'usergrid.queue.regionList'
+     */
+    @Key(AKKA_REGION_SEEDS)
+    String getRegionSeeds();
+
+    /**
+     * If no region specified for type, use the authoritative region
+     */
+    @Key(AKKA_AUTHORITATIVE_REGION)
+    String getAkkaAuthoritativeRegion();
+
+    /**
+     * Unique Value cache TTL in seconds.
+     */
+    @Key(AKKA_UNIQUEVALUE_CACHE_TTL)
+    @Default("10")
+    int getUniqueValueCacheTtl();
+
+    /**
+     * Unique Value Reservation TTL in seconds.
+     */
+    @Key(AKKA_UNIQUEVALUE_RESERVATION_TTL)
+    @Default("10")
+    int getUniqueValueReservationTtl();
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManager.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManager.java
new file mode 100644
index 0000000..e2c2913
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManager.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+
+import akka.actor.ActorRef;
+
+public interface ActorSystemManager {
+
+    void start();
+
+    void start(String hostname, Integer port, String currentRegion);
+
+    void waitForRequestActors();
+
+    boolean isReady();
+
+    void registerRouterProducer( RouterProducer routerProducer );
+
+    void registerMessageType( Class messageType, String routerPath );
+
+    ActorRef getClientActor(String region );
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManagerImpl.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManagerImpl.java
new file mode 100644
index 0000000..0622b1b
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemManagerImpl.java
@@ -0,0 +1,398 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import akka.pattern.Patterns;
+import akka.util.Timeout;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import scala.concurrent.Await;
+import scala.concurrent.Future;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+
+@Singleton
+public class ActorSystemManagerImpl implements ActorSystemManager {
+    private static final Logger logger = LoggerFactory.getLogger( ActorSystemManagerImpl.class );
+
+    private String  hostname;
+    private Integer port;
+    private String  currentRegion;
+
+    private static Injector             injector;
+    private final ActorSystemFig        actorSystemFig;
+    private final Map<String, ActorRef> requestActorsByRegion;
+    private final List<RouterProducer>  routerProducers = new ArrayList<>();
+    private final Map<Class, String>    routersByMessageType = new HashMap<>();
+
+
+    @Inject
+    public ActorSystemManagerImpl(Injector inj, ActorSystemFig actorSystemFig) {
+        injector = inj;
+        this.actorSystemFig = actorSystemFig;
+        this.requestActorsByRegion = new HashMap<>();
+    }
+
+
+    /**
+     * Init Akka ActorSystems and wait for request actors to start.
+     */
+    @Override
+    public void start() {
+
+        this.hostname = actorSystemFig.getHostname();
+        this.currentRegion = actorSystemFig.getRegion();
+        this.port = null;
+
+        initAkka();
+        waitForRequestActors();
+    }
+
+
+    /**
+     * For testing purposes only; does not wait for request actors to start.
+     */
+    @Override
+    public void start(String hostname, Integer port, String currentRegion) {
+
+        this.hostname = hostname;
+        this.currentRegion = currentRegion;
+        this.port = port;
+
+        initAkka();
+    }
+
+
+    @Override
+    public boolean isReady() {
+        return !getRequestActorsByRegion().isEmpty();
+    }
+
+
+    @Override
+    public void registerRouterProducer(RouterProducer routerProducer) {
+        routerProducers.add( routerProducer );
+    }
+
+
+    @Override
+    public void registerMessageType(Class messageType, String routerPath) {
+        routersByMessageType.put( messageType, routerPath );
+    }
+
+
+    @Override
+    public ActorRef getClientActor(String region) {
+        return getRequestActorsByRegion().get( region );
+    }
+
+
+    private Map<String, ActorRef> getRequestActorsByRegion() {
+        return requestActorsByRegion;
+    }
+
+
+    private void initAkka() {
+        logger.info("Initializing Akka");
+
+        // Create one actor system with request actor for each region
+
+        if ( StringUtils.isEmpty( hostname )) {
+            throw new RuntimeException( "No value specified for " + ActorSystemFig.AKKA_HOSTNAME );
+        }
+
+        if ( StringUtils.isEmpty( currentRegion )) {
+            throw new RuntimeException( "No value specified for " + ActorSystemFig.AKKA_REGION );
+        }
+
+        if ( StringUtils.isEmpty( actorSystemFig.getRegionList() )) {
+            throw new RuntimeException( "No value specified for " + ActorSystemFig.AKKA_REGION_LIST );
+        }
+
+        if ( StringUtils.isEmpty( actorSystemFig.getRegionSeeds() )) {
+            throw new RuntimeException( "No value specified for " + ActorSystemFig.AKKA_REGION_SEEDS);
+        }
+
+        if ( StringUtils.isEmpty( actorSystemFig.getAkkaAuthoritativeRegion() )) {
+            throw new RuntimeException( "No value specified for " + ActorSystemFig.AKKA_AUTHORITATIVE_REGION);
+        }
+
+        List regionList = Arrays.asList( actorSystemFig.getRegionList().toLowerCase().split(",") );
+
+        logger.info("Initializing Akka for hostname {} region {} regionList {} seeds {}",
+            hostname, currentRegion, regionList, actorSystemFig.getRegionSeeds() );
+
+        final Map<String, ActorSystem> systemMap = new HashMap<>();
+
+        Map<String, Config> configMap = readClusterSingletonConfigs();
+
+        ActorSystem localSystem = createClusterSingletonProxies( configMap, systemMap );
+
+        createRequestActors( systemMap );
+
+        for ( RouterProducer routerProducer : routerProducers ) {
+            routerProducer.createLocalSystemActors( localSystem, systemMap );
+        }
+    }
+
+
+    /**
+     * Read configuration and create a Config for each region.
+     *
+     * @return Map of regions to Configs.
+     */
+    private Map<String, Config> readClusterSingletonConfigs() {
+
+        Map<String, Config> configs = new HashMap<>();
+
+        ListMultimap<String, String> seedsByRegion = ArrayListMultimap.create();
+
+        String[] regionSeeds = actorSystemFig.getRegionSeeds().split( "," );
+
+        logger.info("Found region {} seeds {}", regionSeeds.length, regionSeeds);
+
+        try {
+
+            if ( port != null ) {
+
+                // we are testing, create seeds-by-region map for one region, one seed
+
+                String seed = "akka.tcp://ClusterSystem@" + hostname + ":" + port;
+                seedsByRegion.put( currentRegion, seed );
+                logger.info("Akka testing, only starting one seed");
+
+            } else { // create seeds-by-region map
+
+                for (String regionSeed : regionSeeds) {
+
+                    String[] parts = regionSeed.split( ":" );
+                    String region = parts[0];
+                    String hostname = parts[1];
+                    String regionPortString = parts[2];
+
+                    // all seeds in same region must use same port
+                    // we assume 0th seed has the right port
+                    final Integer regionPort;
+
+                    if (port == null) {
+                        regionPort = Integer.parseInt( regionPortString );
+                    } else {
+                        regionPort = port; // unless we are testing
+                    }
+
+                    String seed = "akka.tcp://ClusterSystem@" + hostname + ":" + regionPort;
+
+                    logger.info("Adding seed {} for region {}", seed, region );
+
+                    seedsByRegion.put( region, seed );
+                }
+
+                if (seedsByRegion.keySet().isEmpty()) {
+                    throw new RuntimeException(
+                        "No seeds listed in 'parsing collection.akka.region.seeds' property." );
+                }
+            }
+
+            int numInstancesPerNode = actorSystemFig.getUniqueValueActors();
+
+            // read config file once for each region
+
+            for ( String region : seedsByRegion.keySet() ) {
+
+                List<String> seeds = seedsByRegion.get( region );
+                int lastColon = seeds.get(0).lastIndexOf(":") + 1;
+                final Integer regionPort = Integer.parseInt( seeds.get(0).substring( lastColon ));
+
+                // cluster singletons only run role "io" nodes and NOT on "client" nodes of other regions
+                String clusterRole = currentRegion.equals( region ) ? "io" : "client";
+
+                logger.info( "Config for region {} is:\n" +
+                        "   Akka Hostname {}\n" +
+                        "   Akka Seeds {}\n" +
+                        "   Akka Port {}\n" +
+                        "   Akka UniqueValueActors per node {}\n" +
+                        "   Akka Authoritative Region {}",
+                    region, hostname, seeds, port, numInstancesPerNode, actorSystemFig.getAkkaAuthoritativeRegion() );
+
+                Map<String, Object> configMap = new HashMap<String, Object>() {{
+                    put( "akka", new HashMap<String, Object>() {{
+                        put( "remote", new HashMap<String, Object>() {{
+                            put( "netty.tcp", new HashMap<String, Object>() {{
+                                put( "hostname", hostname );
+                                put( "bind-hostname", hostname );
+                                put( "port", regionPort );
+                            }} );
+                        }} );
+                        put( "cluster", new HashMap<String, Object>() {{
+                            put( "max-nr-of-instances-per-node", numInstancesPerNode );
+                            put( "roles", Collections.singletonList(clusterRole) );
+                            put( "seed-nodes", new ArrayList<String>() {{
+                                for (String seed : seeds) {
+                                    add( seed );
+                                }
+                            }} );
+                        }} );
+                        put( "actor", new HashMap<String, Object>() {{
+                            put( "deployment", new HashMap<String, Object>() {{
+                                put( "/uvRouter/singleton/router", new HashMap<String, Object>() {{
+                                    put( "cluster", new HashMap<String, Object>() {{
+                                        //put( "roles", Collections.singletonList(role) );
+                                        put( "max-nr-of-instances-per-node", numInstancesPerNode );
+                                    }} );
+                                }} );
+                            }} );
+                        }} );
+                    }} );
+                }};
+
+                Config config = ConfigFactory
+                    .parseMap( configMap )
+                    .withFallback( ConfigFactory.parseString( "akka.cluster.roles = [io]" ) )
+                    .withFallback( ConfigFactory.load( "cluster-singleton" ) );
+
+                configs.put( region, config );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException("Error 'parsing collection.akka.region.seeds' property", e );
+        }
+
+        return configs;
+    }
+
+
+    /**
+     * Create ActorSystem and ClusterSingletonProxy for every region.
+     * Create ClusterSingletonManager for the current region.
+     *
+     * @param configMap Configurations to be used to create ActorSystems
+     * @param systemMap Map of ActorSystems created by this method
+     *
+     * @return ActorSystem for this region.
+     */
+    private ActorSystem createClusterSingletonProxies(
+        Map<String, Config> configMap, Map<String, ActorSystem> systemMap ) {
+
+        ActorSystem localSystem = null;
+
+        for ( String region : configMap.keySet() ) {
+            Config config = configMap.get( region );
+
+            ActorSystem system = ActorSystem.create( "ClusterSystem", config );
+            systemMap.put( region, system );
+
+            // cluster singletons only run role "io" nodes and NOT on "client" nodes of other regions
+            if ( currentRegion.equals( region ) ) {
+
+                localSystem = system;
+
+                for ( RouterProducer routerProducer : routerProducers ) {
+                    routerProducer.createClusterSingletonManager( system );
+                }
+            }
+
+            for ( RouterProducer routerProducer : routerProducers ) {
+                routerProducer.createClusterSingletonProxy( system );
+            }
+        }
+
+        return localSystem;
+    }
+
+
+    /**
+     * Create RequestActor for each region.
+     *
+     * @param systemMap Map of regions to ActorSystems.
+     */
+    private void createRequestActors( Map<String, ActorSystem> systemMap ) {
+
+        for ( String region : systemMap.keySet() ) {
+
+            logger.info("Creating request actor for region {}", region);
+
+            // Each RequestActor needs to know path to ClusterSingletonProxy and region
+            ActorRef requestActor = systemMap.get( region ).actorOf(
+                //Props.create( ClientActor.class, "/user/uvProxy" ), "requestActor" );
+                Props.create( ClientActor.class, routersByMessageType ), "requestActor" );
+
+            requestActorsByRegion.put( region, requestActor );
+        }
+    }
+
+
+    @Override
+    public void waitForRequestActors() {
+
+        for ( String region : requestActorsByRegion.keySet() ) {
+            ActorRef ra = requestActorsByRegion.get( region );
+            waitForRequestActor( ra );
+        }
+    }
+
+
+    private void waitForRequestActor( ActorRef ra ) {
+
+        logger.info( "Waiting on request actor {}...", ra.path() );
+
+        boolean started = false;
+        int retries = 0;
+        int maxRetries = 60;
+        while (retries < maxRetries) {
+            Timeout t = new Timeout( 10, TimeUnit.SECONDS );
+
+            Future<Object> fut = Patterns.ask( ra, new ClientActor.StatusRequest(), t );
+            try {
+                ClientActor.StatusMessage result = (ClientActor.StatusMessage) Await.result( fut, t.duration() );
+
+                if (result.getStatus().equals( ClientActor.StatusMessage.Status.READY )) {
+                    started = true;
+                    break;
+                }
+                logger.info( "Waiting for request actor {} region {} ({}s)", ra.path(), currentRegion, retries );
+                Thread.sleep( 1000 );
+
+            } catch (Exception e) {
+                logger.error( "Error: Timeout waiting for requestActor" );
+            }
+            retries++;
+        }
+
+        if (started) {
+            logger.info( "RequestActor has started" );
+        } else {
+            throw new RuntimeException( "RequestActor did not start in time" );
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemModule.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemModule.java
new file mode 100644
index 0000000..e501569
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ActorSystemModule.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+import com.google.inject.AbstractModule;
+import org.safehaus.guicyfig.GuicyFigModule;
+
+
+public class ActorSystemModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+
+        install( new GuicyFigModule( ActorSystemFig.class ) );
+
+        bind( ActorSystemManager.class ).to( ActorSystemManagerImpl.class );
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ClientActor.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ClientActor.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ClientActor.java
new file mode 100644
index 0000000..c495608
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/ClientActor.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.usergrid.persistence.actorsystem;
+
+import akka.actor.ActorSelection;
+import akka.actor.Address;
+import akka.actor.UntypedActor;
+import akka.cluster.Cluster;
+import akka.cluster.ClusterEvent;
+import akka.cluster.Member;
+import akka.cluster.MemberStatus;
+import org.apache.commons.lang.RandomStringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.ThreadLocalRandom;
+
+
+/**
+ * Once notified of nodes, sends unique propertyValue requests to ClusterSingletonRouter via it's local proxy.
+ */
+public class ClientActor extends UntypedActor {
+    private static final Logger logger = LoggerFactory.getLogger( ClientActor.class );
+
+    private final String name = RandomStringUtils.randomAlphanumeric( 4 );
+
+    private final Set<Address>       nodes = new HashSet<>();
+    private final Cluster            cluster = Cluster.get(getContext().system());
+    private final Map<Class, String> routersByMessageType;
+
+    private boolean ready = false;
+
+
+    public ClientActor( Map<Class, String> routersByMessageType ) {
+        this.routersByMessageType = routersByMessageType;
+    }
+
+    // subscribe to cluster changes, MemberEvent
+    @Override
+    public void preStart() {
+        logger.debug("{} role {} address {}:{} starting up, subscribing to cluster events...", name,
+            cluster.getSelfRoles().iterator().next(),
+            cluster.readView().selfAddress().host(),
+            cluster.readView().selfAddress().hostPort());
+        cluster.subscribe(getSelf(), ClusterEvent.MemberEvent.class, ClusterEvent.ReachabilityEvent.class);
+    }
+
+    // re-subscribe when restart
+    @Override
+    public void postStop() {
+        cluster.unsubscribe(getSelf());
+    }
+
+    @Override
+    public void onReceive(Object message) {
+
+        int startSize = nodes.size();
+
+        String routerPath = routersByMessageType.get( message.getClass() );
+
+        if ( routerPath != null && ready ) {
+
+            // just pick any node, the ClusterSingletonRouter will do the consistent hash routing
+            List<Address> nodesList = new ArrayList<>( nodes );
+            Address address = nodesList.get( ThreadLocalRandom.current().nextInt( nodesList.size() ) );
+            ActorSelection service = getContext().actorSelection( address + routerPath );
+            service.tell( message, getSender() );
+
+        } else if ( routerPath != null && !ready ) {
+
+            logger.debug("{} responding with status unknown", name);
+            getSender().tell( new ErrorResponse("ClientActor not ready"), getSender() );
+
+        } if ( message instanceof StatusRequest ) {
+            if ( ready ) {
+                getSender().tell( new StatusMessage( name, StatusMessage.Status.READY ), getSender() );
+            } else {
+                getSender().tell( new StatusMessage( name, StatusMessage.Status.INITIALIZING), getSender() );
+            }
+            return;
+
+        } else {
+            processAsClusterEvent( message );
+        }
+
+        if ( logger.isDebugEnabled() && startSize != nodes.size() ) {
+            logger.debug( "{} now knows {} nodes", name, nodes.size() );
+        }
+
+        if (!nodes.isEmpty() && !ready) {
+            logger.debug( name + " is ready" );
+            ready = true;
+
+        } else if (nodes.isEmpty() && ready) {
+            ready = false;
+        }
+    }
+
+    /**
+     * Process messages about nodes up, down, reachable and unreachable.
+     */
+    private void processAsClusterEvent(Object message) {
+
+        if (message instanceof ClusterEvent.CurrentClusterState) {
+            ClusterEvent.CurrentClusterState state = (ClusterEvent.CurrentClusterState) message;
+            nodes.clear();
+            for (Member member : state.getMembers()) {
+                if (member.hasRole("io") && member.status().equals( MemberStatus.up())) {
+                    nodes.add(member.address());
+                    logger.debug("RequestActor {} received cluster-state member-up for {}", name, member.address());
+                }
+            }
+
+        } else if (message instanceof ClusterEvent.MemberUp) {
+            ClusterEvent.MemberUp mUp = (ClusterEvent.MemberUp) message;
+            if (mUp.member().hasRole("io")) {
+                nodes.add( mUp.member().address() );
+            }
+            logger.debug("{} received member-up for {}", name, mUp.member().address());
+
+        } else if (message instanceof ClusterEvent.MemberEvent) {
+            ClusterEvent.MemberEvent other = (ClusterEvent.MemberEvent) message;
+            nodes.remove(other.member().address());
+
+        } else if (message instanceof ClusterEvent.UnreachableMember) {
+            ClusterEvent.UnreachableMember unreachable = (ClusterEvent.UnreachableMember) message;
+            nodes.remove(unreachable.member().address());
+            logger.debug("{} received un-reachable for {}", name, unreachable.member().address());
+
+        } else if (message instanceof ClusterEvent.ReachableMember) {
+            ClusterEvent.ReachableMember reachable = (ClusterEvent.ReachableMember) message;
+            if (reachable.member().hasRole("io")) {
+                nodes.add( reachable.member().address() );
+            }
+            logger.debug("{} received reachable for {}", name, reachable.member().address());
+
+        } else {
+            logger.error("{}: unhandled message: {}", name, message.toString());
+            unhandled(message);
+        }
+    }
+
+    /**
+     * RequestAction responds to StatusRequests.
+     */
+    public static class StatusRequest implements Serializable { }
+
+    /**
+     * RequestActor responds with, and some times unilaterally sends StatusMessages.
+     */
+    public static class StatusMessage implements Serializable {
+        final String name;
+
+        public Status getStatus() {
+            return status;
+        }
+
+        public enum Status { INITIALIZING, READY }
+        private final Status status;
+        public StatusMessage(String name, Status status) {
+            this.name = name;
+            this.status = status;
+        }
+        public String getName() {
+            return name;
+        }
+        public boolean isReady() {
+            return status.equals( Status.READY );
+        }
+    }
+
+
+    public static class ErrorResponse implements Serializable {
+        private String message;
+        public ErrorResponse( String message ) {
+            this.message = message;
+        }
+
+        public String getMessage() {
+            return message;
+        }
+
+        public void setMessage(String message) {
+            this.message = message;
+        }
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/GuiceActorProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/GuiceActorProducer.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/GuiceActorProducer.java
new file mode 100644
index 0000000..9304c4c
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/GuiceActorProducer.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+import akka.actor.Actor;
+import akka.actor.IndirectActorProducer;
+import com.google.inject.Injector;
+
+
+public class GuiceActorProducer implements IndirectActorProducer {
+
+    final Injector injector;
+    final Class<? extends Actor> actorClass;
+
+    public GuiceActorProducer(Injector injector, Class<? extends Actor> actorClass) {
+        this.injector = injector;
+        this.actorClass = actorClass;
+    }
+
+    @Override
+    public Class<? extends Actor> actorClass() {
+        return actorClass;
+    }
+
+    @Override
+    public Actor produce() {
+        return injector.getInstance( actorClass );
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/RouterProducer.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/RouterProducer.java b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/RouterProducer.java
new file mode 100644
index 0000000..ac2c7ee
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/java/org/apache/usergrid/persistence/actorsystem/RouterProducer.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+import akka.actor.ActorSystem;
+
+import java.util.Map;
+
+
+public interface RouterProducer {
+
+    /**
+     * Create cluster single manager for current region.
+     * Will be called once per router per JVM.
+     */
+    void createClusterSingletonManager( ActorSystem system );
+
+    /**
+     * Create cluster singleton proxy for region.
+     * Will be called once per router per JVM per region.
+     */
+    void createClusterSingletonProxy( ActorSystem system );
+
+    /**
+     * Create other actors needed to support the router produced by the implementation.
+     */
+    void createLocalSystemActors( ActorSystem localSystem, Map<String, ActorSystem> systemMap );
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/resources/application.conf b/stack/corepersistence/actorsystem/src/main/resources/application.conf
new file mode 100644
index 0000000..93854f9
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/resources/application.conf
@@ -0,0 +1,28 @@
+akka {
+  
+  loggers = ["akka.event.slf4j.Slf4jLogger"]
+  loglevel = "ERROR"
+  logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
+  
+  actor {
+    provider = "akka.cluster.ClusterActorRefProvider"
+  }
+  
+  remote {
+    log-remote-lifecycle-events = off
+    netty.tcp {
+      hostname = "127.0.0.1"
+      port = 0
+    }
+  }
+}
+
+# Disable legacy metrics in akka-cluster.
+akka.cluster.metrics.enabled=off
+
+# Enable metrics extension in akka-cluster-metrics.
+akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension", "akka.cluster.pubsub.DistributedPubSub"]
+
+# Sigar native library extract location during tests.
+# Note: use per-jvm-instance folder when running multiple jvm on one host. 
+akka.cluster.metrics.native-library-extract-folder=${user.dir}/target/native

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/main/resources/cluster-singleton.conf
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/main/resources/cluster-singleton.conf b/stack/corepersistence/actorsystem/src/main/resources/cluster-singleton.conf
new file mode 100644
index 0000000..907aebb
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/main/resources/cluster-singleton.conf
@@ -0,0 +1,25 @@
+include "application"
+
+akka.actor.deployment {
+  /uvRouter/singleton/router {
+    router = consistent-hashing-pool
+    cluster {
+      enabled = on
+      allow-local-routees = on
+      
+      # singleton will only run on nodes with role "io"
+      use-role = io
+
+      # more forgiving failure detector
+      failure-detector {
+        threshold = 10
+        acceptable-heartbeat-pause = 3 s
+        heartbeat-interval = 1 s
+        heartbeat-request {
+          expected-response-after = 3 s
+        }
+      }
+
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/actorsystem/src/test/java/org/apache/usergrid/persistence/actorsystem/ActorServiceServiceTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/actorsystem/src/test/java/org/apache/usergrid/persistence/actorsystem/ActorServiceServiceTest.java b/stack/corepersistence/actorsystem/src/test/java/org/apache/usergrid/persistence/actorsystem/ActorServiceServiceTest.java
new file mode 100644
index 0000000..a12c5e1
--- /dev/null
+++ b/stack/corepersistence/actorsystem/src/test/java/org/apache/usergrid/persistence/actorsystem/ActorServiceServiceTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.usergrid.persistence.actorsystem;
+
+import com.google.inject.Inject;
+import org.apache.usergrid.persistence.core.test.ITRunner;
+import org.apache.usergrid.persistence.core.test.UseModules;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+@RunWith( ITRunner.class )
+@UseModules( ActorSystemModule.class )
+public class ActorServiceServiceTest {
+    private static final Logger logger = LoggerFactory.getLogger( ActorServiceServiceTest.class );
+
+    @Inject
+    ActorSystemFig actorSystemFig;
+
+    private static AtomicBoolean startedAkka = new AtomicBoolean( false );
+
+
+    @Before
+    public void initAkka() {
+        if ( !startedAkka.getAndSet( true ) ) {
+        }
+    }
+
+
+    @Test
+    public void testBasicOperation() throws Exception {
+        initAkka();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/collection/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/pom.xml b/stack/corepersistence/collection/pom.xml
index ad9cefd..88b96b1 100644
--- a/stack/corepersistence/collection/pom.xml
+++ b/stack/corepersistence/collection/pom.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -26,6 +42,12 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.usergrid</groupId>
+            <artifactId>actorsystem</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.typesafe.akka</groupId>
             <artifactId>akka-actor_2.11</artifactId>
             <version>2.4.0</version>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java
index b6056b5..dff4a12 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java
@@ -126,10 +126,4 @@ public interface EntityCollectionManager {
      * Returns health of entity data store.
      */
     Health getHealth();
-
-    /**
-     * For testing purposes only.
-     */
-    void startAkkaForTesting( String hostname, int port, String region );
-
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index 45e519e..ae73e47 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -20,6 +20,8 @@ package org.apache.usergrid.persistence.collection.guice;
 
 import java.util.concurrent.ThreadPoolExecutor;
 
+import org.apache.usergrid.persistence.actorsystem.ActorSystemFig;
+import org.apache.usergrid.persistence.actorsystem.ActorSystemModule;
 import org.apache.usergrid.persistence.collection.uniquevalues.*;
 import org.safehaus.guicyfig.GuicyFigModule;
 
@@ -55,11 +57,11 @@ public abstract class CollectionModule extends AbstractModule {
     protected void configure() {
 
         // noinspection unchecked
-        install( new GuicyFigModule( AkkaFig.class ) );
         install( new GuicyFigModule( SerializationFig.class ) );
         install( new GuicyFigModule( CollectionSchedulerFig.class ) );
         install( new SerializationModule() );
         install( new ServiceModule() );
+        install( new ActorSystemModule() );
 
         // users of this module can add their own implemementations
         // create a guice factor for getting our collection manager

http://git-wip-us.apache.org/repos/asf/usergrid/blob/ee18950f/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
index 18a07ac..3877fe3 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerFactoryImpl.java
@@ -21,6 +21,7 @@ package org.apache.usergrid.persistence.collection.impl;
 
 import java.util.concurrent.ExecutionException;
 
+import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
 import org.apache.usergrid.persistence.collection.cache.EntityCacheFig;
@@ -76,6 +77,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
     private final Keyspace keyspace;
     private final MetricsFactory metricsFactory;
     private final RxTaskScheduler rxTaskScheduler;
+    private final ActorSystemManager actorSystemManager;
     private final UniqueValuesService uniqueValuesService;
 
 
@@ -101,6 +103,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
                                 metricsFactory,
                                 serializationFig,
                                 rxTaskScheduler,
+                                actorSystemManager,
                                 uniqueValuesService,
                                 scope );
 
@@ -128,6 +131,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
             final EntityCacheFig entityCacheFig,
             final MetricsFactory metricsFactory, @CollectionExecutorScheduler
             final RxTaskScheduler rxTaskScheduler,
+            final ActorSystemManager actorSystemManager,
             final UniqueValuesService uniqueValuesService ) {
 
         this.writeStart = writeStart;
@@ -146,6 +150,7 @@ public class EntityCollectionManagerFactoryImpl implements EntityCollectionManag
         this.keyspace = keyspace;
         this.metricsFactory = metricsFactory;
         this.rxTaskScheduler = rxTaskScheduler;
+        this.actorSystemManager = actorSystemManager;
         this.uniqueValuesService = uniqueValuesService;
     }