You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2022/04/08 14:34:07 UTC

[servicecomb-pack] 01/03: Refactoring the Alpha module using Spring SPI

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-pack.git

commit 68851b7e4ef9d27a18c8199b263ca48075205cf1
Author: Lei Zhang <zh...@apache.org>
AuthorDate: Sat Apr 2 11:58:33 2022 +0800

    Refactoring the Alpha module using Spring SPI
---
 .github/workflows/master-pr-build.yaml             |   6 +-
 .../acceptance-pack-akka-spring-demo/pom.xml       |  41 +----
 .../acceptance-pack-cluster-spring-demo/pom.xml    |  19 +-
 .../acceptance-pack-dubbo-demo/pom.xml             |  10 +-
 .../pom.xml                                        |  10 +-
 .../acceptance-pack-spring-demo-with-nacos/pom.xml |  12 +-
 .../pom.xml                                        |  10 +-
 .../acceptance-pack-spring-demo/pom.xml            |  10 +-
 .../acceptance-pack-tcc-spring-demo/pom.xml        |  18 +-
 alpha/alpha-benchmark/pom.xml                      |   2 +-
 .../pack/alpha/benchmark/Application.java          |   1 +
 .../servicecomb/pack/alpha/core/api/APIv1.java     |   4 +-
 .../alpha/core/metrics/AlphaMetricsEndpoint.java}  |  11 +-
 .../pack/alpha/fsm/FsmAutoConfiguration.java       | 124 -------------
 .../memory/MemoryChannelAutoConfiguration.java     |  62 -------
 .../alpha-persistence-jpa}/pom.xml                 |  10 +-
 alpha/alpha-server/pom.xml                         |  20 +--
 .../servicecomb/pack/alpha/server/AlphaConfig.java | 130 ++------------
 .../src/main/resources/application.yaml            |  82 +++++++--
 .../pack/alpha/server/AlphaIntegrationTest.java    |   3 +
 .../server/AlphaIntegrationWithRandomPortTest.java |   3 +
 .../saga/akka}/AlphaIntegrationFsmTest.java        |  21 +--
 .../saga/akka}/OmegaEventSagaSimulator.java        |   2 +-
 .../fsm => spec/saga/akka}/OmegaEventSender.java   |   2 +-
 .../saga/db}/ClusterLockServiceTest.java           |  13 +-
 .../tcc/db}/AlphaTccEventControllerTest.java       |   9 +-
 .../tcc/db}/AlphaTccServerTestBase.java            |  17 +-
 .../tcc/db}/MemoryAlphaTccServerTest.java          |   6 +-
 .../tcc => spec/tcc/db}/RdbAlphaTccServerTest.java |   4 +-
 .../tcc => spec/tcc/db}/TccApplication.java        |   2 +-
 .../tcc => spec/tcc/db}/TccCallbackEngineTest.java |  16 +-
 .../tcc => spec/tcc/db}/TccConfiguration.java      |   8 +-
 .../db}/TccCoordinateCommandStreamObserver.java    |   2 +-
 .../tcc/db}/jpa/EventConverterTest.java            |   2 +-
 .../tcc/db}/service/MemoryEventRegistryTest.java   |   6 +-
 .../tcc/db}/service/TccTxEventServiceTest.java     |  20 ++-
 .../service/TccTxEventServiceTransactionTest.java  |  21 +--
 .../pom.xml                                        |  61 ++++---
 .../saga/db/AlphaSpecSagaDbAutoConfiguration.java  | 148 +++++++++++++++
 .../spec/saga/db}/CommandEntityRepository.java     |   4 +-
 .../alpha/spec/saga/db}/GrpcOmegaCallback.java     |   8 +-
 .../spec/saga/db}/GrpcTxEventEndpointImpl.java     |   6 +-
 .../spec/saga/db}/SagaTransactionsController.java  |   5 +-
 .../spec/saga/db}/SpringCommandRepository.java     |  17 +-
 .../spec/saga/db}/SpringTxEventRepository.java     |   8 +-
 .../spec/saga/db}/SpringTxTimeoutRepository.java   |   9 +-
 .../spec/saga/db}/TxEventEnvelopeRepository.java   |   4 +-
 .../spec/saga/db}/TxTimeoutEntityRepository.java   |   6 +-
 .../spec/saga/db/api/SagaDbAPIv1Controller.java}   |  30 ++--
 .../alpha/spec/saga/db/api/SagaDbAPIv1Impl.java}   |  36 ++--
 .../spec/saga/db/cluster}/ClusterLockService.java  |  94 +++++-----
 .../db/cluster}/provider/AbstractLockProvider.java |  11 +-
 .../alpha/spec/saga/db/cluster}/provider/Lock.java |   2 +-
 .../saga/db/cluster}/provider/LockProvider.java    |   5 +-
 .../cluster}/provider/LockProviderPersistence.java |   4 +-
 .../provider/jdbc/JdbcLockPersistence.java         |   8 +-
 .../cluster}/provider/jdbc/JdbcLockProvider.java   |   6 +-
 .../jdbc/LockProviderJdbcConfiguration.java        |   9 +-
 .../provider/jdbc/MasterLockEntityRepository.java  |  16 +-
 .../provider/jdbc/SpringMasterLockRepository.java  |  13 +-
 .../db/cluster}/provider/jdbc/jpa/MasterLock.java  |   5 +-
 .../provider/jdbc/jpa/MasterLockRepository.java    |   2 +-
 .../saga/db/metrics/AlphaMetricsEndpointImpl.java} |   8 +-
 .../spec/saga/db}/metrics/MetricsService.java      |   2 +-
 .../pack/alpha/spec/saga/db}/model/Stats.java      |   2 +-
 .../saga/db/properties/SpecSagaDbProperties.java   |  23 ++-
 .../spec/saga/db/test}/AlphaEventController.java   |   7 +-
 .../src/main/resources/META-INF/spring.factories   |   3 +-
 .../spec/saga/db}/AlphaEventControllerTest.java    |   8 +-
 .../saga/db}/SagaTransactionsControllerTest.java   |   5 +-
 .../pack/alpha/spec/saga/db/WebConfiguration.java  |  20 +++
 alpha/{alpha-fsm => alpha-spec-saga-fsm}/README.md |   0
 alpha/{alpha-fsm => alpha-spec-saga-fsm}/pom.xml   |  22 ++-
 .../fsm/AlphaSpecSagaFsmAutoConfiguration.java     | 198 +++++++++++++++++++++
 .../alpha}/fsm/CompensateAckCountDownLatch.java    |   2 +-
 .../pack/alpha}/fsm/GrpcOmegaCallback.java         |   2 +-
 .../pack/alpha}/fsm/GrpcSagaEventService.java      |   4 +-
 .../servicecomb/pack/alpha/fsm/SagaActor.java      |   0
 .../servicecomb/pack/alpha/fsm/SagaActorState.java |   0
 .../pack/alpha/fsm/SagaShardRegionActor.java       |   1 -
 .../pack/alpha/fsm}/api/APIv1Controller.java       |  21 ++-
 .../servicecomb/pack/alpha/fsm}/api/APIv1Impl.java |   6 +-
 .../fsm/channel/AbstractActorEventChannel.java     |   0
 .../alpha/fsm/channel/AbstractEventConsumer.java   |   0
 .../fsm/channel/kafka/KafkaActorEventChannel.java  |   0
 .../kafka/KafkaChannelAutoConfiguration.java       |   0
 .../fsm/channel/kafka/KafkaMessagePublisher.java   |   0
 .../fsm/channel/kafka/KafkaSagaEventConsumer.java  |   0
 .../channel/memory/MemoryActorEventChannel.java    |   2 -
 .../channel/memory/MemorySagaEventConsumer.java    |   0
 .../channel/rabbit/RabbitActorEventChannel.java    |   0
 .../rabbit/RabbitChannelAutoConfiguration.java     |   3 +-
 .../fsm/channel/rabbit/RabbitMessageChannel.java   |   0
 .../fsm/channel/rabbit/RabbitMessagePublisher.java |   3 +-
 .../channel/rabbit/RabbitSagaEventConsumer.java    |   9 +-
 .../alpha/fsm/channel/redis/MessageSerializer.java |   0
 .../fsm/channel/redis/RedisActorEventChannel.java  |   3 +-
 .../redis/RedisChannelAutoConfiguration.java       |   1 -
 .../fsm/channel/redis/RedisMessagePublisher.java   |   0
 .../fsm/channel/redis/RedisSagaEventConsumer.java  |   1 -
 .../pack/alpha/fsm/domain/AddTxEventDomain.java    |   0
 .../pack/alpha/fsm/domain/DomainEvent.java         |   0
 .../pack/alpha/fsm/domain/SagaEndedDomain.java     |   2 +-
 .../pack/alpha/fsm/domain/SagaStartedDomain.java   |   0
 .../pack/alpha/fsm/domain/UpdateTxEventDomain.java |   2 +-
 .../fsm/metrics/AlphaMetricsEndpointImpl.java}     |   8 +-
 .../pack/alpha/fsm/metrics/MetricsService.java     |   0
 .../servicecomb/pack/alpha/fsm/model/SagaData.java |   2 +-
 .../pack/alpha/fsm/model/TxEntities.java           |   0
 .../servicecomb/pack/alpha/fsm/model/TxEntity.java |   0
 .../fsm/properties/ChannelKafkaProperties.java}    |   7 +-
 .../fsm/properties/ChannelMemoryProperties.java}   |  17 +-
 .../alpha/fsm/properties/ChannelProperties.java}   |  23 ++-
 .../fsm/properties/ElasticsearchProperties.java}   |  38 ++--
 .../fsm/properties/RepositoryProperties.java}      |  27 +--
 .../fsm/properties/SpecSagaAkkaProperties.java     |  33 +++-
 .../AbstractTransactionRepositoryChannel.java      |   2 +-
 .../fsm/repository/NoneTransactionRepository.java  |   0
 .../fsm/repository/TransactionRepository.java      |   0
 .../repository/TransactionRepositoryChannel.java   |   0
 .../DefaultTransactionRepositoryChannel.java       |   0
 .../ElasticsearchTransactionRepository.java        |  12 +-
 .../elasticsearch/GlobalTransactionDocument.java   |   0
 .../integration/akka/AkkaClusterListener.java      |   0
 .../akka/AkkaConfigPropertyAdapter.java            |   7 +-
 .../spring/integration/akka/SagaDataExtension.java |   6 +-
 .../integration/akka/SpringAkkaExtension.java      |   0
 .../alpha/fsm/test}/FsmSagaDataController.java     |   4 +-
 .../src/main/resources/META-INF/spring.factories   |   4 +-
 .../alpha/spec/saga/akka/it}/SagaApplication.java  |   2 +-
 .../spec/saga/akka/it}/SagaIntegrationTest.java    |  34 ++--
 .../alpha/spec/saga/akka/ut}/SagaActorTest.java    |  20 ++-
 .../saga/akka/ut}/api/APIv1ControllerTest.java     |  44 +++--
 .../spec/saga/akka/ut/api/TestConfiguration.java   |  60 +++++++
 .../spec/saga/akka/ut}/model/TxEntitiesTest.java   |   4 +-
 .../ElasticsearchTransactionRepositoryTest.java    |  36 ++--
 .../spec/saga/akka/util}/SagaEventSender.java      |   3 +-
 .../src/test/resources/application.yaml            |   0
 .../src/test/resources/log4j2.xml                  |   0
 {persistence => alpha/alpha-spec-tcc-db}/pom.xml   |  43 ++++-
 .../tcc/db/AlphaSpecTccDbAutoConfiguration.java    | 147 +++++++++++++++
 .../alpha/spec/tcc/db}/GrpcTccEventService.java    |  20 ++-
 .../spec/tcc/db/api/TccDbAPIv1Controller.java}     |  30 ++--
 .../alpha/spec/tcc/db/api/TccDbAPIv1Impl.java}     |  36 ++--
 .../spec/tcc/db}/callback/CallbackEngine.java      |   4 +-
 .../tcc/db}/callback/GrpcOmegaTccCallback.java     |   5 +-
 .../alpha/spec/tcc/db}/callback/OmegaCallback.java |   4 +-
 .../tcc/db}/callback/OmegaCallbackWrapper.java     |   7 +-
 .../tcc/db}/callback/OmegaCallbacksRegistry.java   |   2 +-
 .../spec/tcc/db}/callback/TccCallbackEngine.java   |  12 +-
 .../tcc/db}/callback/TccPendingTaskRunner.java     |   2 +-
 .../alpha/spec/tcc/db}/jpa/EventConverter.java     |   8 +-
 .../pack/alpha/spec/tcc/db}/jpa/GlobalTxEvent.java |   2 +-
 .../spec/tcc/db}/jpa/GlobalTxEventRepository.java  |   2 +-
 .../alpha/spec/tcc/db}/jpa/ParticipatedEvent.java  |   2 +-
 .../tcc/db}/jpa/ParticipatedEventRepository.java   |   6 +-
 .../pack/alpha/spec/tcc/db}/jpa/TccTxEvent.java    |   3 +-
 .../spec/tcc/db}/jpa/TccTxEventDBRepository.java   |   3 +-
 .../pack/alpha/spec/tcc/db}/jpa/TccTxType.java     |   2 +-
 .../tcc/db/metrics/AlphaMetricsEndpointImpl.java}  |   8 +-
 .../alpha/spec/tcc/db}/metrics/MetricsService.java |   2 +-
 .../tcc/db/properties/SpecTccDbProperties.java     |  32 +++-
 .../tcc/db}/service/MemoryTxEventRepository.java   |  17 +-
 .../spec/tcc/db}/service/RDBTxEventRepository.java |  23 +--
 .../spec/tcc/db}/service/TccEventScanner.java      |   2 +-
 .../spec/tcc/db}/service/TccTxEventRepository.java |  11 +-
 .../spec/tcc/db}/service/TccTxEventService.java    |  15 +-
 .../spec/tcc/db/test}/AlphaTccEventController.java |  13 +-
 .../src/main/resources/META-INF/spring.factories   |   4 +-
 .../alpha/ui/controller/TransactionController.java |   4 +-
 alpha/pom.xml                                      |   5 +-
 demo/tcc-spring-demo/inventory/pom.xml             |   5 +-
 .../inventory}/EclipseLinkJpaConfiguration.java    |   5 +-
 .../inventory/src/main/resources/application.yaml  |   4 +
 .../ordering/src/main/resources/application.yaml   |   5 +
 demo/tcc-spring-demo/payment/pom.xml               |   5 +-
 .../demo/payment}/EclipseLinkJpaConfiguration.java |   5 +-
 .../payment/src/main/resources/application.yaml    |   6 +-
 .../explicit-transaction-context-tests/pom.xml     |   9 +-
 .../EclipseLinkJpaConfiguration.java               |   5 +-
 .../ExplicitTransactionContextIT.java              |   4 +-
 integration-tests/pack-tests/pom.xml               |  15 +-
 .../resttemplate}/EclipseLinkJpaConfiguration.java |   5 +-
 .../integration/tests/resttemplate/PackIT.java     |   4 +-
 .../omega/spring/OmegaSpringAutoConfiguration.java |   4 +-
 .../pack/omega/spring/OmegaSpringConfig.java       | 101 ++---------
 ...SpringConfig.java => OmegaTccSpringConfig.java} | 103 ++---------
 omega/omega-spring-tx/pom.xml                      |   8 +-
 .../spring/TransactionAspectConfig.java            |   9 +
 .../spring/CompensableAnnotationCheckingTest.java  |   9 +-
 .../spring}/EclipseLinkJpaConfiguration.java       |   5 +-
 .../transaction/spring/TccInterceptorTest.java     |   5 +-
 .../spring/TransactionInterceptionTest.java        |   3 +-
 pack-dependencies/pom.xml                          |  19 +-
 pom.xml                                            |   1 -
 195 files changed, 1568 insertions(+), 1261 deletions(-)

diff --git a/.github/workflows/master-pr-build.yaml b/.github/workflows/master-pr-build.yaml
index 59453b22..88e9066f 100644
--- a/.github/workflows/master-pr-build.yaml
+++ b/.github/workflows/master-pr-build.yaml
@@ -54,7 +54,7 @@ jobs:
         run: git log -n1
       - name: Build and test
         if: ${{ success() }}
-        run: ./mvnw clean install -B -Pdocker
+        run: ./mvnw clean install -Pdocker -B
       - name: Upload unit test results
         if: ${{ failure() }}
         uses: actions/upload-artifact@v2
@@ -64,7 +64,7 @@ jobs:
           if-no-files-found: ignore
       - name: Verify demo
         if: ${{ success() }}
-        run: ./mvnw clean verify -B -f demo -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs
+        run: ./mvnw clean verify -f demo -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs -B
       - name: Verify Acceptance tests
         if: ${{ success() }}
-        run: ./mvnw clean verify -B -f acceptance-tests -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs
+        run: ./mvnw clean verify -f acceptance-tests -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs -B
diff --git a/acceptance-tests/acceptance-pack-akka-spring-demo/pom.xml b/acceptance-tests/acceptance-pack-akka-spring-demo/pom.xml
index 8faed9a2..e48816b6 100644
--- a/acceptance-tests/acceptance-pack-akka-spring-demo/pom.xml
+++ b/acceptance-tests/acceptance-pack-akka-spring-demo/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-akka-spring</artifactId>
+  <artifactId>acceptance-pack-akka-spring-demo</artifactId>
   <name>Pack:Acceptance Tests::Akka Spring</name>
 
   <dependencies>
@@ -51,29 +51,6 @@
             <artifactId>docker-maven-plugin</artifactId>
             <configuration>
               <images>
-                <image>
-                  <name>postgres</name>
-                  <alias>postgres</alias>
-                  <run>
-                    <env>
-                      <POSTGRES_DB>saga</POSTGRES_DB>
-                      <POSTGRES_USER>saga</POSTGRES_USER>
-                      <POSTGRES_PASSWORD>password</POSTGRES_PASSWORD>
-                    </env>
-                    <wait>
-                      <log>database system is ready to accept connections</log>
-                      <tcp>
-                        <ports>
-                          <port>5432</port>
-                        </ports>
-                      </tcp>
-                      <time>60000</time>
-                    </wait>
-                    <ports>
-                      <port>postgres.port:5432</port>
-                    </ports>
-                  </run>
-                </image>
                 <image>
                   <name>elasticsearch:7.17.1</name>
                   <alias>elasticsearch</alias>
@@ -102,15 +79,13 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
-                      <alpha.feature.akka.enabled>true</alpha.feature.akka.enabled>
-                      <alpha.feature.akka.transaction.repository.type>elasticsearch</alpha.feature.akka.transaction.repository.type>
-                      <spring.elasticsearch.rest.uris>http://elasticsearch.servicecomb.io:9200</spring.elasticsearch.rest.uris>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-akka</alpha.spec.names>
+                      <alpha.spec.saga.akka.channel.name>memory</alpha.spec.saga.akka.channel.name>
+                      <alpha.spec.saga.akka.repository.name>elasticsearch</alpha.spec.saga.akka.repository.name>
+                      <alpha.spec.saga.akka.repository.elasticsearch.uris>http://elasticsearch.servicecomb.io:9200</alpha.spec.saga.akka.repository.elasticsearch.uris>
                     </env>
                     <links>
-                      <link>postgres:postgresql.servicecomb.io</link>
                       <link>elasticsearch:elasticsearch.servicecomb.io</link>
                     </links>
                     <wait>
@@ -128,7 +103,6 @@
                       <port>alpha.rest.port:8090</port>
                     </ports>
                     <dependsOn>
-                      <container>postgres</container>
                       <container>elasticsearch</container>
                     </dependsOn>
                   </run>
@@ -142,6 +116,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -174,6 +149,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -206,6 +182,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
diff --git a/acceptance-tests/acceptance-pack-cluster-spring-demo/pom.xml b/acceptance-tests/acceptance-pack-cluster-spring-demo/pom.xml
index 2f7c8615..ce15e976 100644
--- a/acceptance-tests/acceptance-pack-cluster-spring-demo/pom.xml
+++ b/acceptance-tests/acceptance-pack-cluster-spring-demo/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-cluster-spring</artifactId>
+  <artifactId>acceptance-pack-cluster-spring-demo</artifactId>
   <name>Pack:Acceptance Tests::Cluster Spring</name>
 
   <dependencies>
@@ -81,11 +81,10 @@
                   <alias>alpha-1</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                       <alpha.server.port>8080</alpha.server.port>
-                      <alpha.cluster.master.enabled>true</alpha.cluster.master.enabled>
+                      <alpha.spec.sagaa.db.cluster.enabled>true</alpha.spec.sagaa.db.cluster.enabled>
                       <management.endpoints.web.exposure.include>*</management.endpoints.web.exposure.include>
                       <management.endpoint.shutdown.enabled>true</management.endpoint.shutdown.enabled>
                     </env>
@@ -116,12 +115,11 @@
                   <alias>alpha-2</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                         -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                       <alpha.server.port>8081</alpha.server.port>
                       <server.port>8091</server.port>
-                      <alpha.cluster.master.enabled>true</alpha.cluster.master.enabled>
+                      <alpha.spec.sagaa.db.cluster.enabled>true</alpha.spec.sagaa.db.cluster.enabled>
                       <management.endpoints.web.exposure.include>*</management.endpoints.web.exposure.include>
                       <management.endpoint.shutdown.enabled>true</management.endpoint.shutdown.enabled>
                     </env>
@@ -156,6 +154,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <alpha.cluster.address>alpha-server-1.servicecomb.io:8080,alpha-server-2.servicecomb.io:8081</alpha.cluster.address>
                     </env>
                     <wait>
@@ -191,6 +190,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <alpha.cluster.address>alpha-server-1.servicecomb.io:8080,alpha-server-2.servicecomb.io:8081</alpha.cluster.address>
                     </env>
                     <wait>
@@ -226,6 +226,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <alpha.cluster.address>alpha-server-1.servicecomb.io:8080,alpha-server-2.servicecomb.io:8081</alpha.cluster.address>
                       <alpha.rest.address>http://alpha-server-1.servicecomb.io:8090,http://alpha-server-2.servicecomb.io:8091</alpha.rest.address>
                     </env>
diff --git a/acceptance-tests/acceptance-pack-dubbo-demo/pom.xml b/acceptance-tests/acceptance-pack-dubbo-demo/pom.xml
index 4869e18a..54c0d39a 100644
--- a/acceptance-tests/acceptance-pack-dubbo-demo/pom.xml
+++ b/acceptance-tests/acceptance-pack-dubbo-demo/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <name>Pack:Acceptance Tests::Dubbo</name>
-  <artifactId>acceptance-pack-dubbo</artifactId>
+  <artifactId>acceptance-pack-dubbo-demo</artifactId>
 
   <dependencies>
     <dependency>
@@ -88,9 +88,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                     </env>
                     <links>
                       <link>postgres:postgresql.servicecomb.io</link>
@@ -129,6 +128,7 @@
                         -Dalpha.cluster.address=alpha-server.servicecomb.io:8080
                         -Dspring.datasource.initialization-mode=always
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -169,6 +169,7 @@
                         -Dalpha.cluster.address=alpha-server.servicecomb.io:8080
                         -Dspring.datasource.initialization-mode=always
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -209,6 +210,7 @@
                         -Dalpha.cluster.address=alpha-server.servicecomb.io:8080
                         -Dspring.datasource.initialization-mode=always
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
diff --git a/acceptance-tests/acceptance-pack-spring-demo-with-consul/pom.xml b/acceptance-tests/acceptance-pack-spring-demo-with-consul/pom.xml
index c425582a..9d255669 100644
--- a/acceptance-tests/acceptance-pack-spring-demo-with-consul/pom.xml
+++ b/acceptance-tests/acceptance-pack-spring-demo-with-consul/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-spring-with-consul</artifactId>
+  <artifactId>acceptance-pack-spring-demo-with-consul</artifactId>
   <name>Pack:Acceptance Tests::Spring with consul</name>
 
   <dependencies>
@@ -98,9 +98,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                       <spring.cloud.consul.enabled>true</spring.cloud.consul.enabled>
                       <spring.cloud.consul.host>consul.servicecomb.io</spring.cloud.consul.host>
                       <spring.cloud.consul.port>8500</spring.cloud.consul.port>
@@ -139,6 +138,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.consul.enabled>true</spring.cloud.consul.enabled>
                       <alpha.cluster.address></alpha.cluster.address>
                       <alpha.cluster.register.type>consul</alpha.cluster.register.type>
@@ -178,6 +178,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.consul.enabled>true</spring.cloud.consul.enabled>
                       <alpha.cluster.address></alpha.cluster.address>
                       <alpha.cluster.register.type>consul</alpha.cluster.register.type>
@@ -217,6 +218,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.consul.enabled>true</spring.cloud.consul.enabled>
                       <alpha.cluster.address></alpha.cluster.address>
                       <alpha.cluster.register.type>consul</alpha.cluster.register.type>
diff --git a/acceptance-tests/acceptance-pack-spring-demo-with-nacos/pom.xml b/acceptance-tests/acceptance-pack-spring-demo-with-nacos/pom.xml
index 4b03b152..3b3e2dc0 100644
--- a/acceptance-tests/acceptance-pack-spring-demo-with-nacos/pom.xml
+++ b/acceptance-tests/acceptance-pack-spring-demo-with-nacos/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-spring-with-nacos</artifactId>
+  <artifactId>acceptance-pack-spring-demo-with-nacos</artifactId>
   <name>Pack:Acceptance Tests::Spring with nacos</name>
 
   <dependencies>
@@ -60,7 +60,7 @@
                       <MODE>standalone</MODE>
                     </env>
                     <wait>
-                      <log>Completed initialization in</log>
+                      <log>Nacos started successfully</log>
                       <tcp>
                         <ports>
                           <port>8848</port>
@@ -101,9 +101,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                       <spring.cloud.nacos.discovery.enabled>true</spring.cloud.nacos.discovery.enabled>
                       <spring.cloud.nacos.discovery.serverAddr>nacos.servicecomb.io:8848</spring.cloud.nacos.discovery.serverAddr>
                       <nacos.client.enabled>true</nacos.client.enabled>
@@ -140,6 +139,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.nacos.discovery.enabled>true</spring.cloud.nacos.discovery.enabled>
                       <alpha.cluster.register.type>nacos</alpha.cluster.register.type>
                       <spring.cloud.nacos.discovery.serverAddr>nacos.servicecomb.io:8848</spring.cloud.nacos.discovery.serverAddr>
@@ -176,6 +176,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.nacos.discovery.enabled>true</spring.cloud.nacos.discovery.enabled>
                       <alpha.cluster.register.type>nacos</alpha.cluster.register.type>
                       <spring.cloud.nacos.discovery.serverAddr>nacos.servicecomb.io:8848</spring.cloud.nacos.discovery.serverAddr>
@@ -212,6 +213,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.nacos.discovery.enabled>true</spring.cloud.nacos.discovery.enabled>
                       <alpha.cluster.register.type>nacos</alpha.cluster.register.type>
                       <spring.cloud.nacos.discovery.serverAddr>nacos.servicecomb.io:8848</spring.cloud.nacos.discovery.serverAddr>
diff --git a/acceptance-tests/acceptance-pack-spring-demo-with-zookeeper/pom.xml b/acceptance-tests/acceptance-pack-spring-demo-with-zookeeper/pom.xml
index 2e7c5d5b..b8b31515 100644
--- a/acceptance-tests/acceptance-pack-spring-demo-with-zookeeper/pom.xml
+++ b/acceptance-tests/acceptance-pack-spring-demo-with-zookeeper/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-spring-with-zookeeper</artifactId>
+  <artifactId>acceptance-pack-spring-demo-with-zookeeper</artifactId>
   <name>Pack:Acceptance Tests::Spring with zookeeper</name>
 
   <dependencies>
@@ -98,9 +98,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                       <spring.cloud.zookeeper.enabled>true</spring.cloud.zookeeper.enabled>
                       <spring.cloud.zookeeper.connectString>zookeeper.servicecomb.io:2181</spring.cloud.zookeeper.connectString>
                       <spring.cloud.zookeeper.discovery.preferIpAddress>true</spring.cloud.zookeeper.discovery.preferIpAddress>
@@ -138,6 +137,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.zookeeper.enabled>true</spring.cloud.zookeeper.enabled>
                       <alpha.cluster.register.type>zookeeper</alpha.cluster.register.type>
                       <spring.cloud.zookeeper.connectString>zookeeper.servicecomb.io:2181</spring.cloud.zookeeper.connectString>
@@ -176,6 +176,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.zookeeper.enabled>true</spring.cloud.zookeeper.enabled>
                       <alpha.cluster.register.type>zookeeper</alpha.cluster.register.type>
                       <spring.cloud.zookeeper.connectString>zookeeper.servicecomb.io:2181</spring.cloud.zookeeper.connectString>
@@ -213,6 +214,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                       <spring.cloud.zookeeper.enabled>true</spring.cloud.zookeeper.enabled>
                       <alpha.cluster.register.type>zookeeper</alpha.cluster.register.type>
                       <spring.cloud.zookeeper.connectString>zookeeper.servicecomb.io:2181</spring.cloud.zookeeper.connectString>
diff --git a/acceptance-tests/acceptance-pack-spring-demo/pom.xml b/acceptance-tests/acceptance-pack-spring-demo/pom.xml
index 09c61821..e7b360c2 100644
--- a/acceptance-tests/acceptance-pack-spring-demo/pom.xml
+++ b/acceptance-tests/acceptance-pack-spring-demo/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>acceptance-pack-spring</artifactId>
+  <artifactId>acceptance-pack-spring-demo</artifactId>
   <name>Pack:Acceptance Tests::Spring</name>
 
   <dependencies>
@@ -80,9 +80,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
                     </env>
                     <links>
                       <link>postgres:postgresql.servicecomb.io</link>
@@ -115,6 +114,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9092,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -147,6 +147,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9093,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -179,6 +180,7 @@
                         -Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
                         -javaagent:/maven/saga/byteman.jar=port:9091,address:0.0.0.0,listener:true
                       </JAVA_OPTS>
+                      <omega.spec.names>saga</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
diff --git a/acceptance-tests/acceptance-pack-tcc-spring-demo/pom.xml b/acceptance-tests/acceptance-pack-tcc-spring-demo/pom.xml
index e29b90c2..0f2ca471 100644
--- a/acceptance-tests/acceptance-pack-tcc-spring-demo/pom.xml
+++ b/acceptance-tests/acceptance-pack-tcc-spring-demo/pom.xml
@@ -80,9 +80,8 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd,test
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd,test</spring.profiles.active>
+                      <alpha.spec.names>tcc-db</alpha.spec.names>
                     </env>
                     <links>
                       <link>postgres:postgresql.servicecomb.io</link>
@@ -111,9 +110,8 @@
                   <alias>inventory</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd</spring.profiles.active>
+                      <omega.spec.names>tcc</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -140,9 +138,8 @@
                   <alias>payment</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd
-                      </JAVA_OPTS>
+                      <spring.profiles.active>prd</spring.profiles.active>
+                      <omega.spec.names>tcc</omega.spec.names>
                     </env>
                     <wait>
                       <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
@@ -177,6 +174,9 @@
                       </tcp>
                       <time>120000</time>
                     </wait>
+                    <env>
+                      <omega.spec.names>tcc</omega.spec.names>
+                    </env>
                     <links>
                       <link>alpha:alpha-server.servicecomb.io</link>
                       <link>inventory:inventory.servicecomb.io</link>
diff --git a/alpha/alpha-benchmark/pom.xml b/alpha/alpha-benchmark/pom.xml
index 617a6afe..7162cef9 100644
--- a/alpha/alpha-benchmark/pom.xml
+++ b/alpha/alpha-benchmark/pom.xml
@@ -36,7 +36,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>alpha-fsm</artifactId>
+      <artifactId>alpha-spec-saga-fsm</artifactId>
       <exclusions>
         <exclusion>
           <artifactId>log4j-slf4j-impl</artifactId>
diff --git a/alpha/alpha-benchmark/src/main/java/org/apache/servicecomb/pack/alpha/benchmark/Application.java b/alpha/alpha-benchmark/src/main/java/org/apache/servicecomb/pack/alpha/benchmark/Application.java
index bff689d1..bf8b33f7 100644
--- a/alpha/alpha-benchmark/src/main/java/org/apache/servicecomb/pack/alpha/benchmark/Application.java
+++ b/alpha/alpha-benchmark/src/main/java/org/apache/servicecomb/pack/alpha/benchmark/Application.java
@@ -56,6 +56,7 @@ public class Application implements CommandLineRunner {
       printHelp();
       System.exit(0);
     }
+    System.setProperty("omega.spec.names","saga");
     SpringApplication.run(Application.class, args);
   }
 
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
index 67ebcc50..4dfc72a2 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
@@ -33,7 +33,7 @@ public interface APIv1 {
   PagingGlobalTransactions getTransactions(String state, int page, int size)
       throws Exception;
 
-  Map<String, Long> getTransactionStatistics();
+  Map<String, Long> getTransactionStatistics() throws Exception;
 
-  List<GlobalTransaction> getSlowTransactions(int size);
+  List<GlobalTransaction> getSlowTransactions(int size) throws Exception;
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/metrics/AlphaMetricsEndpoint.java
old mode 100755
new mode 100644
similarity index 78%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
copy to alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/metrics/AlphaMetricsEndpoint.java
index 1622f139..4c444830
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/metrics/AlphaMetricsEndpoint.java
@@ -15,8 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
+package org.apache.servicecomb.pack.alpha.core.metrics;
 
-public interface Lock {
-  void unlock();
+import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
+
+public interface AlphaMetricsEndpoint {
+
+  MetricsBean getMetrics();
+
+  TypeEnum getNodeType();
 }
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/FsmAutoConfiguration.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/FsmAutoConfiguration.java
deleted file mode 100644
index aeef9238..00000000
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/FsmAutoConfiguration.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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.servicecomb.pack.alpha.fsm;
-
-import static org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER;
-import static org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SpringAkkaExtension.SPRING_EXTENSION_PROVIDER;
-
-import akka.actor.ActorRef;
-import akka.actor.ActorSystem;
-import akka.actor.Props;
-import com.typesafe.config.Config;
-import com.typesafe.config.ConfigFactory;
-import java.util.Map;
-import javax.annotation.PostConstruct;
-import org.apache.servicecomb.pack.alpha.fsm.channel.kafka.KafkaChannelAutoConfiguration;
-import org.apache.servicecomb.pack.alpha.fsm.channel.memory.MemoryChannelAutoConfiguration;
-import org.apache.servicecomb.pack.alpha.fsm.channel.rabbit.RabbitChannelAutoConfiguration;
-import org.apache.servicecomb.pack.alpha.fsm.channel.redis.RedisChannelAutoConfiguration;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.fsm.repository.NoneTransactionRepository;
-import org.apache.servicecomb.pack.alpha.fsm.repository.channel.DefaultTransactionRepositoryChannel;
-import org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch.ElasticsearchTransactionRepository;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepositoryChannel;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.AkkaConfigPropertyAdapter;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
-
-@Configuration
-@ImportAutoConfiguration({
-    MemoryChannelAutoConfiguration.class,
-    KafkaChannelAutoConfiguration.class,
-    RedisChannelAutoConfiguration.class, RabbitChannelAutoConfiguration.class})
-@ConditionalOnProperty(value = {"alpha.feature.akka.enabled"})
-public class FsmAutoConfiguration {
-
-  // TODO
-  //  Size of bulk request, When this value is greater than 0, the batch data will be lost when the jvm crashes.
-  //  In the future, we can use Kafka to solve this problem instead of storing it directly in the ES.
-  @Value("${alpha.feature.akka.transaction.repository.elasticsearch.batchSize:100}")
-  int repositoryElasticsearchBatchSize;
-
-  @Value("${alpha.feature.akka.transaction.repository.elasticsearch.refreshTime:5000}")
-  int repositoryElasticsearchRefreshTime;
-
-  @PostConstruct
-  void init() {
-    System.setProperty("es.set.netty.runtime.available.processors", "false");
-  }
-
-  @Bean
-  public ActorSystem actorSystem(ConfigurableApplicationContext applicationContext,
-      ConfigurableEnvironment environment, MetricsService metricsService,
-      TransactionRepositoryChannel repositoryChannel) {
-    ActorSystem system = ActorSystem
-        .create("alpha-cluster", akkaConfiguration(applicationContext, environment));
-
-    SPRING_EXTENSION_PROVIDER.get(system).initialize(applicationContext);
-    SAGA_DATA_EXTENSION_PROVIDER.get(system).setRepositoryChannel(repositoryChannel);
-    SAGA_DATA_EXTENSION_PROVIDER.get(system).setMetricsService(metricsService);
-    return system;
-  }
-
-  @Bean
-  public Config akkaConfiguration(ConfigurableApplicationContext applicationContext,
-      ConfigurableEnvironment environment) {
-    final Map<String, Object> converted = AkkaConfigPropertyAdapter.getPropertyMap(environment);
-    return ConfigFactory.parseMap(converted)
-        .withFallback(ConfigFactory.defaultReference(applicationContext.getClassLoader()));
-  }
-
-  @Bean
-  public MetricsService metricsService() {
-    return new MetricsService();
-  }
-
-  @Bean(name = "sagaShardRegionActor")
-  public ActorRef sagaShardRegionActor(ActorSystem actorSystem) {
-    return actorSystem.actorOf(Props.create(SagaShardRegionActor.class));
-  }
-
-  @Bean
-  @ConditionalOnMissingBean(TransactionRepository.class)
-  public TransactionRepository transactionRepository() {
-    return new NoneTransactionRepository();
-  }
-
-  @Bean
-  @ConditionalOnProperty(value = "alpha.feature.akka.transaction.repository.type", havingValue = "elasticsearch")
-  public TransactionRepository transactionRepository(MetricsService metricsService,
-      ElasticsearchRestTemplate template) {
-    return new ElasticsearchTransactionRepository(template, metricsService,
-        repositoryElasticsearchBatchSize, repositoryElasticsearchRefreshTime);
-  }
-
-  @Bean
-  TransactionRepositoryChannel memoryTransactionRepositoryChannel(TransactionRepository repository,
-      MetricsService metricsService) {
-    return new DefaultTransactionRepositoryChannel(repository, metricsService);
-  }
-
-}
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryChannelAutoConfiguration.java b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryChannelAutoConfiguration.java
deleted file mode 100644
index 7ad7878f..00000000
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryChannelAutoConfiguration.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.servicecomb.pack.alpha.fsm.channel.memory;
-
-import akka.actor.ActorRef;
-import akka.actor.ActorSystem;
-import java.lang.invoke.MethodHandles;
-import javax.annotation.PostConstruct;
-import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConditionalOnProperty(value = "alpha.feature.akka.channel.type", havingValue = "memory", matchIfMissing = true)
-public class MemoryChannelAutoConfiguration {
-
-  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  @Value("${alpha.feature.akka.channel.memory.size:-1}")
-  int memoryEventChannelMemorySize;
-
-  @PostConstruct
-  public void init(){
-    LOG.info("Memory Channel Init");
-  }
-
-  @Bean(name = "memoryEventChannel")
-  @ConditionalOnMissingBean(ActorEventChannel.class)
-  public ActorEventChannel memoryEventChannel(MetricsService metricsService) {
-    return new MemoryActorEventChannel(metricsService, memoryEventChannelMemorySize);
-  }
-
-  @Bean
-  MemorySagaEventConsumer sagaEventMemoryConsumer(ActorSystem actorSystem,
-      @Qualifier("sagaShardRegionActor") ActorRef sagaShardRegionActor,
-      MetricsService metricsService,
-      @Qualifier("memoryEventChannel") ActorEventChannel actorEventChannel) {
-    return new MemorySagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
-        (MemoryActorEventChannel) actorEventChannel);
-  }
-}
\ No newline at end of file
diff --git a/persistence/persistence-jpa/pom.xml b/alpha/alpha-persistence-jpa/pom.xml
similarity index 94%
rename from persistence/persistence-jpa/pom.xml
rename to alpha/alpha-persistence-jpa/pom.xml
index e4d8ea5c..64868cc7 100644
--- a/persistence/persistence-jpa/pom.xml
+++ b/alpha/alpha-persistence-jpa/pom.xml
@@ -20,14 +20,14 @@
   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>
+    <artifactId>alpha</artifactId>
     <groupId>org.apache.servicecomb.pack</groupId>
     <version>0.7.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <name>Pack::Persistence::JPA</name>
-  <artifactId>persistence-jpa</artifactId>
+  <artifactId>alpha-persistence-jpa</artifactId>
+  <name>Pack::Alpha::Persistence::JPA</name>
 
   <dependencies>
     <dependency>
@@ -42,6 +42,7 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jdbc</artifactId>
     </dependency>
+
     <dependency>
       <groupId>javax.transaction</groupId>
       <artifactId>javax.transaction-api</artifactId>
@@ -74,5 +75,4 @@
       </plugin>
     </plugins>
   </build>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/alpha/alpha-server/pom.xml b/alpha/alpha-server/pom.xml
index 9b86862d..663a56a2 100644
--- a/alpha/alpha-server/pom.xml
+++ b/alpha/alpha-server/pom.xml
@@ -48,7 +48,15 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>alpha-fsm</artifactId>
+      <artifactId>alpha-spec-saga-fsm</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>alpha-spec-saga-db</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>alpha-spec-tcc-db</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
@@ -90,15 +98,6 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-log4j2</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <scope>runtime</scope>
-    </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
@@ -148,7 +147,6 @@
     <dependency>
       <groupId>org.hsqldb</groupId>
       <artifactId>hsqldb</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.awaitility</groupId>
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaConfig.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaConfig.java
index 57302aa8..7ef7686f 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaConfig.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaConfig.java
@@ -17,8 +17,9 @@
 
 package org.apache.servicecomb.pack.alpha.server;
 
+import com.google.common.eventbus.EventBus;
+import io.grpc.BindableService;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
@@ -28,35 +29,24 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledExecutorService;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
-
-import com.google.common.eventbus.EventBus;
-import org.apache.servicecomb.pack.alpha.core.*;
-import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
-import org.apache.servicecomb.pack.alpha.server.fsm.GrpcSagaEventService;
-import org.apache.servicecomb.pack.alpha.server.tcc.GrpcTccEventService;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.TccPendingTaskRunner;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccEventScanner;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventService;
-import org.apache.servicecomb.pack.common.AlphaMetaKeys;
-import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.servicecomb.pack.alpha.core.CompositeOmegaCallback;
+import org.apache.servicecomb.pack.alpha.core.NodeStatus;
+import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
+import org.apache.servicecomb.pack.alpha.core.PendingTaskRunner;
+import org.apache.servicecomb.pack.alpha.core.PushBackOmegaCallback;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import io.grpc.BindableService;
-
 @EntityScan(basePackages = "org.apache.servicecomb.pack.alpha")
 @Configuration
 public class AlphaConfig {
-  private static final Logger LOG = LoggerFactory.getLogger(AlphaConfig.class);
+
   private final BlockingQueue<Runnable> pendingCompensations = new LinkedBlockingQueue<>();
   private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 
@@ -89,21 +79,6 @@ public class AlphaConfig {
   OmegaCallback omegaCallback(Map<String, Map<String, OmegaCallback>> callbacks) {
     return new PushBackOmegaCallback(pendingCompensations, new CompositeOmegaCallback(callbacks));
   }
-  
-  @Bean
-  TxEventRepository springTxEventRepository(TxEventEnvelopeRepository eventRepo) {
-    return new SpringTxEventRepository(eventRepo);
-  }
-
-  @Bean
-  CommandRepository springCommandRepository(TxEventEnvelopeRepository eventRepo, CommandEntityRepository commandRepository) {
-    return new SpringCommandRepository(eventRepo, commandRepository);
-  }
-
-  @Bean
-  TxTimeoutRepository springTxTimeoutRepository(TxTimeoutEntityRepository timeoutRepo) {
-    return new SpringTxTimeoutRepository(timeoutRepo);
-  }
 
   @Bean
   ScheduledExecutorService compensationScheduler() {
@@ -111,98 +86,21 @@ public class AlphaConfig {
   }
 
   @Bean
-  NodeStatus nodeStatus (){
-    if(masterEnabled){
+  NodeStatus nodeStatus() {
+    if (masterEnabled) {
       return new NodeStatus(NodeStatus.TypeEnum.SLAVE);
-    }else{
+    } else {
       return new NodeStatus(NodeStatus.TypeEnum.MASTER);
     }
   }
 
   @Bean
-  TxConsistentService txConsistentService(
-      @Value("${alpha.event.pollingInterval:500}") int eventPollingInterval,
-      @Value("${alpha.event.scanner.enabled:true}") boolean eventScannerEnabled,
-      ScheduledExecutorService scheduler,
-      TxEventRepository eventRepository,
-      CommandRepository commandRepository,
-      TxTimeoutRepository timeoutRepository,
-      OmegaCallback omegaCallback,
-      NodeStatus nodeStatus) {
-        if (eventScannerEnabled) {
-          new EventScanner(scheduler,
-              eventRepository, commandRepository, timeoutRepository,
-              omegaCallback, eventPollingInterval, nodeStatus).run();
-          LOG.info("Starting the EventScanner.");
-          }
-        TxConsistentService consistentService = new TxConsistentService(eventRepository);
-        return consistentService;
-  }
-
-  @Bean
-  TccPendingTaskRunner tccPendingTaskRunner() {
-    return new TccPendingTaskRunner(delay);
-  }
-
-  @Bean
-  @ConditionalOnProperty(name = "alpha.feature.tcc.enabled", havingValue = "true", matchIfMissing = true)
-  GrpcTccEventService grpcTccEventService(TccTxEventService tccTxEventService, TccPendingTaskRunner tccPendingTaskRunner, TccEventScanner tccEventScanner) {
-    // start the service which are needed for TCC
-    tccPendingTaskRunner.start();
-    tccEventScanner.start();
-    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
-      tccPendingTaskRunner.shutdown();
-      tccEventScanner.shutdown();
-    }));
-    return new GrpcTccEventService(tccTxEventService);
-  }
-
-  @Bean
-  TccEventScanner tccEventScanner(TccTxEventService tccTxEventService) {
-    return new TccEventScanner(tccTxEventService, delay, globalTxTimeoutSeconds);
-  }
-
-
-  @Bean()
-  @ConditionalOnProperty(name = "alpha.feature.akka.enabled", havingValue = "false", matchIfMissing = true)
-  ServerStartable serverStartable(GrpcServerConfig serverConfig, TxConsistentService txConsistentService,
-      Map<String, Map<String, OmegaCallback>> omegaCallbacks, @Autowired(required = false) GrpcTccEventService grpcTccEventService,
-      @Qualifier("alphaEventBus") EventBus eventBus) throws IOException {
-    ServerMeta serverMeta = ServerMeta.newBuilder()
-        .putMeta(AlphaMetaKeys.AkkaEnabled.name(), String.valueOf(false)).build();
-    List<BindableService> bindableServices = new ArrayList();
-    bindableServices.add(new GrpcTxEventEndpointImpl(txConsistentService, omegaCallbacks, serverMeta));
-    if (grpcTccEventService != null) {
-      LOG.info("alpha.feature.tcc.enable=true, starting the TCC service.");
-      bindableServices.add(grpcTccEventService);
-    } else {
-      LOG.info("alpha.feature.tcc.enable=false, the TCC service is disabled.");
-    }
+  ServerStartable serverStartableWithAkka(GrpcServerConfig serverConfig,
+      @Qualifier("alphaEventBus") EventBus eventBus, List<BindableService> bindableServices)
+      throws IOException {
     ServerStartable bootstrap = new GrpcStartable(serverConfig, eventBus,
         bindableServices.toArray(new BindableService[0]));
     new Thread(bootstrap::start).start();
-    LOG.info("alpha.feature.akka.enabled=false, starting the saga db service");
-    return bootstrap;
-  }
-
-  @Bean
-  @ConditionalOnProperty(name= "alpha.feature.akka.enabled", havingValue = "true")
-  ServerStartable serverStartableWithAkka(GrpcServerConfig serverConfig,
-      Map<String, Map<String, OmegaCallback>> omegaCallbacks, @Autowired(required = false) GrpcTccEventService grpcTccEventService,
-      @Qualifier("alphaEventBus") EventBus eventBus, ActorEventChannel actorEventChannel) throws IOException {
-    ServerMeta serverMeta = ServerMeta.newBuilder()
-        .putMeta(AlphaMetaKeys.AkkaEnabled.name(), String.valueOf(true)).build();
-    List<BindableService> bindableServices = new ArrayList();
-    bindableServices.add(new GrpcSagaEventService(actorEventChannel, omegaCallbacks, serverMeta));
-    if (grpcTccEventService != null) {
-      LOG.info("alpha.feature.tcc.enable=true, starting the TCC service.");
-      bindableServices.add(grpcTccEventService);
-    } else {
-      LOG.info("alpha.feature.tcc.enable=false, the TCC service is disabled.");
-    }
-    ServerStartable bootstrap = new GrpcStartable(serverConfig, eventBus, bindableServices.toArray(new BindableService[0]));
-    new Thread(bootstrap::start).start();
-    LOG.info("alpha.feature.akka.enabled=true, starting the saga akka service.");
     return bootstrap;
   }
 
diff --git a/alpha/alpha-server/src/main/resources/application.yaml b/alpha/alpha-server/src/main/resources/application.yaml
index 40b010ba..059a5964 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -22,21 +22,59 @@ alpha:
   server:
     host: ${server.host}
     port: 8080
+  spec:
+    names: saga-db
+    saga:
+      akka:
+        channel:
+          name: memory
+          memory:
+            max-length: -1
+          kafka:
+            topic: servicecomb-pack-actor-event
+            bootstrap-servers: 127.0.0.1:9092
+            consumer:
+              group-id: servicecomb-pack
+              auto.offset.reset: earliest
+            producer:
+              batch-size: 16384
+              retries: 0
+              buffer.memory: 33554432
+        repository:
+          name: elasticsearch
+          elasticsearch:
+            uris: http://localhost:9200
+            batch-size: 100
+            refresh-time: 5000
+      db:
+        datasource:
+          username: sa
+          password:
+          url: jdbc:hsqldb:mem:saga
+          initialization-mode: always
+        cluster:
+          enabled: true
+          type: jdbc
+          expire: 5000
+    tcc:
+      db:
+        memory-mode: true
+        datasource:
+          username: sa
+          password:
+          url: jdbc:hsqldb:mem:saga
+          initialization-mode: always
+
   feature:
     nativetransport: false # Default disabled Netty Native Transport
-    akka:
-      enabled: false
-      channel:
-        type: memory
-      transaction:
-        repository:
-          type: elasticsearch
 
 spring:
-  datasource:
-    initialization-mode: always
   main:
     allow-bean-definition-overriding: true
+  jpa:
+    properties:
+      eclipselink:
+        ddl-generation: none
   cloud:
     consul:
       host: 0.0.0.0
@@ -123,17 +161,29 @@ alpha:
 ---
 spring:
   profiles: prd
-  datasource:
-    username: saga
-    password: password
-    url: jdbc:postgresql://postgresql.servicecomb.io:5432/saga?useSSL=false
-    platform: postgresql
-    continue-on-error: false
   jpa:
     properties:
       eclipselink:
         ddl-generation: none
-
+alpha:
+  spec:
+    saga:
+      db:
+        datasource:
+          username: saga
+          password: password
+          url: jdbc:postgresql://postgresql.servicecomb.io:5432/saga?useSSL=false
+          platform: postgresql
+          continue-on-error: false
+    tcc:
+      db:
+        memory-mode: false
+        datasource:
+          username: saga
+          password: password
+          url: jdbc:postgresql://postgresql.servicecomb.io:5432/saga?useSSL=false
+          platform: postgresql
+          continue-on-error: false
 ---
 spring:
   profiles: mysql
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationTest.java
index 523783ff..07994265 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationTest.java
@@ -48,6 +48,9 @@ import java.util.function.Consumer;
 import javax.annotation.PostConstruct;
 
 import org.apache.servicecomb.pack.alpha.core.*;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.CommandEntityRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.TxEventEnvelopeRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.TxTimeoutEntityRepository;
 import org.apache.servicecomb.pack.common.EventType;
 import org.apache.servicecomb.pack.common.AlphaMetaKeys;
 import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationWithRandomPortTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationWithRandomPortTest.java
index 5e05e2d3..6ec5a727 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationWithRandomPortTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaIntegrationWithRandomPortTest.java
@@ -23,6 +23,9 @@ import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.StreamObserver;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.servicecomb.pack.alpha.core.*;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.CommandEntityRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.TxEventEnvelopeRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.TxTimeoutEntityRepository;
 import org.apache.servicecomb.pack.common.EventType;
 import org.apache.servicecomb.pack.contract.grpc.*;
 import org.apache.servicecomb.pack.contract.grpc.TxEventServiceGrpc.TxEventServiceBlockingStub;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/AlphaIntegrationFsmTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java
similarity index 98%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/AlphaIntegrationFsmTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java
index 49966bc4..484bf7a6 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/AlphaIntegrationFsmTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.awaitility.Awaitility.await;
@@ -59,20 +59,17 @@ import org.springframework.test.context.junit4.SpringRunner;
         "alpha.event.pollingInterval=1",
         "spring.main.allow-bean-definition-overriding=true",
         "spring.profiles.active=akka-persistence-mem",
-        //akka
-        "alpha.feature.akka.enabled=true",
-        "alpha.feature.tcc.enabled=false",
-        "alpha.feature.akka.channel.type=memory",
+        // saga-akka
+        "alpha.spec.names=saga-akka",
+        "alpha.spec.saga.akka.channel.name=memory",
+        "alpha.spec.saga.akka.channel.memory.max-length=-1",
+        "alpha.spec.saga.akka.repository.name=elasticsearch",
+        "alpha.spec.saga.akka.repository.elasticsearch.uris=http://localhost:9200",
+        // akka
         "akkaConfig.akka.persistence.journal.plugin=akka.persistence.journal.inmem",
         "akkaConfig.akka.persistence.journal.leveldb.dir=target/example/journal",
         "akkaConfig.akka.persistence.snapshot-store.plugin=akka.persistence.snapshot-store.local",
-        "akkaConfig.akka.persistence.snapshot-store.local.dir=target/example/snapshots",
-        //elasticsearch
-        "alpha.feature.akka.transaction.repository.channel.type=memory",
-        "alpha.feature.akka.transaction.repository.type=elasticsearch",
-        "spring.data.elasticsearch.cluster-name=elasticsearch",
-        "spring.data.elasticsearch.cluster-nodes=localhost:9300",
-        "spring.elasticsearch.rest.uris=http://localhost:9200"
+        "akkaConfig.akka.persistence.snapshot-store.local.dir=target/example/snapshots"
        })
 public class AlphaIntegrationFsmTest {
   private static final OmegaEventSender omegaEventSender = OmegaEventSender.builder().build();
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSagaSimulator.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSagaSimulator.java
similarity index 99%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSagaSimulator.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSagaSimulator.java
index 454f6dfd..2f4e8d6e 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSagaSimulator.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSagaSimulator.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka;
 
 import com.google.protobuf.ByteString;
 import java.util.ArrayList;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSender.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSender.java
similarity index 98%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSender.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSender.java
index da3e6e73..53b1326b 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/fsm/OmegaEventSender.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/OmegaEventSender.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockServiceTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/ClusterLockServiceTest.java
similarity index 91%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockServiceTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/ClusterLockServiceTest.java
index 9644b763..00f5eb2a 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockServiceTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/ClusterLockServiceTest.java
@@ -15,12 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import org.apache.servicecomb.pack.alpha.server.AlphaApplication;
 import org.apache.servicecomb.pack.alpha.server.AlphaConfig;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLockRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.ClusterLockService;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.MasterLockEntityRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLockRepository;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -30,7 +32,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.junit4.SpringRunner;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.MasterLockEntityRepository;
 
 import java.util.Optional;
 
@@ -42,7 +43,7 @@ import static org.mockito.Mockito.when;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {AlphaApplication.class, AlphaConfig.class},
     properties = {
-        "alpha.cluster.master.enabled=true",
+        "alpha.spec.saga.db.cluster.enabled=true",
         "alpha.server.host=0.0.0.0",
         "alpha.server.port=8090",
         "alpha.event.pollingInterval=1",
@@ -57,7 +58,7 @@ public class ClusterLockServiceTest {
   @Value("${spring.application.name:servicecomb-alpha-server}")
   private String serviceName;
 
-  @Value("${alpha.cluster.master.expire:5000}")
+  @Value("${alpha.spec.saga.db.cluster.expire:5000}")
   private int expire;
 
   @Autowired
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventControllerTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccEventControllerTest.java
similarity index 90%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventControllerTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccEventControllerTest.java
index 09c1c9e3..19ecc436 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventControllerTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccEventControllerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static java.util.Collections.singletonList;
@@ -26,9 +26,10 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.test.AlphaTccEventController;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccServerTestBase.java
similarity index 95%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccServerTestBase.java
index 9aada8a6..49203d4f 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaTccServerTestBase.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -32,12 +32,12 @@ import java.util.Queue;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.GrpcOmegaTccCallback;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.GrpcOmegaTccCallback;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallbacksRegistry;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.EventConverter;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventRepository;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.contract.grpc.*;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceBlockingStub;
@@ -96,7 +96,8 @@ public abstract class AlphaTccServerTestBase {
     asyncStub.onConnected(serviceConfig, commandStreamObserver);
     awaitUntilConnected();
     assertThat(
-        OmegaCallbacksRegistry.retrieve(serviceName, instanceId), is(instanceOf(GrpcOmegaTccCallback.class))
+        OmegaCallbacksRegistry.retrieve(serviceName, instanceId), is(instanceOf(
+            GrpcOmegaTccCallback.class))
     );
   }
 
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/MemoryAlphaTccServerTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/MemoryAlphaTccServerTest.java
similarity index 89%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/MemoryAlphaTccServerTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/MemoryAlphaTccServerTest.java
index c0106e83..dfed27b9 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/MemoryAlphaTccServerTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/MemoryAlphaTccServerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import io.grpc.netty.NettyChannelBuilder;
 import org.junit.BeforeClass;
@@ -26,9 +26,11 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TccApplication.class},
     properties = {
+        "alpha.spec.names=tcc-db",
+        "alpha.spec.tcc.db.memory-mode=true",
         "alpha.server.host=0.0.0.0",
         "alpha.server.port=8190",
-        "spring.profiles.active=memory,tccTest"
+        "spring.profiles.active=tccTest"
     })
 public class MemoryAlphaTccServerTest extends AlphaTccServerTestBase {
 
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/RdbAlphaTccServerTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/RdbAlphaTccServerTest.java
similarity index 91%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/RdbAlphaTccServerTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/RdbAlphaTccServerTest.java
index 61661cdc..10dfbbb3 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/RdbAlphaTccServerTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/RdbAlphaTccServerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import io.grpc.netty.NettyChannelBuilder;
 import org.junit.BeforeClass;
@@ -26,6 +26,8 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TccApplication.class},
     properties = {
+        "alpha.spec.names=tcc-db",
+        "alpha.spec.tcc.db.memory-mode=false",
         "alpha.server.host=0.0.0.0",
         "alpha.server.port=8091",
         "spring.profiles.active=tccTest"
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccApplication.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccApplication.java
similarity index 95%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccApplication.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccApplication.java
index abd0f5fb..45d6cc61 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccApplication.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccApplication.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import org.apache.servicecomb.pack.alpha.server.GrpcServerConfig;
 import org.springframework.boot.SpringApplication;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCallbackEngineTest.java
similarity index 90%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCallbackEngineTest.java
index 4d66ff7c..a275a549 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCallbackEngineTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static org.hamcrest.Matchers.is;
@@ -28,12 +28,12 @@ import static org.mockito.Mockito.verify;
 import io.grpc.stub.StreamObserver;
 import java.util.UUID;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.TccCallbackEngine;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventService;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallbacksRegistry;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.TccCallbackEngine;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventService;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
 import org.junit.After;
@@ -47,6 +47,8 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TccApplication.class},
     properties = {
+        "alpha.spec.names=tcc-db",
+        "alpha.spec.tcc.db.memory-mode=true",
         "alpha.server.host=0.0.0.0",
         "alpha.server.port=8092",
         "alpha.compensation.retry.delay=30",
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccConfiguration.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccConfiguration.java
similarity index 90%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccConfiguration.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccConfiguration.java
index 514565c6..10b025fc 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccConfiguration.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccConfiguration.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import com.google.common.eventbus.EventBus;
 import org.apache.servicecomb.pack.alpha.server.GrpcServerConfig;
 import org.apache.servicecomb.pack.alpha.server.GrpcStartable;
 import org.apache.servicecomb.pack.alpha.server.ServerStartable;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.TccPendingTaskRunner;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccEventScanner;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventService;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.TccPendingTaskRunner;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccEventScanner;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventService;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCoordinateCommandStreamObserver.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCoordinateCommandStreamObserver.java
similarity index 97%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCoordinateCommandStreamObserver.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCoordinateCommandStreamObserver.java
index b768de21..c07756e0 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCoordinateCommandStreamObserver.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/TccCoordinateCommandStreamObserver.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import io.grpc.stub.StreamObserver;
 import java.util.Queue;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverterTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverterTest.java
similarity index 95%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverterTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverterTest.java
index a9f2e98b..992d939c 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverterTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverterTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import org.junit.Test;
 import static org.hamcrest.core.Is.is;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryEventRegistryTest.java
similarity index 95%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryEventRegistryTest.java
index add543d7..45613c8e 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryEventRegistryTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static org.hamcrest.core.Is.is;
@@ -26,8 +26,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTest.java
similarity index 92%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTest.java
index e1c6e11a..44e2ab70 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -30,14 +30,14 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.TccApplication;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.TccApplication;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallbacksRegistry;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
 import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
@@ -51,6 +51,8 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TccApplication.class}, properties = {
+    "alpha.spec.names=tcc-db",
+    "alpha.spec.tcc.db.memory-mode=false",
     "spring.jpa.show-sql=true",
     "spring.profiles.active=tccTest"
 })
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTransactionTest.java
similarity index 85%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTransactionTest.java
index cea33d81..393ec4ef 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventServiceTransactionTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static org.hamcrest.Matchers.is;
@@ -26,15 +26,15 @@ import static org.mockito.Mockito.doThrow;
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEventDBRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
-import org.apache.servicecomb.pack.alpha.server.tcc.TccApplication;
-import org.apache.servicecomb.pack.alpha.server.tcc.TccConfiguration;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEventDBRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.TccApplication;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.TccConfiguration;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.junit.After;
 import org.junit.Before;
@@ -47,6 +47,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {TccApplication.class, TccConfiguration.class}, properties = {
+    "alpha.spec.names=tcc-db",
     "spring.profiles.active=tccTest"
 })
 public class TccTxEventServiceTransactionTest {
diff --git a/alpha/alpha-benchmark/pom.xml b/alpha/alpha-spec-saga-db/pom.xml
similarity index 63%
copy from alpha/alpha-benchmark/pom.xml
copy to alpha/alpha-spec-saga-db/pom.xml
index 617a6afe..81a89702 100644
--- a/alpha/alpha-benchmark/pom.xml
+++ b/alpha/alpha-spec-saga-db/pom.xml
@@ -26,52 +26,55 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>alpha-benchmark</artifactId>
-  <name>Pack::Alpha::Benchmark</name>
+  <artifactId>alpha-spec-saga-db</artifactId>
+  <name>Pack::Alpha::Specification::Saga::DB</name>
 
   <dependencies>
     <dependency>
       <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter</artifactId>
+      <artifactId>spring-boot-autoconfigure</artifactId>
     </dependency>
+
+    <!-- servicecomb -->
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>alpha-fsm</artifactId>
-      <exclusions>
-        <exclusion>
-          <artifactId>log4j-slf4j-impl</artifactId>
-          <groupId>org.apache.logging.log4j</groupId>
-        </exclusion>
-      </exclusions>
+      <artifactId>pack-contract-grpc</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>omega-spring-starter</artifactId>
+      <artifactId>alpha-core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>omega-connector-grpc</artifactId>
+      <artifactId>alpha-persistence-jpa</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <scope>runtime</scope>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- test -->
     <dependency>
       <groupId>com.github.seanyinx</groupId>
       <artifactId>unit-scaffolding</artifactId>
-      <scope>compile</scope>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <!-- mixin plugin configurations declared in another pom,
-      just like importing dependencies managed in another pom -->
-      <plugin>
-        <groupId>com.github.odavid.maven.plugins</groupId>
-        <artifactId>mixin-maven-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-maven-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaSpecSagaDbAutoConfiguration.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaSpecSagaDbAutoConfiguration.java
new file mode 100644
index 00000000..1ecb1ba6
--- /dev/null
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaSpecSagaDbAutoConfiguration.java
@@ -0,0 +1,148 @@
+/*
+ * 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.servicecomb.pack.alpha.spec.saga.db;
+
+import java.lang.invoke.MethodHandles;
+import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
+import org.apache.servicecomb.pack.alpha.core.CommandRepository;
+import org.apache.servicecomb.pack.alpha.core.EventScanner;
+import org.apache.servicecomb.pack.alpha.core.NodeStatus;
+import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
+import org.apache.servicecomb.pack.alpha.core.TxConsistentService;
+import org.apache.servicecomb.pack.alpha.core.TxEventRepository;
+import org.apache.servicecomb.pack.alpha.core.TxTimeoutRepository;
+import org.apache.servicecomb.pack.alpha.core.api.APIv1;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.api.SagaDbAPIv1Controller;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.api.SagaDbAPIv1Impl;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.ClusterLockService;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.LockProviderJdbcConfiguration;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.properties.SpecSagaDbProperties;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.test.AlphaEventController;
+import org.apache.servicecomb.pack.common.AlphaMetaKeys;
+import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
+import org.apache.servicecomb.pack.persistence.jpa.EclipseLinkJpaConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@ImportAutoConfiguration({SpecSagaDbProperties.class, EclipseLinkJpaConfiguration.class,
+    LockProviderJdbcConfiguration.class})
+@EnableJpaRepositories(basePackages = "org.apache.servicecomb.pack.alpha.spec.saga.db")
+@ConditionalOnExpression("'${alpha.spec.names}'.contains('saga-db')")
+public class AlphaSpecSagaDbAutoConfiguration {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  public AlphaSpecSagaDbAutoConfiguration() {
+    LOG.info("Alpha Specification Saga DB");
+  }
+
+  @Bean
+  @Primary
+  public DataSourceProperties dataSourceProperties(SpecSagaDbProperties specSagaDbProperties) {
+    return specSagaDbProperties.getDatasource();
+  }
+
+  @Bean
+  CommandRepository springCommandRepository(TxEventEnvelopeRepository eventRepo,
+      CommandEntityRepository commandRepository) {
+    return new SpringCommandRepository(eventRepo, commandRepository);
+  }
+
+  @Bean
+  TxTimeoutRepository springTxTimeoutRepository(TxTimeoutEntityRepository timeoutRepo) {
+    return new SpringTxTimeoutRepository(timeoutRepo);
+  }
+
+  @Bean
+  TxEventRepository springTxEventRepository(TxEventEnvelopeRepository eventRepo) {
+    return new SpringTxEventRepository(eventRepo);
+  }
+
+  @Bean
+  TxConsistentService txConsistentService(
+      @Value("${alpha.event.pollingInterval:500}") int eventPollingInterval,
+      @Value("${alpha.event.scanner.enabled:true}") boolean eventScannerEnabled,
+      ScheduledExecutorService scheduler,
+      TxEventRepository eventRepository,
+      CommandRepository commandRepository,
+      TxTimeoutRepository timeoutRepository,
+      OmegaCallback omegaCallback,
+      NodeStatus nodeStatus) {
+    if (eventScannerEnabled) {
+      new EventScanner(scheduler,
+          eventRepository, commandRepository, timeoutRepository,
+          omegaCallback, eventPollingInterval, nodeStatus).run();
+      LOG.info("Starting the EventScanner.");
+    }
+    TxConsistentService consistentService = new TxConsistentService(eventRepository);
+    return consistentService;
+  }
+
+  @Bean
+  GrpcTxEventEndpointImpl grpcTxEventEndpoint(TxConsistentService txConsistentService,
+      Map<String, Map<String, OmegaCallback>> omegaCallbacks) {
+    ServerMeta serverMeta = ServerMeta.newBuilder()
+        .putMeta(AlphaMetaKeys.AkkaEnabled.name(), String.valueOf(false)).build();
+    return new GrpcTxEventEndpointImpl(txConsistentService, omegaCallbacks, serverMeta);
+  }
+
+  @Bean
+  ClusterLockService clusterLockService() {
+    return new ClusterLockService();
+  }
+
+  @Bean
+  public MetricsService metricsService() {
+    return new MetricsService();
+  }
+
+  @Bean
+  AlphaMetricsEndpoint alphaMetricsEndpoint(){
+    return new AlphaMetricsEndpointImpl();
+  }
+
+  @Bean
+  SagaDbAPIv1Controller apIv1Controller(){
+    return new SagaDbAPIv1Controller();
+  }
+
+  @Bean
+  APIv1 apIv1(){
+    return new SagaDbAPIv1Impl();
+  }
+
+  @Bean
+  @Profile("test")
+  AlphaEventController alphaEventController(TxEventEnvelopeRepository eventRepository){
+    return new AlphaEventController(eventRepository);
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/CommandEntityRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/CommandEntityRepository.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/CommandEntityRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/CommandEntityRepository.java
index 60fd28bb..7eb5d941 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/CommandEntityRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/CommandEntityRepository.java
@@ -15,13 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.util.List;
-
 import javax.persistence.LockModeType;
 import javax.transaction.Transactional;
-
 import org.apache.servicecomb.pack.alpha.core.Command;
 import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Modifying;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcOmegaCallback.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcOmegaCallback.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcOmegaCallback.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcOmegaCallback.java
index 97b7b614..45e0f480 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcOmegaCallback.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcOmegaCallback.java
@@ -18,16 +18,14 @@
  *
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
+import com.google.protobuf.ByteString;
+import io.grpc.stub.StreamObserver;
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
 import org.apache.servicecomb.pack.contract.grpc.GrpcCompensateCommand;
 
-import com.google.protobuf.ByteString;
-
-import io.grpc.stub.StreamObserver;
-
 class GrpcOmegaCallback implements OmegaCallback {
 
   private final StreamObserver<GrpcCompensateCommand> observer;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcTxEventEndpointImpl.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcTxEventEndpointImpl.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcTxEventEndpointImpl.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcTxEventEndpointImpl.java
index 8263de5f..4141d3db 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcTxEventEndpointImpl.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/GrpcTxEventEndpointImpl.java
@@ -18,15 +18,15 @@
  *
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import static java.util.Collections.emptyMap;
 
+import io.grpc.stub.StreamObserver;
 import java.lang.invoke.MethodHandles;
 import java.util.Date;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.TxConsistentService;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
@@ -36,8 +36,6 @@ import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
 import org.apache.servicecomb.pack.contract.grpc.GrpcTxEvent;
 import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
 import org.apache.servicecomb.pack.contract.grpc.TxEventServiceGrpc.TxEventServiceImplBase;
-
-import io.grpc.stub.StreamObserver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsController.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsController.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsController.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsController.java
index 339321a2..7f347aed 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsController.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsController.java
@@ -15,13 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.console.saga;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
-import org.apache.servicecomb.pack.alpha.server.TxEventEnvelopeRepository;
-import org.apache.servicecomb.pack.alpha.server.console.saga.model.Stats;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.model.Stats;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.PageRequest;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringCommandRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringCommandRepository.java
similarity index 87%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringCommandRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringCommandRepository.java
index 649ebb0c..f16275d7 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringCommandRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringCommandRepository.java
@@ -15,21 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
-
-import static org.apache.servicecomb.pack.alpha.core.TaskStatus.DONE;
-import static org.apache.servicecomb.pack.alpha.core.TaskStatus.NEW;
-import static org.apache.servicecomb.pack.alpha.core.TaskStatus.PENDING;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.lang.invoke.MethodHandles;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.transaction.Transactional;
-
 import org.apache.servicecomb.pack.alpha.core.Command;
 import org.apache.servicecomb.pack.alpha.core.CommandRepository;
+import org.apache.servicecomb.pack.alpha.core.TaskStatus;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,12 +65,12 @@ public class SpringCommandRepository implements CommandRepository {
 
   @Override
   public void markCommandAsDone(String globalTxId, String localTxId) {
-    commandRepository.updateStatusByGlobalTxIdAndLocalTxId(DONE.name(), globalTxId, localTxId);
+    commandRepository.updateStatusByGlobalTxIdAndLocalTxId(TaskStatus.DONE.name(), globalTxId, localTxId);
   }
 
   @Override
   public List<Command> findUncompletedCommands(String globalTxId) {
-    return commandRepository.findByGlobalTxIdAndStatus(globalTxId, NEW.name());
+    return commandRepository.findByGlobalTxIdAndStatus(globalTxId, TaskStatus.NEW.name());
   }
 
   @Transactional
@@ -86,8 +81,8 @@ public class SpringCommandRepository implements CommandRepository {
 
     commands.forEach(command ->
         commandRepository.updateStatusByGlobalTxIdAndLocalTxId(
-            NEW.name(),
-            PENDING.name(),
+            TaskStatus.NEW.name(),
+            TaskStatus.PENDING.name(),
             command.globalTxId(),
             command.localTxId()));
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxEventRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxEventRepository.java
similarity index 91%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxEventRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxEventRepository.java
index f35c3861..389998d8 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxEventRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxEventRepository.java
@@ -15,15 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
-
-import static org.apache.servicecomb.pack.common.EventType.TxCompensatedEvent;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.util.List;
 import java.util.Optional;
-
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
 import org.apache.servicecomb.pack.alpha.core.TxEventRepository;
+import org.apache.servicecomb.pack.common.EventType;
 import org.springframework.data.domain.PageRequest;
 
 class SpringTxEventRepository implements TxEventRepository {
@@ -66,7 +64,7 @@ class SpringTxEventRepository implements TxEventRepository {
 
   @Override
   public Optional<TxEvent> findFirstCompensatedEventByIdGreaterThan(long id) {
-    return eventRepo.findFirstByTypeAndSurrogateIdGreaterThan(TxCompensatedEvent.name(), id);
+    return eventRepo.findFirstByTypeAndSurrogateIdGreaterThan(EventType.TxCompensatedEvent.name(), id);
   }
 
   @Override
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxTimeoutRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxTimeoutRepository.java
similarity index 89%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxTimeoutRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxTimeoutRepository.java
index 5569d36b..9f32890f 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/SpringTxTimeoutRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SpringTxTimeoutRepository.java
@@ -15,15 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
-
-import static org.apache.servicecomb.pack.alpha.core.TaskStatus.PENDING;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.lang.invoke.MethodHandles;
 import java.util.List;
-
 import javax.transaction.Transactional;
-
+import org.apache.servicecomb.pack.alpha.core.TaskStatus;
 import org.apache.servicecomb.pack.alpha.core.TxTimeout;
 import org.apache.servicecomb.pack.alpha.core.TxTimeoutRepository;
 import org.slf4j.Logger;
@@ -58,7 +55,7 @@ public class SpringTxTimeoutRepository implements TxTimeoutRepository {
   public List<TxTimeout> findFirstTimeout() {
     List<TxTimeout> timeoutEvents = timeoutRepo.findFirstTimeoutTxOrderByExpireTimeAsc(PageRequest.of(0, 1));
     timeoutEvents.forEach(event -> timeoutRepo
-        .updateStatusByGlobalTxIdAndLocalTxId(PENDING.name(), event.globalTxId(), event.localTxId()));
+        .updateStatusByGlobalTxIdAndLocalTxId(TaskStatus.PENDING.name(), event.globalTxId(), event.localTxId()));
     return timeoutEvents;
   }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxEventEnvelopeRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxEventEnvelopeRepository.java
similarity index 99%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxEventEnvelopeRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxEventEnvelopeRepository.java
index 6e843838..fbad2666 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxEventEnvelopeRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxEventEnvelopeRepository.java
@@ -15,13 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.util.List;
 import java.util.Optional;
-
 import javax.transaction.Transactional;
-
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Modifying;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxTimeoutEntityRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxTimeoutEntityRepository.java
similarity index 94%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxTimeoutEntityRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxTimeoutEntityRepository.java
index 15849523..0f034ec5 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/TxTimeoutEntityRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/TxTimeoutEntityRepository.java
@@ -15,13 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import java.util.List;
-
 import javax.persistence.LockModeType;
 import javax.transaction.Transactional;
-
 import org.apache.servicecomb.pack.alpha.core.TxTimeout;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Lock;
@@ -30,7 +28,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
 
-interface TxTimeoutEntityRepository extends CrudRepository<TxTimeout, Long> {
+public interface TxTimeoutEntityRepository extends CrudRepository<TxTimeout, Long> {
 
   @Transactional
   @Modifying(clearAutomatically = true)
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Controller.java
similarity index 58%
copy from alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Controller.java
index 67ebcc50..c28ed0e2 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Controller.java
@@ -15,25 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.core.api;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.api;
 
-import java.util.List;
-import java.util.Map;
-import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
-import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
+import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 
-public interface APIv1 {
+@RequestMapping("/alpha/api/v1")
+public class SagaDbAPIv1Controller {
 
-  AlphaMetrics getMetrics();
+  @Autowired
+  APIv1 apIv1;
 
-  GlobalTransaction getTransactionByGlobalTxId(String globalTxId)
-      throws Exception;
-
-  PagingGlobalTransactions getTransactions(String state, int page, int size)
-      throws Exception;
-
-  Map<String, Long> getTransactionStatistics();
-
-  List<GlobalTransaction> getSlowTransactions(int size);
+  @GetMapping(value = "/metrics")
+  public ResponseEntity<AlphaMetrics> metrics() {
+    return ResponseEntity.ok(apIv1.getMetrics());
+  }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Impl.java
similarity index 63%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Impl.java
index edd7b784..eed744b6 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/api/SagaDbAPIv1Impl.java
@@ -15,28 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.api;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.api;
 
 import java.util.List;
 import java.util.Map;
+import javax.transaction.NotSupportedException;
 import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
-import org.apache.servicecomb.pack.alpha.server.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
-public class APIv1Impl implements APIv1 {
+public class SagaDbAPIv1Impl implements APIv1 {
 
   @Autowired
   AlphaMetricsEndpoint alphaMetricsEndpoint;
 
-  @Autowired(required = false)
-  TransactionRepository transactionRepository;
-
   public AlphaMetrics getMetrics() {
     AlphaMetrics alphaMetrics = new AlphaMetrics();
     alphaMetrics.setMetrics(alphaMetricsEndpoint.getMetrics());
@@ -44,25 +39,24 @@ public class APIv1Impl implements APIv1 {
     return alphaMetrics;
   }
 
-  public GlobalTransaction getTransactionByGlobalTxId(String globalTxId)
-      throws Exception {
-    GlobalTransaction globalTransaction = transactionRepository
-        .getGlobalTransactionByGlobalTxId(globalTxId);
-    return globalTransaction;
+  @Override
+  public GlobalTransaction getTransactionByGlobalTxId(String globalTxId) throws Exception {
+    throw new NotSupportedException();
   }
 
+  @Override
   public PagingGlobalTransactions getTransactions(String state, int page, int size)
       throws Exception {
-    PagingGlobalTransactions pagingGlobalTransactions = transactionRepository
-        .getGlobalTransactions(state, page, size);
-    return pagingGlobalTransactions;
+    throw new NotSupportedException();
   }
 
-  public Map<String, Long> getTransactionStatistics() {
-    return transactionRepository.getTransactionStatistics();
+  @Override
+  public Map<String, Long> getTransactionStatistics() throws Exception {
+    throw new NotSupportedException();
   }
 
-  public List<GlobalTransaction> getSlowTransactions(int size) {
-    return transactionRepository.getSlowGlobalTransactionsTopN(size);
+  @Override
+  public List<GlobalTransaction> getSlowTransactions(int size) throws Exception {
+    throw new NotSupportedException();
   }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockService.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/ClusterLockService.java
similarity index 73%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockService.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/ClusterLockService.java
index a81f3a22..4933586b 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/ClusterLockService.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/ClusterLockService.java
@@ -15,53 +15,48 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster;
 
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
+import java.lang.invoke.MethodHandles;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Optional;
+import java.util.Timer;
+import java.util.TimerTask;
 import javax.annotation.PostConstruct;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.event.GrpcStartableStartedEvent;
-import org.apache.servicecomb.pack.alpha.server.AlphaConfig;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.LockProvider;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.Lock;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.Lock;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.LockProvider;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.lang.invoke.MethodHandles;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Optional;
-
 /**
  * Cluster master preemption master service
  * default based on database master_lock table implementation
  * <p>
  * Set true to enable default value false
- * alpha.cluster.master.enabled=true
+ * alpha.spec.saga.db.cluster=true
  * <p>
  * Implementation type, default jdbc
- * alpha.cluster.master.type=jdbc
+ * alpha.spec.saga.db.cluster.type=jdbc
  * <p>
  * Lock timeout, default value 5000 millisecond
- * alpha.cluster.master.expire=5000
+ * alpha.spec.saga.db.cluster.expire=5000
  */
 
-@Component
-@ConditionalOnProperty(name = "alpha.cluster.master.enabled", havingValue = "true")
-@EnableScheduling
-@AutoConfigureAfter(AlphaConfig.class)
 public class ClusterLockService implements ApplicationListener<ApplicationReadyEvent> {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -78,13 +73,15 @@ public class ClusterLockService implements ApplicationListener<ApplicationReadyE
 
   private Optional<Lock> locker;
 
+  private Timer masterCheckTimer;
+
   @Value("[${alpha.server.host}]:${alpha.server.port}")
   private String instanceId;
 
   @Value("${spring.application.name:servicecomb-alpha-server}")
   private String serviceName;
 
-  @Value("${alpha.cluster.master.expire:5000}")
+  @Value("${alpha.spec.saga.db.cluster.expire:5000}")
   private int expire;
 
   @Autowired
@@ -100,6 +97,37 @@ public class ClusterLockService implements ApplicationListener<ApplicationReadyE
   @PostConstruct
   public void init() {
     eventBus.register(this);
+
+    /**
+     * Try to lock every second
+     * TODO We need to check if the master check interval time check is OK
+     * */
+    masterCheckTimer = new Timer("masterCheckTimer");
+    masterCheckTimer.schedule(new TimerTask(){
+
+      @Override
+      public void run() {
+        if (applicationReady && portReady) {
+          locker = lockProvider.lock(getMasterLock());
+          if (locker.isPresent()) {
+            if (!locked) {
+              locked = true;
+              nodeStatus.setTypeEnum(NodeStatus.TypeEnum.MASTER);
+              LOG.info("Master Node");
+            }
+            //Keep locked
+          } else {
+            if (locked || !lockExecuted) {
+              locked = false;
+              nodeStatus.setTypeEnum(NodeStatus.TypeEnum.SLAVE);
+              LOG.info("Slave Node");
+            }
+          }
+          lockExecuted = true;
+        }
+      }
+    },0, 1000);
+
     LOG.info("Initialize cluster mode");
   }
 
@@ -123,32 +151,6 @@ public class ClusterLockService implements ApplicationListener<ApplicationReadyE
     return this.masterLock;
   }
 
-  /**
-   * Try to lock every second
-   * */
-  //TODO We need to check if the master check interval time check is OK
-  @Scheduled(cron = "0/1 * * * * ?")
-  public void masterCheck() {
-    if (this.applicationReady && this.portReady) {
-      this.locker = lockProvider.lock(this.getMasterLock());
-      if (this.locker.isPresent()) {
-        if (!this.locked) {
-          this.locked = true;
-          nodeStatus.setTypeEnum(NodeStatus.TypeEnum.MASTER);
-          LOG.info("Master Node");
-        }
-        //Keep locked
-      } else {
-        if (this.locked || !lockExecuted) {
-          locked = false;
-          nodeStatus.setTypeEnum(NodeStatus.TypeEnum.SLAVE);
-          LOG.info("Slave Node");
-        }
-      }
-      lockExecuted = true;
-    }
-  }
-
   public void unLock() {
     if (this.locker.isPresent()) {
       this.locker.get().unlock();
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/AbstractLockProvider.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/AbstractLockProvider.java
similarity index 84%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/AbstractLockProvider.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/AbstractLockProvider.java
index 20e1afe8..9d199ca2 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/AbstractLockProvider.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/AbstractLockProvider.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
-
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider;
 
 import java.util.Optional;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
 
 public abstract class AbstractLockProvider implements LockProvider {
 
@@ -32,7 +31,8 @@ public abstract class AbstractLockProvider implements LockProvider {
   }
 
   @Override
-  public Optional<org.apache.servicecomb.pack.alpha.server.cluster.master.provider.Lock> lock(MasterLock masterLock) {
+  public Optional<org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.Lock> lock(
+      MasterLock masterLock) {
     boolean lockObtained = doLock(masterLock);
     if (lockObtained) {
       return Optional.of(new Lock(this,masterLock, lockProviderPersistence));
@@ -55,7 +55,8 @@ public abstract class AbstractLockProvider implements LockProvider {
     this.lockInitialization = false;
   }
 
-  private static class Lock implements org.apache.servicecomb.pack.alpha.server.cluster.master.provider.Lock {
+  private static class Lock implements
+      org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.Lock {
     private final MasterLock masterLock;
     private final AbstractLockProvider provider;
     private final LockProviderPersistence lockProviderPersistence;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/Lock.java
similarity index 91%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/Lock.java
index 1622f139..39621f25 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/Lock.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider;
 
 public interface Lock {
   void unlock();
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProvider.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProvider.java
similarity index 84%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProvider.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProvider.java
index 3a15a59f..038140c6 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProvider.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProvider.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
-
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider;
 
 import java.util.Optional;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
 
 public interface LockProvider {
   Optional<Lock> lock(MasterLock masterLock);
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProviderPersistence.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProviderPersistence.java
similarity index 85%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProviderPersistence.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProviderPersistence.java
index ab386b8e..a40036bc 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/LockProviderPersistence.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/LockProviderPersistence.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider;
 
-    import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
+    import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
 
 public interface LockProviderPersistence {
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockPersistence.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockPersistence.java
similarity index 79%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockPersistence.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockPersistence.java
index 1bd6aa1c..56461e1d 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockPersistence.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockPersistence.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc;
 
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.LockProviderPersistence;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLockRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.LockProviderPersistence;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLockRepository;
 
 class JdbcLockPersistence implements LockProviderPersistence {
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockProvider.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockProvider.java
similarity index 78%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockProvider.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockProvider.java
index e7302d45..faf63ec6 100755
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/JdbcLockProvider.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/JdbcLockProvider.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc;
 
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.AbstractLockProvider;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLockRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.AbstractLockProvider;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLockRepository;
 
 public class JdbcLockProvider extends AbstractLockProvider {
   public JdbcLockProvider(MasterLockRepository masterLockRepository) {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/LockProviderJdbcConfiguration.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/LockProviderJdbcConfiguration.java
similarity index 75%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/LockProviderJdbcConfiguration.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/LockProviderJdbcConfiguration.java
index 35d53ed0..40792453 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/LockProviderJdbcConfiguration.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/LockProviderJdbcConfiguration.java
@@ -15,17 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc;
 
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.LockProvider;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLockRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.LockProvider;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLockRepository;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
 
 @Configuration
-@ConditionalOnProperty(name = "alpha.cluster.master.enabled", havingValue = "true")
 public class LockProviderJdbcConfiguration {
 
   @Bean
@@ -35,7 +34,7 @@ public class LockProviderJdbcConfiguration {
 
   @Primary
   @Bean
-  @ConditionalOnProperty(name = "alpha.cluster.master.type", havingValue = "jdbc", matchIfMissing = true)
+  @ConditionalOnProperty(name = "alpha.spec.saga.db.cluster.type", havingValue = "jdbc", matchIfMissing = true)
   public LockProvider lockProvider(MasterLockRepository electionRepo) {
     return new JdbcLockProvider(electionRepo);
   }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/MasterLockEntityRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/MasterLockEntityRepository.java
similarity index 86%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/MasterLockEntityRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/MasterLockEntityRepository.java
index 43cf0f7a..931110c7 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/MasterLockEntityRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/MasterLockEntityRepository.java
@@ -15,19 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc;
 
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
+import java.util.Date;
+import java.util.Optional;
+import javax.transaction.Transactional;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
 
-import javax.transaction.Transactional;
-
-import java.util.Date;
-import java.util.Optional;
-
 public interface MasterLockEntityRepository extends CrudRepository<MasterLock, String> {
 
   Optional<MasterLock> findMasterLockByServiceName(String serviceName);
@@ -46,7 +44,7 @@ public interface MasterLockEntityRepository extends CrudRepository<MasterLock, S
 
   @Transactional
   @Modifying(clearAutomatically = true)
-  @Query("UPDATE org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock t "
+  @Query("UPDATE org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock t "
       + "SET t.expireTime = :expireTime"
       + ",t.lockedTime = :lockedTime "
       + ",t.instanceId = :instanceId "
@@ -59,7 +57,7 @@ public interface MasterLockEntityRepository extends CrudRepository<MasterLock, S
 
   @Transactional
   @Modifying(clearAutomatically = true)
-  @Query("UPDATE org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock t "
+  @Query("UPDATE org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock t "
       + "SET t.expireTime = :expireTime "
       + "WHERE t.serviceName = :serviceName")
   int unLock(@Param("serviceName") String serviceName,
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/SpringMasterLockRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/SpringMasterLockRepository.java
similarity index 90%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/SpringMasterLockRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/SpringMasterLockRepository.java
index c160d834..a8d6f922 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/SpringMasterLockRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/SpringMasterLockRepository.java
@@ -15,17 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc;
-
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLock;
-import org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa.MasterLockRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Date;
 import java.util.Optional;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLock;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa.MasterLockRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 
 @ConditionalOnProperty(name = "alpha.cluster.master.enabled", havingValue = "true")
 public class SpringMasterLockRepository implements MasterLockRepository {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLock.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLock.java
similarity index 95%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLock.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLock.java
index bb47b8c7..af594217 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLock.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLock.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa;
 
+import java.util.Date;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import java.util.Date;
-
 @Entity
 @Table(name = "master_lock")
 public class MasterLock {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLockRepository.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLockRepository.java
similarity index 93%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLockRepository.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLockRepository.java
index f66826db..cae39ea0 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/jdbc/jpa/MasterLockRepository.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/cluster/provider/jdbc/jpa/MasterLockRepository.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider.jdbc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.jpa;
 
 import java.util.Date;
 import java.util.Optional;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/AlphaMetricsEndpointImpl.java
similarity index 86%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/AlphaMetricsEndpointImpl.java
index 4a888909..5689915d 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/AlphaMetricsEndpointImpl.java
@@ -15,24 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.metrics;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 @Component
-public class AlphaMetricsEndpoint {
+public class AlphaMetricsEndpointImpl implements AlphaMetricsEndpoint {
 
   @Autowired
   @Lazy
   private NodeStatus nodeStatus;
 
-  @Autowired(required = false)
+  @Autowired
   MetricsService metricsService;
 
   public MetricsBean getMetrics() {
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/MetricsService.java
similarity index 94%
copy from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/MetricsService.java
index aa085fc6..a6ced13b 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/metrics/MetricsService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.metrics;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/model/Stats.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/model/Stats.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/model/Stats.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/model/Stats.java
index a4a0a6ad..98e3b454 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/console/saga/model/Stats.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/model/Stats.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.pack.alpha.server.console.saga.model;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.model;
 
 import java.util.Date;
 
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/properties/SpecSagaDbProperties.java
similarity index 62%
copy from omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
copy to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/properties/SpecSagaDbProperties.java
index 021cbaea..cdb09229 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/properties/SpecSagaDbProperties.java
@@ -15,15 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.omega.spring;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.properties;
 
-import org.apache.servicecomb.pack.omega.transaction.spring.TransactionAspectConfig;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 
 @Configuration
-@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})
-@ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)
-public class OmegaSpringAutoConfiguration {
-}
+@ConfigurationProperties(prefix = "alpha.spec.saga.db")
+public class SpecSagaDbProperties {
+  private DataSourceProperties datasource;
+
+  public DataSourceProperties getDatasource() {
+    return datasource;
+  }
+
+  public void setDatasource(DataSourceProperties datasource) {
+    this.datasource = datasource;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaEventController.java b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/test/AlphaEventController.java
similarity index 90%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaEventController.java
rename to alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/test/AlphaEventController.java
index 7f691abc..603a2bfb 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/AlphaEventController.java
+++ b/alpha/alpha-spec-saga-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/db/test/AlphaEventController.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db.test;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
@@ -23,6 +23,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.TxEventEnvelopeRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Profile;
@@ -39,12 +40,12 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
 @RequestMapping("/saga")
 @Profile("test")
 // Only export this Controller for test
-class AlphaEventController {
+public class AlphaEventController {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final TxEventEnvelopeRepository eventRepository;
 
-  AlphaEventController(TxEventEnvelopeRepository eventRepository) {
+  public AlphaEventController(TxEventEnvelopeRepository eventRepository) {
     this.eventRepository = eventRepository;
   }
 
diff --git a/alpha/alpha-fsm/src/main/resources/META-INF/spring.factories b/alpha/alpha-spec-saga-db/src/main/resources/META-INF/spring.factories
similarity index 86%
copy from alpha/alpha-fsm/src/main/resources/META-INF/spring.factories
copy to alpha/alpha-spec-saga-db/src/main/resources/META-INF/spring.factories
index ff42cddf..4ad6b208 100644
--- a/alpha/alpha-fsm/src/main/resources/META-INF/spring.factories
+++ b/alpha/alpha-spec-saga-db/src/main/resources/META-INF/spring.factories
@@ -14,4 +14,5 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apache.servicecomb.pack.alpha.fsm.FsmAutoConfiguration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration= \
+  org.apache.servicecomb.pack.alpha.spec.saga.db.AlphaSpecSagaDbAutoConfiguration
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaEventControllerTest.java b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaEventControllerTest.java
similarity index 90%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaEventControllerTest.java
rename to alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaEventControllerTest.java
index afd041b1..64a4e0cd 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/AlphaEventControllerTest.java
+++ b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/AlphaEventControllerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static java.util.Collections.singletonList;
@@ -28,19 +28,21 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 import java.util.UUID;
-
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
+import org.apache.servicecomb.pack.alpha.spec.saga.db.test.AlphaEventController;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 
 @RunWith(SpringRunner.class)
-@WebMvcTest(value = AlphaEventController.class, properties = {
+@ContextConfiguration(classes = {WebConfiguration.class})
+@WebMvcTest(value = {AlphaEventController.class}, properties = {
     "spring.profiles.active=test"
 })
 public class AlphaEventControllerTest {
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsControllerTest.java b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsControllerTest.java
similarity index 98%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsControllerTest.java
rename to alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsControllerTest.java
index 60bbb597..e2e5abff 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/console/saga/SagaTransactionsControllerTest.java
+++ b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/SagaTransactionsControllerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.console.saga;
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
 
 import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
 import static java.util.Collections.singletonList;
@@ -37,7 +37,6 @@ import java.util.List;
 import java.util.UUID;
 
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
-import org.apache.servicecomb.pack.alpha.server.TxEventEnvelopeRepository;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,10 +44,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 
 @RunWith(SpringRunner.class)
+@ContextConfiguration(classes = {WebConfiguration.class})
 @WebMvcTest(SagaTransactionsController.class)
 public class SagaTransactionsControllerTest {
   private final TxEvent someEvent = populateEvents(TxStartedEvent.name());
diff --git a/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/WebConfiguration.java b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/WebConfiguration.java
new file mode 100644
index 00000000..aa15af21
--- /dev/null
+++ b/alpha/alpha-spec-saga-db/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/db/WebConfiguration.java
@@ -0,0 +1,20 @@
+package org.apache.servicecomb.pack.alpha.spec.saga.db;
+
+import org.apache.servicecomb.pack.alpha.spec.saga.db.test.AlphaEventController;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+class WebConfiguration implements WebMvcConfigurer {
+
+  @Bean
+  AlphaEventController alphaEventController(TxEventEnvelopeRepository eventRepository) {
+    return new AlphaEventController(eventRepository);
+  }
+
+  @Bean
+  SagaTransactionsController sagaTransactionsController(TxEventEnvelopeRepository eventRepository){
+    return new SagaTransactionsController(eventRepository);
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-fsm/README.md b/alpha/alpha-spec-saga-fsm/README.md
similarity index 100%
rename from alpha/alpha-fsm/README.md
rename to alpha/alpha-spec-saga-fsm/README.md
diff --git a/alpha/alpha-fsm/pom.xml b/alpha/alpha-spec-saga-fsm/pom.xml
similarity index 91%
rename from alpha/alpha-fsm/pom.xml
rename to alpha/alpha-spec-saga-fsm/pom.xml
index 5ecd7e46..97da3121 100644
--- a/alpha/alpha-fsm/pom.xml
+++ b/alpha/alpha-spec-saga-fsm/pom.xml
@@ -26,8 +26,8 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>alpha-fsm</artifactId>
-  <name>Pack::Alpha::Fsm</name>
+  <artifactId>alpha-spec-saga-fsm</artifactId>
+  <name>Pack::Alpha::Specification::Saga::FSM</name>
 
   <dependencies>
     <!-- spring boot -->
@@ -51,6 +51,10 @@
     </dependency>
 
     <!-- pack -->
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>pack-contract-grpc</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
       <artifactId>pack-common</artifactId>
@@ -60,8 +64,8 @@
       <artifactId>alpha-core</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+      <groupId>org.springframework.data</groupId>
+      <artifactId>spring-data-elasticsearch</artifactId>
     </dependency>
     <dependency>
       <groupId>org.springframework.kafka</groupId>
@@ -195,6 +199,16 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-pool2</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-webmvc</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java
new file mode 100644
index 00000000..d4ca777b
--- /dev/null
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java
@@ -0,0 +1,198 @@
+/*
+ * 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.servicecomb.pack.alpha.fsm;
+
+import static org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER;
+import static org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SpringAkkaExtension.SPRING_EXTENSION_PROVIDER;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import java.lang.invoke.MethodHandles;
+import java.util.Arrays;
+import java.util.Map;
+import org.apache.http.HttpHost;
+import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
+import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.fsm.api.APIv1Controller;
+import org.apache.servicecomb.pack.alpha.fsm.api.APIv1Impl;
+import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.fsm.channel.memory.MemoryActorEventChannel;
+import org.apache.servicecomb.pack.alpha.fsm.channel.memory.MemorySagaEventConsumer;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.fsm.properties.SpecSagaAkkaProperties;
+import org.apache.servicecomb.pack.alpha.fsm.repository.NoneTransactionRepository;
+import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
+import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.fsm.repository.channel.DefaultTransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch.ElasticsearchTransactionRepository;
+import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.AkkaConfigPropertyAdapter;
+import org.apache.servicecomb.pack.alpha.fsm.test.FsmSagaDataController;
+import org.apache.servicecomb.pack.common.AlphaMetaKeys;
+import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
+
+@Configuration
+@ImportAutoConfiguration({SpecSagaAkkaProperties.class})
+@ConditionalOnExpression("'${alpha.spec.names}'.contains('saga-akka')")
+public class AlphaSpecSagaFsmAutoConfiguration {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  public AlphaSpecSagaFsmAutoConfiguration() {
+    System.setProperty("es.set.netty.runtime.available.processors", "false");
+    LOG.info("Alpha Specification Saga Akka");
+  }
+
+  @Bean
+  public MetricsService metricsService() {
+    return new MetricsService();
+  }
+
+  @Bean
+  public ActorSystem actorSystem(ConfigurableApplicationContext applicationContext,
+      ConfigurableEnvironment environment, MetricsService metricsService,
+      TransactionRepositoryChannel repositoryChannel) {
+    ActorSystem system = ActorSystem
+        .create("alpha-cluster", akkaConfiguration(applicationContext, environment));
+
+    SPRING_EXTENSION_PROVIDER.get(system).initialize(applicationContext);
+    SAGA_DATA_EXTENSION_PROVIDER.get(system).setRepositoryChannel(repositoryChannel);
+    SAGA_DATA_EXTENSION_PROVIDER.get(system).setMetricsService(metricsService);
+    return system;
+  }
+
+  @Bean
+  public Config akkaConfiguration(ConfigurableApplicationContext applicationContext,
+      ConfigurableEnvironment environment) {
+    final Map<String, Object> converted = AkkaConfigPropertyAdapter.getPropertyMap(environment);
+    return ConfigFactory.parseMap(converted)
+        .withFallback(ConfigFactory.defaultReference(applicationContext.getClassLoader()));
+  }
+
+  @Bean(name = "sagaShardRegionActor")
+  public ActorRef sagaShardRegionActor(ActorSystem actorSystem) {
+    return actorSystem.actorOf(Props.create(SagaShardRegionActor.class));
+  }
+
+  @Bean
+  public ElasticsearchRestTemplate elasticsearchRestTemplate(
+      SpecSagaAkkaProperties specSagaAkkaProperties) {
+    HttpHost[] hosts = Arrays.stream(
+            specSagaAkkaProperties.getRepository().getElasticsearch().getUris()
+                .split(","))
+        .map(uri -> HttpHost.create(uri))
+        .toArray(HttpHost[]::new);
+    RestClientBuilder builder = RestClient.builder(hosts);
+    RestHighLevelClient client = new RestHighLevelClient(builder);
+    return new ElasticsearchRestTemplate(client);
+  }
+
+  @Bean
+  public TransactionRepository transactionRepository(
+      SpecSagaAkkaProperties specSagaAkkaProperties,
+      ElasticsearchRestTemplate elasticsearchRestTemplate,
+      MetricsService metricsService) {
+    if (specSagaAkkaProperties.getRepository().getName().equals("elasticsearch")) {
+      return new ElasticsearchTransactionRepository(specSagaAkkaProperties.getRepository()
+          .getElasticsearch(), elasticsearchRestTemplate, metricsService);
+    } else {
+      return new NoneTransactionRepository();
+    }
+  }
+
+  @Bean
+  TransactionRepositoryChannel memoryTransactionRepositoryChannel(TransactionRepository repository,
+      MetricsService metricsService) {
+    return new DefaultTransactionRepositoryChannel(repository, metricsService);
+  }
+
+  @Bean
+  @ConditionalOnMissingBean(ActorEventChannel.class)
+  public ActorEventChannel eventChannel(SpecSagaAkkaProperties specSagaAkkaProperties,
+      MetricsService metricsService) {
+    if (specSagaAkkaProperties.getChannel().getName().equals("memory")) {
+      return new MemoryActorEventChannel(metricsService,
+          specSagaAkkaProperties.getChannel().getMemory().getMaxLength());
+    } else {
+      return new MemoryActorEventChannel(metricsService,
+          specSagaAkkaProperties.getChannel().getMemory().getMaxLength());
+    }
+  }
+
+  @Bean
+  AbstractEventConsumer eventConsumer(SpecSagaAkkaProperties specSagaAkkaProperties,
+      ActorSystem actorSystem,
+      @Qualifier("sagaShardRegionActor") ActorRef sagaShardRegionActor,
+      MetricsService metricsService,
+      ActorEventChannel actorEventChannel) {
+    if (specSagaAkkaProperties.getChannel().getName().equals("memory")) {
+      return new MemorySagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
+          (MemoryActorEventChannel) actorEventChannel);
+    } else {
+      return new MemorySagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
+          (MemoryActorEventChannel) actorEventChannel);
+    }
+  }
+
+  @Bean
+  GrpcSagaEventService grpcSagaEventService(ActorEventChannel actorEventChannel, Map<String, Map<String, OmegaCallback>> omegaCallbacks){
+    ServerMeta serverMeta = ServerMeta.newBuilder()
+        .putMeta(AlphaMetaKeys.AkkaEnabled.name(), String.valueOf(true)).build();
+    return new GrpcSagaEventService(actorEventChannel, omegaCallbacks, serverMeta);
+  }
+
+  @Bean
+  APIv1Impl apIv1(){
+    return new APIv1Impl();
+  }
+
+  @Bean
+  APIv1Controller apIv1Controller(){
+    return new APIv1Controller();
+  }
+
+  @Bean
+  AlphaMetricsEndpoint alphaMetricsEndpoint(){
+    return new AlphaMetricsEndpointImpl();
+  }
+
+  @Bean
+  @Profile("test")
+  FsmSagaDataController fsmSagaDataController(){
+    return new FsmSagaDataController();
+  }
+}
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java
similarity index 95%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java
index 188cc161..cdaf29eb 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm;
 
 import java.util.concurrent.CountDownLatch;
 import org.apache.servicecomb.pack.alpha.core.fsm.CompensateAckType;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcOmegaCallback.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcOmegaCallback.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java
index dcc7eeaf..9f27f95c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcOmegaCallback.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm;
 
 import com.google.protobuf.ByteString;
 import io.grpc.stub.StreamObserver;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java
similarity index 99%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java
index e4d25b97..82552d04 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/GrpcSagaEventService.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm;
 
 import static java.util.Collections.emptyMap;
 
@@ -26,10 +26,10 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.fsm.CompensateAckType;
+import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckFailedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckSucceedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
-import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
 import org.apache.servicecomb.pack.common.EventType;
 import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
 import org.apache.servicecomb.pack.contract.grpc.GrpcCompensateCommand;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
similarity index 99%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
index 5d0d6d86..6298cbed 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
@@ -20,7 +20,6 @@ package org.apache.servicecomb.pack.alpha.fsm;
 import akka.actor.AbstractActor;
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
-import akka.actor.Props;
 import akka.cluster.sharding.ClusterSharding;
 import akka.cluster.sharding.ClusterShardingSettings;
 import akka.cluster.sharding.ShardRegion;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Controller.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java
similarity index 80%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Controller.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java
index 396e7088..a6dd52e0 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Controller.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.api;
+package org.apache.servicecomb.pack.alpha.fsm.api;
 
 import java.util.List;
 import java.util.Map;
+import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
@@ -28,40 +29,38 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
 
-@RestController
 @RequestMapping("/alpha/api/v1")
 public class APIv1Controller {
 
   @Autowired
-  APIv1Impl APIv1Impl;
+  APIv1 apIv1;
 
   @GetMapping(value = "/metrics")
   public ResponseEntity<AlphaMetrics> metrics() {
-    return ResponseEntity.ok(APIv1Impl.getMetrics());
+    return ResponseEntity.ok(apIv1.getMetrics());
   }
 
   @GetMapping(value = "/transaction/{globalTxId}")
   public ResponseEntity<GlobalTransaction> getTransactionByGlobalTxId(@PathVariable String globalTxId)
       throws Exception {
-    return ResponseEntity.ok(APIv1Impl.getTransactionByGlobalTxId(globalTxId));
+    return ResponseEntity.ok(apIv1.getTransactionByGlobalTxId(globalTxId));
   }
 
   @GetMapping(value = "/transaction")
   public ResponseEntity<PagingGlobalTransactions> getTransactions(@RequestParam(value = "page", required = false, defaultValue = "0") int page,
       @RequestParam(value = "size", required = false, defaultValue = "50") int size)
       throws Exception {
-    return ResponseEntity.ok(APIv1Impl.getTransactions(null,page,size));
+    return ResponseEntity.ok(apIv1.getTransactions(null,page,size));
   }
 
   @GetMapping(value = "/transaction/statistics")
-  public ResponseEntity<Map<String,Long>> getTransactionStatistics() {
-    return ResponseEntity.ok(APIv1Impl.getTransactionStatistics());
+  public ResponseEntity<Map<String,Long>> getTransactionStatistics() throws Exception {
+    return ResponseEntity.ok(apIv1.getTransactionStatistics());
   }
 
   @GetMapping(value = "/transaction/slow")
-  public ResponseEntity<List<GlobalTransaction>> getSlowTransactions(@RequestParam(name="size", defaultValue = "10") int size) {
-    return ResponseEntity.ok(APIv1Impl.getSlowTransactions(size));
+  public ResponseEntity<List<GlobalTransaction>> getSlowTransactions(@RequestParam(name="size", defaultValue = "10") int size) throws Exception {
+    return ResponseEntity.ok(apIv1.getSlowTransactions(size));
   }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java
similarity index 92%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java
index edd7b784..8a030867 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.api;
+package org.apache.servicecomb.pack.alpha.fsm.api;
 
 import java.util.List;
 import java.util.Map;
@@ -23,12 +23,10 @@ import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
-import org.apache.servicecomb.pack.alpha.server.metrics.AlphaMetricsEndpoint;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class APIv1Impl implements APIv1 {
 
   @Autowired
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaActorEventChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaActorEventChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaActorEventChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaActorEventChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaChannelAutoConfiguration.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaChannelAutoConfiguration.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaChannelAutoConfiguration.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaChannelAutoConfiguration.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
similarity index 96%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
index d5222b53..dfdd7441 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
@@ -19,11 +19,9 @@ package org.apache.servicecomb.pack.alpha.fsm.channel.memory;
 
 import java.lang.invoke.MethodHandles;
 import java.util.concurrent.LinkedBlockingQueue;
-
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
 import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractActorEventChannel;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.core.fsm.sink.ActorEventSink;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
similarity index 99%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
index f463f163..1e304155 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
+import java.util.Map;
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -32,8 +33,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-import java.util.Map;
-
 @EnableBinding({RabbitMessageChannel.class})
 @Configuration
 @EnableConfigurationProperties(BindingServiceProperties.class)
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
similarity index 99%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
index a441749b..8a2c82a2 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
@@ -17,14 +17,13 @@
 
 package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
 
+import java.lang.invoke.MethodHandles;
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.MessagePublisher;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.integration.support.MessageBuilder;
 
-import java.lang.invoke.MethodHandles;
-
 public class RabbitMessagePublisher implements MessagePublisher<BaseEvent> {
 
     private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
similarity index 99%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
index 87f5237e..9d72b948 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
@@ -21,6 +21,10 @@ import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
 import akka.pattern.Patterns;
 import akka.util.Timeout;
+import java.lang.invoke.MethodHandles;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.CompletionStage;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
 import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractEventConsumer;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
@@ -31,11 +35,6 @@ import scala.concurrent.Await;
 import scala.concurrent.Future;
 import scala.concurrent.duration.Duration;
 
-import java.lang.invoke.MethodHandles;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
-import java.util.concurrent.CompletionStage;
-
 public class RabbitSagaEventConsumer extends AbstractEventConsumer {
     private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
     public RabbitSagaEventConsumer(ActorSystem actorSystem, ActorRef sagaShardRegionActor,
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
similarity index 99%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
index 20abdec1..e023bb06 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
@@ -18,9 +18,8 @@
 package org.apache.servicecomb.pack.alpha.fsm.channel.redis;
 
 import java.lang.invoke.MethodHandles;
-
-import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractActorEventChannel;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractActorEventChannel;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
similarity index 98%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
index 3bc8cb44..7d159677 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
@@ -23,7 +23,6 @@ import javax.annotation.PostConstruct;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.MessagePublisher;
-import org.apache.servicecomb.pack.alpha.core.fsm.sink.ActorEventSink;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
similarity index 97%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
index f19e7689..b9cb31e9 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
@@ -23,7 +23,6 @@ import java.lang.invoke.MethodHandles;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
 import org.apache.servicecomb.pack.alpha.fsm.channel.AbstractEventConsumer;
-import org.apache.servicecomb.pack.alpha.fsm.channel.memory.MemoryActorEventChannel;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
similarity index 100%
copy from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
index 0abca9da..9cbe70be 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
@@ -18,8 +18,8 @@
 package org.apache.servicecomb.pack.alpha.fsm.domain;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 
 public class SagaEndedDomain implements DomainEvent {
 
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
index af7195a3..a60a438d 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
@@ -21,9 +21,9 @@ import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxAbortedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckFailedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckSucceedEvent;
-import org.apache.servicecomb.pack.alpha.core.fsm.event.internal.CompensateAckTimeoutEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxEndedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.core.fsm.event.internal.CompensateAckTimeoutEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.internal.ComponsitedCheckEvent;
 
 public class UpdateTxEventDomain implements DomainEvent {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java
similarity index 87%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java
index 4a888909..18969804 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java
@@ -15,24 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.metrics;
+package org.apache.servicecomb.pack.alpha.fsm.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 @Component
-public class AlphaMetricsEndpoint {
+public class AlphaMetricsEndpointImpl implements AlphaMetricsEndpoint {
 
   @Autowired
   @Lazy
   private NodeStatus nodeStatus;
 
-  @Autowired(required = false)
+  @Autowired
   MetricsService metricsService;
 
   public MetricsBean getMetrics() {
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
similarity index 100%
copy from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
index 92e873d6..3295d670 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
@@ -23,8 +23,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 
 public class SagaData implements Serializable {
   private String serviceName;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java
old mode 100755
new mode 100644
similarity index 87%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java
index 1622f139..2f76334b
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/cluster/master/provider/Lock.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java
@@ -14,9 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-package org.apache.servicecomb.pack.alpha.server.cluster.master.provider;
+public class ChannelKafkaProperties {
 
-public interface Lock {
-  void unlock();
-}
+}
\ No newline at end of file
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java
similarity index 75%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java
index b6bbaebc..157e3488 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java
@@ -15,11 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-import java.io.Serializable;
-import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+public class ChannelMemoryProperties {
+  private int maxLength;
 
-public interface DomainEvent extends Serializable {
-  BaseEvent getEvent();
-}
+  public int getMaxLength() {
+    return maxLength;
+  }
+
+  public void setMaxLength(int maxLength) {
+    this.maxLength = maxLength;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java
similarity index 65%
copy from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java
index aa085fc6..3afd6535 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java
@@ -15,16 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.metrics;
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
+public class ChannelProperties {
+  private String name;
+  private ChannelMemoryProperties memory;
 
-public class MetricsService {
+  public String getName() {
+    return name;
+  }
 
-  private final MetricsBean metrics = new MetricsBean();
+  public void setName(String name) {
+    this.name = name;
+  }
 
-  public MetricsBean metrics() {
-    return metrics;
+  public ChannelMemoryProperties getMemory() {
+    return memory;
   }
 
-}
+  public void setMemory(ChannelMemoryProperties memory) {
+    this.memory = memory;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java
similarity index 50%
copy from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java
index 188cc161..317356f6 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java
@@ -15,24 +15,38 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-import java.util.concurrent.CountDownLatch;
-import org.apache.servicecomb.pack.alpha.core.fsm.CompensateAckType;
+public class ElasticsearchProperties {
 
-public class CompensateAckCountDownLatch extends CountDownLatch {
-  private CompensateAckType type;
+  private String uris;
+  // TODO
+  //  Size of bulk request, When this value is greater than 0, the batch data will be lost when the jvm crashes.
+  //  In the future, we can use Kafka to solve this problem instead of storing it directly in the ES.
+  private int batchSize = 100;
+  private int refreshTime = 5000;
 
-  public CompensateAckCountDownLatch(int count) {
-    super(count);
+  public String getUris() {
+    return uris;
   }
 
-  public CompensateAckType getType() {
-    return type;
+  public void setUris(String uris) {
+    this.uris = uris;
   }
 
-  public void countDown(CompensateAckType type) {
-    this.type = type;
-    super.countDown();
+  public int getBatchSize() {
+    return batchSize;
+  }
+
+  public void setBatchSize(int batchSize) {
+    this.batchSize = batchSize;
+  }
+
+  public int getRefreshTime() {
+    return refreshTime;
+  }
+
+  public void setRefreshTime(int refreshTime) {
+    this.refreshTime = refreshTime;
   }
 }
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java
similarity index 62%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java
index 188cc161..7b235a87 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/CompensateAckCountDownLatch.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java
@@ -15,24 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-import java.util.concurrent.CountDownLatch;
-import org.apache.servicecomb.pack.alpha.core.fsm.CompensateAckType;
+public class RepositoryProperties {
+  private String name;
 
-public class CompensateAckCountDownLatch extends CountDownLatch {
-  private CompensateAckType type;
+  private ElasticsearchProperties elasticsearch;
 
-  public CompensateAckCountDownLatch(int count) {
-    super(count);
+  public String getName() {
+    return name;
   }
 
-  public CompensateAckType getType() {
-    return type;
+  public void setName(String name) {
+    this.name = name;
   }
 
-  public void countDown(CompensateAckType type) {
-    this.type = type;
-    super.countDown();
+  public ElasticsearchProperties getElasticsearch() {
+    return elasticsearch;
+  }
+
+  public void setElasticsearch(
+      ElasticsearchProperties elasticsearch) {
+    this.elasticsearch = elasticsearch;
   }
 }
\ No newline at end of file
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java
similarity index 57%
copy from omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
copy to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java
index 021cbaea..dc327e42 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java
@@ -15,15 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.omega.spring;
+package org.apache.servicecomb.pack.alpha.fsm.properties;
 
-import org.apache.servicecomb.pack.omega.transaction.spring.TransactionAspectConfig;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 
 @Configuration
-@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})
-@ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)
-public class OmegaSpringAutoConfiguration {
-}
+@ConfigurationProperties(prefix = "alpha.spec.saga.akka")
+public class SpecSagaAkkaProperties {
+
+  private ChannelProperties channel;
+  private RepositoryProperties repository;
+
+  public ChannelProperties getChannel() {
+    return channel;
+  }
+
+  public void setChannel(ChannelProperties channel) {
+    this.channel = channel;
+  }
+
+  public RepositoryProperties getRepository() {
+    return repository;
+  }
+
+  public void setRepository(
+      RepositoryProperties repository) {
+    this.repository = repository;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
index 0dc75939..2b5eea34 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
@@ -17,8 +17,8 @@
 
 package org.apache.servicecomb.pack.alpha.fsm.repository;
 
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 
 public abstract class AbstractTransactionRepositoryChannel implements TransactionRepositoryChannel {
 
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
similarity index 95%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
index 9e1f0c7f..1c9e2421 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
@@ -29,6 +29,7 @@ import java.util.stream.Collectors;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.properties.ElasticsearchProperties;
 import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
 import org.elasticsearch.action.search.SearchType;
 import org.elasticsearch.index.query.QueryBuilders;
@@ -63,13 +64,12 @@ public class ElasticsearchTransactionRepository implements TransactionRepository
   private final List<IndexQuery> queries = new ArrayList<>();
   private final Object lock = new Object();
 
-  public ElasticsearchTransactionRepository(
-      ElasticsearchRestTemplate template, MetricsService metricsService, int batchSize,
-      int refreshTime) {
-    this.template = template;
+  public ElasticsearchTransactionRepository(ElasticsearchProperties elasticsearchProperties,
+      ElasticsearchRestTemplate elasticsearchRestTemplate, MetricsService metricsService) {
+    this.template = elasticsearchRestTemplate;
+    this.batchSize = elasticsearchProperties.getBatchSize();
+    this.refreshTime = elasticsearchProperties.getRefreshTime();
     this.metricsService = metricsService;
-    this.batchSize = batchSize;
-    this.refreshTime = refreshTime;
     if (this.refreshTime > 0) {
       new Thread(new RefreshTimer(), "elasticsearch-repository-refresh").start();
     }
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
similarity index 97%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
index 566694de..31c12a57 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
@@ -18,13 +18,16 @@
 package org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka;
 
 import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.core.env.EnumerablePropertySource;
 import org.springframework.core.env.PropertySource;
-
-import java.util.*;
 import org.springframework.core.env.StandardEnvironment;
 
 public class AkkaConfigPropertyAdapter {
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
index 62e6fb3d..b91c27ad 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
@@ -24,12 +24,12 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.core.fsm.TransactionType;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.SagaSubTransaction;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
 import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepositoryChannel;
 import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension.SagaDataExt;
 import org.slf4j.Logger;
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
similarity index 100%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/FsmSagaDataController.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/FsmSagaDataController.java
rename to alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java
index 44113e18..a430355c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/fsm/FsmSagaDataController.java
+++ b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.fsm;
+package org.apache.servicecomb.pack.alpha.fsm.test;
 
 import akka.actor.ActorSystem;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -45,7 +45,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 @Profile("test")
 @ConditionalOnProperty(name= "alpha.feature.akka.enabled", havingValue = "true")
 // Only export this Controller for test
-class FsmSagaDataController {
+public class FsmSagaDataController {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @Autowired
diff --git a/persistence/persistence-jpa/src/main/resources/META-INF/spring.factories b/alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories
similarity index 88%
rename from persistence/persistence-jpa/src/main/resources/META-INF/spring.factories
rename to alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories
index f18c6a52..e43b6111 100644
--- a/persistence/persistence-jpa/src/main/resources/META-INF/spring.factories
+++ b/alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories
@@ -14,5 +14,5 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-  org.apache.servicecomb.pack.persistence.jpa.EclipseLinkJpaConfiguration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration= \
+  org.apache.servicecomb.pack.alpha.fsm.AlphaSpecSagaFsmAutoConfiguration
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaApplication.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
similarity index 94%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaApplication.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
index 7c140003..52cb4495 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaApplication.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.it;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaIntegrationTest.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
similarity index 93%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaIntegrationTest.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
index a94760bd..3d53fc00 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaIntegrationTest.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.it;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.awaitility.Awaitility.await;
@@ -27,6 +27,8 @@ import static org.mockito.Mockito.when;
 import akka.actor.ActorSystem;
 import java.util.UUID;
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.util.SagaEventSender;
 import org.apache.servicecomb.pack.alpha.fsm.channel.memory.MemoryActorEventChannel;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
@@ -47,18 +49,21 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {SagaApplication.class},
     properties = {
-        //akka
-        "alpha.feature.akka.enabled=true",
+        // saga-akka
+        "alpha.spec.names=saga-akka",
+        // akka
         "akkaConfig.akka.persistence.journal.plugin=akka.persistence.journal.inmem",
         "akkaConfig.akka.persistence.journal.leveldb.dir=target/example/journal",
         "akkaConfig.akka.persistence.snapshot-store.plugin=akka.persistence.snapshot-store.local",
         "akkaConfig.akka.persistence.snapshot-store.local.dir=target/example/snapshots",
-        //elasticsearch
-        "alpha.feature.akka.transaction.repository.channel.type=memory",
-        "alpha.feature.akka.transaction.repository.type=elasticsearch",
-        "alpha.feature.akka.transaction.repository.elasticsearch.batchSize=0",
-        "spring.data.elasticsearch.cluster-name=elasticsearch",
-        "spring.data.elasticsearch.cluster-nodes=localhost:9300"
+        // channel
+        "alpha.spec.saga.akka.channel.name=memory",
+        "alpha.spec.saga.akka.channel.memory.max-length=-1",
+        // elasticsearch
+        "alpha.spec.saga.akka.repository.name=elasticsearch",
+        "alpha.spec.saga.akka.repository.elasticsearch.uris=localhost:9300",
+        "alpha.spec.saga.akka.repository.elasticsearch.batch-size=0",
+        "alpha.spec.saga.akka.repository.elasticsearch.refresh-time=5000"
     })
 public class SagaIntegrationTest {
 
@@ -347,9 +352,14 @@ public class SagaIntegrationTest {
     assertNotNull(sagaData.getBeginTime());
     assertNotNull(sagaData.getEndTime());
     assertEquals(sagaData.getTxEntities().size(),3);
-    assertEquals(sagaData.getTxEntities().get(localTxId_1).getState(),TxState.COMPENSATED_SUCCEED);
-    assertEquals(sagaData.getTxEntities().get(localTxId_2).getState(),TxState.COMPENSATED_SUCCEED);
-    assertEquals(sagaData.getTxEntities().get(localTxId_3).getState(),TxState.FAILED);
+    await().atMost(60, SECONDS).until(() -> {
+      return sagaData.getTxEntities().get(localTxId_1) != null
+          && sagaData.getTxEntities().get(localTxId_2) != null
+          && sagaData.getTxEntities().get(localTxId_3) != null;
+    });
+    assertEquals(TxState.COMPENSATED_SUCCEED, sagaData.getTxEntities().get(localTxId_1).getState());
+    assertEquals(TxState.COMPENSATED_SUCCEED, sagaData.getTxEntities().get(localTxId_2).getState());
+    assertEquals(TxState.FAILED, sagaData.getTxEntities().get(localTxId_3).getState());
   }
 
 }
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorTest.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
similarity index 98%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorTest.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
index 8b3a7e49..76745f92 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorTest.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.ut;
 
 import static org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER;
+import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -38,8 +38,12 @@ import java.util.Map;
 import java.util.UUID;
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActor;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.util.SagaEventSender;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
+import org.apache.servicecomb.pack.alpha.fsm.properties.ElasticsearchProperties;
 import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
 import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepositoryChannel;
 import org.apache.servicecomb.pack.alpha.fsm.repository.channel.DefaultTransactionRepositoryChannel;
@@ -47,6 +51,7 @@ import org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch.Elasticsea
 import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
 import org.junit.After;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -58,8 +63,6 @@ import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
 import org.springframework.data.elasticsearch.core.IndexOperations;
 import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
 
-import static org.hamcrest.CoreMatchers.*;
-
 @RunWith(MockitoJUnitRunner.class)
 public class SagaActorTest {
 
@@ -68,6 +71,9 @@ public class SagaActorTest {
   @Mock
   ElasticsearchRestTemplate template;
 
+  @Mock
+  ElasticsearchProperties elasticsearchProperties;
+
   static MetricsService metricsService = new MetricsService();
 
   private static Map<String,Object> getPersistenceMemConfig(){
@@ -107,7 +113,7 @@ public class SagaActorTest {
   public void before(){
     when(template.indexOps(ArgumentMatchers.any(IndexCoordinates.class))).thenReturn(mock(IndexOperations.class));
 
-    TransactionRepository repository = new ElasticsearchTransactionRepository(template, metricsService, 0,0);
+    TransactionRepository repository = new ElasticsearchTransactionRepository(elasticsearchProperties, template, metricsService);
     TransactionRepositoryChannel repositoryChannel = new DefaultTransactionRepositoryChannel(repository, metricsService);
     SAGA_DATA_EXTENSION_PROVIDER.get(system).setRepositoryChannel(repositoryChannel);
   }
@@ -150,7 +156,7 @@ public class SagaActorTest {
 
       //expect
       CurrentState currentState = expectMsgClass(PersistentFSM.CurrentState.class);
-      assertEquals(SagaActorState.IDLE, currentState.state());
+      Assert.assertEquals(SagaActorState.IDLE, currentState.state());
 
       PersistentFSM.Transition transition = expectMsgClass(PersistentFSM.Transition.class);
       assertSagaTransition(transition, saga, SagaActorState.IDLE, SagaActorState.READY);
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/api/APIv1ControllerTest.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
similarity index 95%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/api/APIv1ControllerTest.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
index bb9b3b5b..887f4877 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/api/APIv1ControllerTest.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.api;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.ut.api;
 
 import static org.hamcrest.Matchers.hasSize;
 import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -34,7 +35,6 @@ import java.util.Map;
 import java.util.UUID;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.core.fsm.TransactionType;
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.SagaEndedEvent;
@@ -42,32 +42,29 @@ import org.apache.servicecomb.pack.alpha.core.fsm.event.SagaStartedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxEndedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxStartedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
-import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.SagaSubTransaction;
-import org.apache.servicecomb.pack.alpha.server.AlphaApplication;
-import org.apache.servicecomb.pack.alpha.server.AlphaConfig;
-import org.apache.servicecomb.pack.alpha.server.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
+import org.apache.servicecomb.pack.alpha.fsm.api.APIv1Controller;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
 import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-
 @RunWith(SpringRunner.class)
-@AutoConfigureMockMvc
-@SpringBootTest(classes = {AlphaApplication.class, AlphaConfig.class})
+@ContextConfiguration(classes = {TestConfiguration.class})
+@WebMvcTest(APIv1Controller.class)
 public class APIv1ControllerTest {
 
   @Autowired
@@ -76,16 +73,16 @@ public class APIv1ControllerTest {
   @Autowired
   AlphaMetricsEndpoint alphaMetricsEndpoint;
 
-  @MockBean
+  @Autowired
   MetricsService metricsService;
 
-  @MockBean
+  @Autowired
   NodeStatus nodeStatus;
 
-  @MockBean
+  @Autowired
   ElasticsearchRestTemplate template;
 
-  @MockBean
+  @Autowired
   TransactionRepository transactionRepository;
 
   @Test
@@ -193,7 +190,7 @@ public class APIv1ControllerTest {
         .globalTransactions(globalTransactions)
         .build();
 
-    when(transactionRepository.getGlobalTransactions(null,0, 50)).thenReturn(paging);
+    when(transactionRepository.getGlobalTransactions(null, 0, 50)).thenReturn(paging);
 
     ObjectMapper mapper = new ObjectMapper();
     mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
@@ -281,12 +278,13 @@ public class APIv1ControllerTest {
         .subTransactions(subTransactions)
         .build();
 
-    when(transactionRepository.getGlobalTransactionByGlobalTxId(globalTxId)).thenReturn(globalTransaction);
+    when(transactionRepository.getGlobalTransactionByGlobalTxId(globalTxId)).thenReturn(
+        globalTransaction);
 
     ObjectMapper mapper = new ObjectMapper();
     mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
     mapper.configure(Feature.QUOTE_NON_NUMERIC_NUMBERS, false);
-    mockMvc.perform(get("/alpha/api/v1/transaction/"+globalTxId))
+    mockMvc.perform(get("/alpha/api/v1/transaction/" + globalTxId))
         .andDo(print())
         .andExpect(status().isOk())
         .andExpect(
@@ -334,7 +332,7 @@ public class APIv1ControllerTest {
   @Test
   public void transactionSlowTest() throws Exception {
     List<GlobalTransaction> globalTransactions = new ArrayList<>();
-    for(int i=0;i<10;i++){
+    for (int i = 0; i < 10; i++) {
       globalTransactions.add(GlobalTransaction.builder()
           .beginTime(new Date())
           .endTime(new Date())
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
new file mode 100644
index 00000000..1d5dc6b1
--- /dev/null
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
@@ -0,0 +1,60 @@
+/*
+ * 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.servicecomb.pack.alpha.spec.saga.akka.ut.api;
+
+import org.apache.servicecomb.pack.alpha.core.NodeStatus;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.fsm.api.APIv1Controller;
+import org.apache.servicecomb.pack.alpha.fsm.api.APIv1Impl;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
+
+@Configuration
+public class TestConfiguration {
+  @MockBean
+  MetricsService metricsService;
+
+  @MockBean
+  NodeStatus nodeStatus;
+
+  @MockBean
+  ElasticsearchRestTemplate template;
+
+  @MockBean
+  TransactionRepository transactionRepository;
+
+  @Bean
+  AlphaMetricsEndpoint alphaMetricsEndpoint(){
+    return new AlphaMetricsEndpointImpl();
+  }
+
+  @Bean
+  APIv1Controller apIv1Controller(){
+    return new APIv1Controller();
+  }
+
+  @Bean
+  APIv1Impl apIv1(){
+    return new APIv1Impl();
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntitiesTest.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
similarity index 91%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntitiesTest.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
index 2ffb16a8..c647dd6d 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntitiesTest.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.model;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.ut.model;
 
 import static org.junit.Assert.assertTrue;
 
@@ -26,6 +26,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.UUID;
+import org.apache.servicecomb.pack.alpha.fsm.model.TxEntities;
+import org.apache.servicecomb.pack.alpha.fsm.model.TxEntity;
 import org.junit.Test;
 
 public class TxEntitiesTest {
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/repository/ElasticsearchTransactionRepositoryTest.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
similarity index 83%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/repository/ElasticsearchTransactionRepositoryTest.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
index 4437da84..4a99444c 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/repository/ElasticsearchTransactionRepositoryTest.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.repository;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.ut.repository;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.awaitility.Awaitility.await;
@@ -26,11 +26,13 @@ import static org.mockito.Mockito.when;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.UUID;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.core.fsm.TransactionType;
+import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
+import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
 import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.fsm.properties.ElasticsearchProperties;
+import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
 import org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch.ElasticsearchTransactionRepository;
-import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,10 +59,10 @@ public class ElasticsearchTransactionRepositoryTest {
 
   @Test
   public void syncTest() throws Exception {
-    int refreshTime = 0;
-    int batchSize = 0;
-    TransactionRepository repository = new ElasticsearchTransactionRepository(template,
-        metricsService, batchSize, refreshTime);
+    ElasticsearchProperties elasticsearchProperties = new ElasticsearchProperties();
+    elasticsearchProperties.setBatchSize(0);
+    elasticsearchProperties.setRefreshTime(0);
+    TransactionRepository repository = new ElasticsearchTransactionRepository(elasticsearchProperties, template, metricsService);
     int size = 100;
     for (int i = 0; i < size; i++) {
       final String globalTxId = UUID.randomUUID().toString();
@@ -88,10 +90,11 @@ public class ElasticsearchTransactionRepositoryTest {
   @Test
   public void syncWithRefreshTimeTest() throws Exception {
     int size = 100;
-    int refreshTime = 2;
-    int batchSize = 0;
-    TransactionRepository repository = new ElasticsearchTransactionRepository(template,
-        metricsService, batchSize, refreshTime * 1000);
+    ElasticsearchProperties elasticsearchProperties = new ElasticsearchProperties();
+    elasticsearchProperties.setBatchSize(0);
+    elasticsearchProperties.setRefreshTime(2000);
+    TransactionRepository repository = new ElasticsearchTransactionRepository(elasticsearchProperties,
+        template, metricsService);
     for (int i = 0; i < size; i++) {
       final String globalTxId = UUID.randomUUID().toString();
       GlobalTransaction transaction = GlobalTransaction.builder()
@@ -117,10 +120,11 @@ public class ElasticsearchTransactionRepositoryTest {
   @Test
   public void asyncWithBatchSizeAndRefreshTimeTest() throws Exception {
     int size = 15;
-    int refreshTime = 2;
-    int batchSize = 10;
-    TransactionRepository repository = new ElasticsearchTransactionRepository(template,
-        metricsService, batchSize, refreshTime * 1000);
+    ElasticsearchProperties elasticsearchProperties = new ElasticsearchProperties();
+    elasticsearchProperties.setBatchSize(10);
+    elasticsearchProperties.setRefreshTime(2000);
+    TransactionRepository repository = new ElasticsearchTransactionRepository(elasticsearchProperties,
+        template, metricsService);
     for (int i = 0; i < size; i++) {
       final String globalTxId = UUID.randomUUID().toString();
       GlobalTransaction transaction = GlobalTransaction.builder()
@@ -137,7 +141,7 @@ public class ElasticsearchTransactionRepositoryTest {
           .build();
       repository.send(transaction);
     }
-    await().atMost(refreshTime + 10, SECONDS).until(
+    await().atMost(2000 + 10, SECONDS).until(
         () -> metricsService.metrics().getRepositoryAccepted() == metricsService.metrics()
             .getRepositoryReceived());
     assertEquals(metricsService.metrics().getRepositoryAccepted(), size);
diff --git a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaEventSender.java b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
similarity index 99%
rename from alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaEventSender.java
rename to alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
index 1f0d7924..48d4c699 100644
--- a/alpha/alpha-fsm/src/test/java/org/apache/servicecomb/pack/alpha/fsm/SagaEventSender.java
+++ b/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.util;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,7 +26,6 @@ import org.apache.servicecomb.pack.alpha.core.fsm.event.SagaTimeoutEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxAbortedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckFailedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckSucceedEvent;
-import org.apache.servicecomb.pack.alpha.core.fsm.event.TxCompensateAckSucceedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxEndedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxStartedEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
diff --git a/alpha/alpha-fsm/src/test/resources/application.yaml b/alpha/alpha-spec-saga-fsm/src/test/resources/application.yaml
similarity index 100%
rename from alpha/alpha-fsm/src/test/resources/application.yaml
rename to alpha/alpha-spec-saga-fsm/src/test/resources/application.yaml
diff --git a/alpha/alpha-fsm/src/test/resources/log4j2.xml b/alpha/alpha-spec-saga-fsm/src/test/resources/log4j2.xml
similarity index 100%
rename from alpha/alpha-fsm/src/test/resources/log4j2.xml
rename to alpha/alpha-spec-saga-fsm/src/test/resources/log4j2.xml
diff --git a/persistence/pom.xml b/alpha/alpha-spec-tcc-db/pom.xml
similarity index 54%
rename from persistence/pom.xml
rename to alpha/alpha-spec-tcc-db/pom.xml
index 8bffff8c..865b1f4f 100644
--- a/persistence/pom.xml
+++ b/alpha/alpha-spec-tcc-db/pom.xml
@@ -20,17 +20,42 @@
   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>pack-dependencies</artifactId>
+    <artifactId>alpha</artifactId>
     <groupId>org.apache.servicecomb.pack</groupId>
     <version>0.7.0-SNAPSHOT</version>
-    <relativePath>../pack-dependencies</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>persistence</artifactId>
-  <name>Pack::Persistence</name>
-  <packaging>pom</packaging>
-  <modules>
-    <module>persistence-jpa</module>
-  </modules>
-</project>
+  <artifactId>alpha-spec-tcc-db</artifactId>
+  <name>Pack::Alpha::Specification::Tcc::DB</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-autoconfigure</artifactId>
+    </dependency>
+
+    <!-- servicecomb -->
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>pack-contract-grpc</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>alpha-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.pack</groupId>
+      <artifactId>alpha-persistence-jpa</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaSpecTccDbAutoConfiguration.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaSpecTccDbAutoConfiguration.java
new file mode 100644
index 00000000..b2f62eba
--- /dev/null
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/AlphaSpecTccDbAutoConfiguration.java
@@ -0,0 +1,147 @@
+/*
+ * 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.servicecomb.pack.alpha.spec.tcc.db;
+
+import java.lang.invoke.MethodHandles;
+import org.apache.servicecomb.pack.alpha.core.api.APIv1;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.api.TccDbAPIv1Controller;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.api.TccDbAPIv1Impl;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallbackWrapper;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.TccCallbackEngine;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.TccPendingTaskRunner;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.properties.SpecTccDbProperties;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.MemoryTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.RDBTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccEventScanner;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventService;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.test.AlphaTccEventController;
+import org.apache.servicecomb.pack.persistence.jpa.EclipseLinkJpaConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@ImportAutoConfiguration({SpecTccDbProperties.class, EclipseLinkJpaConfiguration.class})
+@ConditionalOnExpression("'${alpha.spec.names}'.contains('tcc-db')")
+@EnableJpaRepositories(basePackages = "org.apache.servicecomb.pack.alpha.spec.tcc.db")
+public class AlphaSpecTccDbAutoConfiguration {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  @Value("${alpha.compensation.retry.delay:3000}")
+  private int delay;
+
+  @Value("${alpha.tx.timeout-seconds:600}")
+  private int globalTxTimeoutSeconds;
+
+  public AlphaSpecTccDbAutoConfiguration() {
+    LOG.info("Alpha Specification Tcc DB");
+  }
+
+  @Bean
+  @Primary
+  public DataSourceProperties dataSourceProperties(SpecTccDbProperties specTccDbProperties) {
+    return specTccDbProperties.getDatasource();
+  }
+
+  @Bean
+  TccTxEventRepository tccTxEventRepository(SpecTccDbProperties specTccDbProperties) {
+    if (specTccDbProperties.isMemoryMode()) {
+      return new MemoryTxEventRepository();
+    } else {
+      return new RDBTxEventRepository();
+    }
+  }
+
+  @Bean
+  TccCallbackEngine tccCallbackEngine() {
+    return new TccCallbackEngine();
+  }
+
+  @Bean
+  TccTxEventService tccTxEventService(TccTxEventRepository tccTxEventRepository,
+      TccCallbackEngine tccCallbackEngine) {
+    return new TccTxEventService(tccTxEventRepository, tccCallbackEngine);
+  }
+
+  @Bean
+  TccPendingTaskRunner tccPendingTaskRunner() {
+    return new TccPendingTaskRunner(delay);
+  }
+
+  @Bean
+  OmegaCallbackWrapper omegaCallbackWrapper(TccPendingTaskRunner tccPendingTaskRunner) {
+    return new OmegaCallbackWrapper(tccPendingTaskRunner);
+  }
+
+  @Bean
+  GrpcTccEventService grpcTccEventService(TccTxEventService tccTxEventService,
+      TccPendingTaskRunner tccPendingTaskRunner, TccEventScanner tccEventScanner) {
+    // start the service which are needed for TCC
+    tccPendingTaskRunner.start();
+    tccEventScanner.start();
+    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+      tccPendingTaskRunner.shutdown();
+      tccEventScanner.shutdown();
+    }));
+    return new GrpcTccEventService(tccTxEventService);
+  }
+
+  @Bean
+  TccEventScanner tccEventScanner(TccTxEventService tccTxEventService) {
+    return new TccEventScanner(tccTxEventService, delay, globalTxTimeoutSeconds);
+  }
+
+  @Bean
+  public MetricsService metricsService() {
+    return new MetricsService();
+  }
+
+  @Bean
+  AlphaMetricsEndpoint alphaMetricsEndpoint(){
+    return new AlphaMetricsEndpointImpl();
+  }
+
+  @Bean
+  TccDbAPIv1Controller apIv1Controller(){
+    return new TccDbAPIv1Controller();
+  }
+
+  @Bean
+  APIv1 apIv1(){
+    return new TccDbAPIv1Impl();
+  }
+
+  @Bean
+  @Profile("test")
+  AlphaTccEventController alphaTccEventController(TccTxEventRepository tccTxEventRepository){
+    return new AlphaTccEventController(tccTxEventRepository);
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/GrpcTccEventService.java
similarity index 82%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/GrpcTccEventService.java
index 2c00932c..d7330c4b 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/GrpcTccEventService.java
@@ -15,15 +15,23 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db;
 
 import io.grpc.stub.StreamObserver;
 import java.lang.invoke.MethodHandles;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallback;
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventService;
-import org.apache.servicecomb.pack.contract.grpc.*;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallback;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.OmegaCallbacksRegistry;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.EventConverter;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventService;
+import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
+import org.apache.servicecomb.pack.contract.grpc.GrpcParticipationEndedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcParticipationStartedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
+import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Controller.java
similarity index 58%
copy from alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
copy to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Controller.java
index 67ebcc50..0087b372 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/api/APIv1.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Controller.java
@@ -15,25 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.core.api;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.api;
 
-import java.util.List;
-import java.util.Map;
-import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
-import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
+import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 
-public interface APIv1 {
+@RequestMapping("/alpha/api/v1")
+public class TccDbAPIv1Controller {
 
-  AlphaMetrics getMetrics();
+  @Autowired
+  APIv1 apIv1;
 
-  GlobalTransaction getTransactionByGlobalTxId(String globalTxId)
-      throws Exception;
-
-  PagingGlobalTransactions getTransactions(String state, int page, int size)
-      throws Exception;
-
-  Map<String, Long> getTransactionStatistics();
-
-  List<GlobalTransaction> getSlowTransactions(int size);
+  @GetMapping(value = "/metrics")
+  public ResponseEntity<AlphaMetrics> metrics() {
+    return ResponseEntity.ok(apIv1.getMetrics());
+  }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Impl.java
similarity index 63%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Impl.java
index edd7b784..a2ff7556 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/api/APIv1Impl.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/api/TccDbAPIv1Impl.java
@@ -15,28 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.api;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.api;
 
 import java.util.List;
 import java.util.Map;
+import javax.transaction.NotSupportedException;
 import org.apache.servicecomb.pack.alpha.core.api.APIv1;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalTransactions;
 import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetrics;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
-import org.apache.servicecomb.pack.alpha.server.metrics.AlphaMetricsEndpoint;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
-public class APIv1Impl implements APIv1 {
+public class TccDbAPIv1Impl implements APIv1 {
 
   @Autowired
   AlphaMetricsEndpoint alphaMetricsEndpoint;
 
-  @Autowired(required = false)
-  TransactionRepository transactionRepository;
-
   public AlphaMetrics getMetrics() {
     AlphaMetrics alphaMetrics = new AlphaMetrics();
     alphaMetrics.setMetrics(alphaMetricsEndpoint.getMetrics());
@@ -44,25 +39,24 @@ public class APIv1Impl implements APIv1 {
     return alphaMetrics;
   }
 
-  public GlobalTransaction getTransactionByGlobalTxId(String globalTxId)
-      throws Exception {
-    GlobalTransaction globalTransaction = transactionRepository
-        .getGlobalTransactionByGlobalTxId(globalTxId);
-    return globalTransaction;
+  @Override
+  public GlobalTransaction getTransactionByGlobalTxId(String globalTxId) throws Exception {
+    throw new NotSupportedException();
   }
 
+  @Override
   public PagingGlobalTransactions getTransactions(String state, int page, int size)
       throws Exception {
-    PagingGlobalTransactions pagingGlobalTransactions = transactionRepository
-        .getGlobalTransactions(state, page, size);
-    return pagingGlobalTransactions;
+    throw new NotSupportedException();
   }
 
-  public Map<String, Long> getTransactionStatistics() {
-    return transactionRepository.getTransactionStatistics();
+  @Override
+  public Map<String, Long> getTransactionStatistics() throws Exception {
+    throw new NotSupportedException();
   }
 
-  public List<GlobalTransaction> getSlowTransactions(int size) {
-    return transactionRepository.getSlowGlobalTransactionsTopN(size);
+  @Override
+  public List<GlobalTransaction> getSlowTransactions(int size) throws Exception {
+    throw new NotSupportedException();
   }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/CallbackEngine.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/CallbackEngine.java
similarity index 86%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/CallbackEngine.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/CallbackEngine.java
index 5aaa4f06..88052b2e 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/CallbackEngine.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/CallbackEngine.java
@@ -15,9 +15,9 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
 
 public interface CallbackEngine {
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/GrpcOmegaTccCallback.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/GrpcOmegaTccCallback.java
similarity index 93%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/GrpcOmegaTccCallback.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/GrpcOmegaTccCallback.java
index 3de49665..c7c8c3fe 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/GrpcOmegaTccCallback.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/GrpcOmegaTccCallback.java
@@ -15,11 +15,10 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
 import io.grpc.stub.StreamObserver;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallback.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallback.java
similarity index 87%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallback.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallback.java
index 7d57d8e5..11b4c9e9 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallback.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallback.java
@@ -15,9 +15,9 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 
 public interface OmegaCallback {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbackWrapper.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbackWrapper.java
similarity index 89%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbackWrapper.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbackWrapper.java
index fb5d37f9..6ce604f3 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbackWrapper.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbackWrapper.java
@@ -15,15 +15,12 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
 import java.util.concurrent.BlockingQueue;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
 import org.apache.servicecomb.pack.common.TransactionStatus;
-import org.springframework.stereotype.Component;
 
-@Component
 public class OmegaCallbackWrapper implements OmegaCallback {
 
   private final BlockingQueue<Runnable> pendingTasks;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbacksRegistry.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbacksRegistry.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbacksRegistry.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbacksRegistry.java
index 61a509cb..0485a63d 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/OmegaCallbacksRegistry.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/OmegaCallbacksRegistry.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
 import static java.util.Collections.emptyMap;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccCallbackEngine.java
similarity index 87%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccCallbackEngine.java
index 5bf33626..fcc0e313 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccCallbackEngine.java
@@ -15,20 +15,18 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
 import java.lang.invoke.MethodHandles;
 import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventRepository;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-@Component
+
 public class TccCallbackEngine implements CallbackEngine {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccPendingTaskRunner.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccPendingTaskRunner.java
similarity index 96%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccPendingTaskRunner.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccPendingTaskRunner.java
index a248e044..5b303baa 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccPendingTaskRunner.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/callback/TccPendingTaskRunner.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.callback;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.callback;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverter.java
similarity index 93%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverter.java
index 3748d3d7..6193c65e 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/EventConverter.java
@@ -15,10 +15,14 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import org.apache.servicecomb.pack.common.TransactionStatus;
-import org.apache.servicecomb.pack.contract.grpc.*;
+import org.apache.servicecomb.pack.contract.grpc.GrpcParticipationEndedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcParticipationStartedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
+import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
 
 public class EventConverter {
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEvent.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEvent.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEvent.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEvent.java
index 96c8055a..9b48af11 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEvent.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEvent.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import java.util.Date;
 import java.util.Objects;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEventRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEventRepository.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEventRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEventRepository.java
index 3dc172dd..9d169cf2 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/GlobalTxEventRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/GlobalTxEventRepository.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import java.util.Date;
 import java.util.List;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEvent.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEvent.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEvent.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEvent.java
index e669c4ef..1029050d 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEvent.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEvent.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import java.util.Date;
 import java.util.Objects;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEventRepository.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEventRepository.java
index 88cd4c14..798ecb0c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/ParticipatedEventRepository.java
@@ -15,18 +15,16 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import java.util.List;
 import java.util.Optional;
-
+import javax.transaction.Transactional;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
 
-import javax.transaction.Transactional;
-
 public interface ParticipatedEventRepository extends CrudRepository<ParticipatedEvent, Long> {
 
   @Query(value = "SELECT t FROM ParticipatedEvent AS t WHERE t.globalTxId = ?1")
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEvent.java
similarity index 98%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEvent.java
index 52378388..4cf70e4a 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEvent.java
@@ -15,12 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 
 import java.util.Date;
 import java.util.Objects;
-
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEventDBRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEventDBRepository.java
similarity index 96%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEventDBRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEventDBRepository.java
index 4b865dc9..c5ea3800 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEventDBRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxEventDBRepository.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 import java.util.List;
 import java.util.Optional;
-
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxType.java
similarity index 93%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxType.java
index 343f0fe6..b0e9130c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/jpa/TccTxType.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa;
 
 public enum TccTxType {
   STARTED,
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/AlphaMetricsEndpointImpl.java
similarity index 86%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/AlphaMetricsEndpointImpl.java
index 4a888909..34fbab4f 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/metrics/AlphaMetricsEndpoint.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/AlphaMetricsEndpointImpl.java
@@ -15,24 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.metrics;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
+import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 @Component
-public class AlphaMetricsEndpoint {
+public class AlphaMetricsEndpointImpl implements AlphaMetricsEndpoint {
 
   @Autowired
   @Lazy
   private NodeStatus nodeStatus;
 
-  @Autowired(required = false)
+  @Autowired
   MetricsService metricsService;
 
   public MetricsBean getMetrics() {
diff --git a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/MetricsService.java
similarity index 94%
rename from alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/MetricsService.java
index aa085fc6..33dbc883 100644
--- a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/metrics/MetricsService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.metrics;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
 
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/properties/SpecTccDbProperties.java
similarity index 55%
copy from omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
copy to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/properties/SpecTccDbProperties.java
index 021cbaea..2943f9a4 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/properties/SpecTccDbProperties.java
@@ -15,15 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.omega.spring;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.properties;
 
-import org.apache.servicecomb.pack.omega.transaction.spring.TransactionAspectConfig;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 
 @Configuration
-@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})
-@ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)
-public class OmegaSpringAutoConfiguration {
-}
+@ConfigurationProperties(prefix = "alpha.spec.tcc.db")
+public class SpecTccDbProperties {
+  private boolean memoryMode = false;
+  private DataSourceProperties datasource;
+
+  public boolean isMemoryMode() {
+    return memoryMode;
+  }
+
+  public void setMemoryMode(boolean memoryMode) {
+    this.memoryMode = memoryMode;
+  }
+
+  public DataSourceProperties getDatasource() {
+    return datasource;
+  }
+
+  public void setDatasource(DataSourceProperties datasource) {
+    this.datasource = datasource;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryTxEventRepository.java
similarity index 88%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryTxEventRepository.java
index 3fadb53e..6d696095 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/MemoryTxEventRepository.java
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
@@ -27,20 +27,15 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.EventConverter;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Profile;
 import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Component;
 
-@Component
-@Profile("memory")
 public class MemoryTxEventRepository implements TccTxEventRepository {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/RDBTxEventRepository.java
similarity index 83%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/RDBTxEventRepository.java
index 5841ce9c..4697abe6 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/RDBTxEventRepository.java
@@ -15,28 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEventRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEventDBRepository;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.EventConverter;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEventDBRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Profile;
 import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-@Component
-@Profile("!memory")
 public class RDBTxEventRepository implements TccTxEventRepository {
 
   @Autowired
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccEventScanner.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccEventScanner.java
similarity index 97%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccEventScanner.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccEventScanner.java
index 58124148..e5e97d42 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccEventScanner.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccEventScanner.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventRepository.java
similarity index 83%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventRepository.java
index f6478dc4..34b85ec5 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventRepository.java
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
 import org.springframework.data.domain.Pageable;
 
 public interface TccTxEventRepository {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventService.java
similarity index 93%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventService.java
index f0a8f198..4706e9c6 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/service/TccTxEventService.java
@@ -15,23 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc.service;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.service;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Date;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.callback.TccCallbackEngine;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.callback.TccCallbackEngine;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.GlobalTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.ParticipatedEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxType;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.stereotype.Component;
 
-@Component
 public class TccTxEventService {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventController.java b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/test/AlphaTccEventController.java
similarity index 92%
rename from alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventController.java
rename to alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/test/AlphaTccEventController.java
index 238969b9..2cfdaae7 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccEventController.java
+++ b/alpha/alpha-spec-tcc-db/src/main/java/org/apache/servicecomb/pack/alpha/spec/tcc/db/test/AlphaTccEventController.java
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.server.tcc;
+package org.apache.servicecomb.pack.alpha.spec.tcc.db.test;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-
-import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
-import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventRepository;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.jpa.TccTxEvent;
+import org.apache.servicecomb.pack.alpha.spec.tcc.db.service.TccTxEventRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Profile;
@@ -33,12 +34,8 @@ import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-
 @Controller
 @RequestMapping("/tcc")
-@Profile("test")
 public class AlphaTccEventController {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
diff --git a/alpha/alpha-fsm/src/main/resources/META-INF/spring.factories b/alpha/alpha-spec-tcc-db/src/main/resources/META-INF/spring.factories
similarity index 86%
rename from alpha/alpha-fsm/src/main/resources/META-INF/spring.factories
rename to alpha/alpha-spec-tcc-db/src/main/resources/META-INF/spring.factories
index ff42cddf..60803c72 100644
--- a/alpha/alpha-fsm/src/main/resources/META-INF/spring.factories
+++ b/alpha/alpha-spec-tcc-db/src/main/resources/META-INF/spring.factories
@@ -14,4 +14,6 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apache.servicecomb.pack.alpha.fsm.FsmAutoConfiguration
+
+org.springframework.boot.autoconfigure.EnableAutoConfiguration= \
+  org.apache.servicecomb.pack.alpha.spec.tcc.db.AlphaSpecTccDbAutoConfiguration
diff --git a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java
index c1c80661..76bb504f 100644
--- a/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java
+++ b/alpha/alpha-ui/src/main/java/org/apache/servicecomb/pack/alpha/ui/controller/TransactionController.java
@@ -217,7 +217,7 @@ public class TransactionController {
 
   @GetMapping("/ui/transaction/statistics")
   @ResponseBody
-  public TransactionStatisticsDTO getGlobalTransactionStatistics() {
+  public TransactionStatisticsDTO getGlobalTransactionStatistics() throws Exception {
     TransactionStatisticsDTO statisticsDTO = new TransactionStatisticsDTO();
     Map<String, Long> statistics = apiv1.getTransactionStatistics();
     if (statistics.containsKey("COMMITTED")) {
@@ -234,7 +234,7 @@ public class TransactionController {
 
   @GetMapping("/ui/transaction/slow")
   @ResponseBody
-  public List<TransactionRowDTO> getSlowGlobalTransactionTopN() {
+  public List<TransactionRowDTO> getSlowGlobalTransactionTopN() throws Exception {
     List<TransactionRowDTO> transactionRowDTOS = new ArrayList<>();
     List<GlobalTransaction> transactions = apiv1.getSlowTransactions(10);
     transactions.stream().forEach(globalTransaction -> {
diff --git a/alpha/pom.xml b/alpha/pom.xml
index 25e18c34..7f13aeff 100644
--- a/alpha/pom.xml
+++ b/alpha/pom.xml
@@ -33,7 +33,10 @@
   <packaging>pom</packaging>
   <modules>
     <module>alpha-core</module>
-    <module>alpha-fsm</module>
+    <module>alpha-persistence-jpa</module>
+    <module>alpha-spec-saga-fsm</module>
+    <module>alpha-spec-saga-db</module>
+    <module>alpha-spec-tcc-db</module>
     <module>alpha-benchmark</module>
     <module>alpha-spring-cloud-starter-eureka</module>
     <module>alpha-spring-cloud-starter-consul</module>
diff --git a/demo/tcc-spring-demo/inventory/pom.xml b/demo/tcc-spring-demo/inventory/pom.xml
index 5993dab4..2c040675 100644
--- a/demo/tcc-spring-demo/inventory/pom.xml
+++ b/demo/tcc-spring-demo/inventory/pom.xml
@@ -45,10 +45,9 @@
         </exclusion>
       </exclusions>
     </dependency>
-    <!-- Added the eclipse link JPA configuration-->
     <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>org.eclipse.persistence.jpa</artifactId>
     </dependency>
     <!-- Added the driver of h2 -->
     <dependency>
diff --git a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/demo/tcc-spring-demo/inventory/src/main/java/org/apache/servicecomb/pack/demo/inventory/EclipseLinkJpaConfiguration.java
similarity index 96%
copy from persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
copy to demo/tcc-spring-demo/inventory/src/main/java/org/apache/servicecomb/pack/demo/inventory/EclipseLinkJpaConfiguration.java
index 69dbf91a..68b673a6 100644
--- a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
+++ b/demo/tcc-spring-demo/inventory/src/main/java/org/apache/servicecomb/pack/demo/inventory/EclipseLinkJpaConfiguration.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.persistence.jpa;
+package org.apache.servicecomb.pack.demo.inventory;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.sql.DataSource;
-
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
diff --git a/demo/tcc-spring-demo/inventory/src/main/resources/application.yaml b/demo/tcc-spring-demo/inventory/src/main/resources/application.yaml
index aac174ed..c6a96e2c 100644
--- a/demo/tcc-spring-demo/inventory/src/main/resources/application.yaml
+++ b/demo/tcc-spring-demo/inventory/src/main/resources/application.yaml
@@ -26,6 +26,10 @@ spring:
       show-sql: true
       generate-ddl: true
 
+omega:
+  spec:
+    names: tcc
+
 alpha:
   cluster:
     address: alpha-server.servicecomb.io:8080
diff --git a/demo/tcc-spring-demo/ordering/src/main/resources/application.yaml b/demo/tcc-spring-demo/ordering/src/main/resources/application.yaml
index 028de4e5..79818bd0 100644
--- a/demo/tcc-spring-demo/ordering/src/main/resources/application.yaml
+++ b/demo/tcc-spring-demo/ordering/src/main/resources/application.yaml
@@ -30,6 +30,11 @@ spring:
       naming:
         physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
         implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
+
+omega:
+  spec:
+    names: tcc
+
 alpha:
   cluster:
     address: alpha-server.servicecomb.io:8080
diff --git a/demo/tcc-spring-demo/payment/pom.xml b/demo/tcc-spring-demo/payment/pom.xml
index bc7da43c..baa89d4f 100644
--- a/demo/tcc-spring-demo/payment/pom.xml
+++ b/demo/tcc-spring-demo/payment/pom.xml
@@ -43,10 +43,9 @@
         </exclusion>
       </exclusions>
     </dependency>
-    <!-- Added the eclipse link JPA configuration-->
     <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>org.eclipse.persistence.jpa</artifactId>
     </dependency>
     <!-- Added the driver of h2 -->
     <dependency>
diff --git a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/demo/tcc-spring-demo/payment/src/main/java/org/apache/servicecomb/pack/demo/payment/EclipseLinkJpaConfiguration.java
similarity index 96%
copy from persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
copy to demo/tcc-spring-demo/payment/src/main/java/org/apache/servicecomb/pack/demo/payment/EclipseLinkJpaConfiguration.java
index 69dbf91a..c4eba6fe 100644
--- a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
+++ b/demo/tcc-spring-demo/payment/src/main/java/org/apache/servicecomb/pack/demo/payment/EclipseLinkJpaConfiguration.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.persistence.jpa;
+package org.apache.servicecomb.pack.demo.payment;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.sql.DataSource;
-
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
diff --git a/demo/tcc-spring-demo/payment/src/main/resources/application.yaml b/demo/tcc-spring-demo/payment/src/main/resources/application.yaml
index 1261a106..4e9b7425 100644
--- a/demo/tcc-spring-demo/payment/src/main/resources/application.yaml
+++ b/demo/tcc-spring-demo/payment/src/main/resources/application.yaml
@@ -25,7 +25,11 @@ spring:
   jpa:
     show-sql: true
     generate-ddl: true
-    
+
+omega:
+  spec:
+    names: tcc
+
 alpha:
   cluster:
     address: alpha-server.servicecomb.io:8080
diff --git a/integration-tests/explicit-transaction-context-tests/pom.xml b/integration-tests/explicit-transaction-context-tests/pom.xml
index 214fe127..7f26e757 100644
--- a/integration-tests/explicit-transaction-context-tests/pom.xml
+++ b/integration-tests/explicit-transaction-context-tests/pom.xml
@@ -81,8 +81,13 @@
       <scope>runtime</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>org.eclipse.persistence.jpa</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/EclipseLinkJpaConfiguration.java
similarity index 96%
copy from persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
copy to integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/EclipseLinkJpaConfiguration.java
index 69dbf91a..a3186769 100644
--- a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
+++ b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/EclipseLinkJpaConfiguration.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.persistence.jpa;
+package org.apache.servicecomb.pack.integration.tests.explicitcontext;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.sql.DataSource;
-
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
diff --git a/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/ExplicitTransactionContextIT.java b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/ExplicitTransactionContextIT.java
index dc2bf582..2b28d76a 100644
--- a/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/ExplicitTransactionContextIT.java
+++ b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/ExplicitTransactionContextIT.java
@@ -43,8 +43,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = GreetingApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT,
-    properties = {"server.port=8080", "spring.application.name=greeting-service"})
+@SpringBootTest(classes = {GreetingApplication.class, EclipseLinkJpaConfiguration.class}, webEnvironment = WebEnvironment.DEFINED_PORT,
+    properties = {"omega.spec.names=saga", "server.port=8080", "spring.application.name=greeting-service"})
 public class ExplicitTransactionContextIT {
   private static final String serviceName = "greeting-service";
 
diff --git a/integration-tests/pack-tests/pom.xml b/integration-tests/pack-tests/pom.xml
index 7b64b759..d3b8d346 100644
--- a/integration-tests/pack-tests/pom.xml
+++ b/integration-tests/pack-tests/pom.xml
@@ -81,8 +81,13 @@
       <scope>runtime</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>org.eclipse.persistence.jpa</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -145,9 +150,9 @@
                   <alias>alpha</alias>
                   <run>
                     <env>
-                      <JAVA_OPTS>
-                        -Dspring.profiles.active=prd -Dspring.datasource.initialization-mode=always
-                      </JAVA_OPTS>
+                      <alpha.spec.names>saga-db</alpha.spec.names>
+                      <spring.profiles.active>prd</spring.profiles.active>
+                      <spring.datasource.initialization-mode>always</spring.datasource.initialization-mode>
                     </env>
                     <links>
                       <link>postgres:postgresql.servicecomb.io</link>
diff --git a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/EclipseLinkJpaConfiguration.java
similarity index 96%
copy from persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
copy to integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/EclipseLinkJpaConfiguration.java
index 69dbf91a..64f6d0b8 100644
--- a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
+++ b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/EclipseLinkJpaConfiguration.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.persistence.jpa;
+package org.apache.servicecomb.pack.integration.tests.resttemplate;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.sql.DataSource;
-
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
diff --git a/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/PackIT.java b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/PackIT.java
index 246e9519..2e5a8fdc 100644
--- a/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/PackIT.java
+++ b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/PackIT.java
@@ -44,8 +44,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = GreetingApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT,
-    properties = {"server.port=8080", "spring.application.name=greeting-service"})
+@SpringBootTest(classes = {GreetingApplication.class, EclipseLinkJpaConfiguration.class}, webEnvironment = WebEnvironment.DEFINED_PORT,
+    properties = {"omega.spec.names=saga", "server.port=8080", "spring.application.name=greeting-service"})
 public class PackIT {
   private static final String serviceName = "greeting-service";
 
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
index 021cbaea..f9676d7a 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringAutoConfiguration.java
@@ -23,7 +23,9 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 @Configuration
-@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})
+@Import({OmegaSpringConfig.class, OmegaTccSpringConfig.class, OmegaSagaSpringConfig.class,
+    TransactionAspectConfig.class})
 @ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)
 public class OmegaSpringAutoConfiguration {
+
 }
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java
index 5f54972c..704ff8bb 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java
@@ -18,42 +18,39 @@
 package org.apache.servicecomb.pack.omega.spring;
 
 import com.google.common.collect.ImmutableList;
+import java.lang.invoke.MethodHandles;
 import org.apache.servicecomb.pack.common.AlphaMetaKeys;
 import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
-import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterDiscovery;
 import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterConfig;
+import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterDiscovery;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.FastestSender;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.LoadBalanceContext;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.LoadBalanceContextBuilder;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.TransactionType;
 import org.apache.servicecomb.pack.omega.connector.grpc.saga.SagaLoadBalanceSender;
-import org.apache.servicecomb.pack.omega.connector.grpc.tcc.TccLoadBalanceSender;
 import org.apache.servicecomb.pack.omega.context.AlphaMetas;
-import org.apache.servicecomb.pack.omega.transaction.CallbackContext;
 import org.apache.servicecomb.pack.omega.context.IdGenerator;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.context.ServiceConfig;
 import org.apache.servicecomb.pack.omega.context.UniqueIdGenerator;
 import org.apache.servicecomb.pack.omega.format.KryoMessageFormat;
 import org.apache.servicecomb.pack.omega.format.MessageFormat;
+import org.apache.servicecomb.pack.omega.transaction.CallbackContext;
 import org.apache.servicecomb.pack.omega.transaction.MessageHandler;
 import org.apache.servicecomb.pack.omega.transaction.SagaMessageSender;
-import org.apache.servicecomb.pack.omega.transaction.tcc.DefaultParametersContext;
-import org.apache.servicecomb.pack.omega.transaction.tcc.ParametersContext;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
-import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-import java.lang.invoke.MethodHandles;
-
 @Configuration
 class OmegaSpringConfig {
 
@@ -66,20 +63,17 @@ class OmegaSpringConfig {
   }
 
   @Bean
-  OmegaContext omegaContext(@Qualifier("omegaUniqueIdGenerator") IdGenerator<String> idGenerator, SagaMessageSender messageSender) {
-    ServerMeta serverMeta = messageSender.onGetServerMeta();
-    boolean akkaEnabeld = Boolean.parseBoolean(serverMeta.getMetaMap().get(AlphaMetaKeys.AkkaEnabled.name()));
-    return new OmegaContext(idGenerator, AlphaMetas.builder().akkaEnabled(akkaEnabeld).build());
-  }
-
-  @Bean(name = {"compensationContext"})
-  CallbackContext compensationContext(OmegaContext omegaContext, SagaMessageSender sender) {
-    return new CallbackContext(omegaContext, sender);
-  }
-
-  @Bean(name = {"coordinateContext"})
-  CallbackContext coordinateContext(OmegaContext omegaContext, SagaMessageSender sender) {
-    return new CallbackContext(omegaContext, sender);
+  OmegaContext omegaContext(@Qualifier("omegaUniqueIdGenerator") IdGenerator<String> idGenerator, @Autowired(required = false) SagaMessageSender messageSender) {
+    if(messageSender!=null){
+      ServerMeta serverMeta = messageSender.onGetServerMeta();
+      boolean akkaEnabeld = false;
+      if(serverMeta!=null){
+        akkaEnabeld = Boolean.parseBoolean(serverMeta.getMetaMap().get(AlphaMetaKeys.AkkaEnabled.name()));
+      }
+      return new OmegaContext(idGenerator, AlphaMetas.builder().akkaEnabled(akkaEnabeld).build());
+    }else{
+      return new OmegaContext(idGenerator, AlphaMetas.builder().build());
+    }
   }
 
   @Bean
@@ -87,11 +81,6 @@ class OmegaSpringConfig {
     return new ServiceConfig(serviceName,instanceId);
   }
 
-  @Bean
-  ParametersContext parametersContext() {
-    return new DefaultParametersContext();
-  }
-
   @Bean
   @ConditionalOnProperty(name = "alpha.cluster.register.type", havingValue = "default", matchIfMissing = true)
   AlphaClusterDiscovery alphaClusterAddress(@Value("${alpha.cluster.address:0.0.0.0:8080}") String[] addresses){
@@ -125,62 +114,4 @@ class OmegaSpringConfig {
         .build();
     return clusterConfig;
   }
-
-  @Bean(name = "sagaLoadContext")
-  LoadBalanceContext sagaLoadBalanceSenderContext(
-      AlphaClusterConfig alphaClusterConfig,
-      ServiceConfig serviceConfig,
-      @Value("${omega.connection.reconnectDelay:3000}") int reconnectDelay,
-      @Value("${omega.connection.sending.timeout:8}") int timeoutSeconds) {
-    LoadBalanceContext loadBalanceSenderContext = new LoadBalanceContextBuilder(
-        TransactionType.SAGA,
-        alphaClusterConfig,
-        serviceConfig,
-        reconnectDelay,
-        timeoutSeconds).build();
-    return loadBalanceSenderContext;
-  }
-
-  @Bean
-  SagaMessageSender sagaLoadBalanceSender(@Qualifier("sagaLoadContext") LoadBalanceContext loadBalanceSenderContext) {
-    final SagaMessageSender sagaMessageSender = new SagaLoadBalanceSender(loadBalanceSenderContext, new FastestSender());
-    sagaMessageSender.onConnected();
-    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
-      @Override
-      public void run() {
-        sagaMessageSender.onDisconnected();
-        sagaMessageSender.close();
-      }
-    }));
-    return sagaMessageSender;
-  }
-
-  @Bean(name = "tccLoadContext")
-  LoadBalanceContext loadBalanceSenderContext(
-      AlphaClusterConfig alphaClusterConfig,
-      ServiceConfig serviceConfig,
-      @Value("${omega.connection.reconnectDelay:3000}") int reconnectDelay,
-      @Value("${omega.connection.sending.timeout:8}") int timeoutSeconds) {
-    LoadBalanceContext loadBalanceSenderContext = new LoadBalanceContextBuilder(
-        TransactionType.TCC,
-        alphaClusterConfig,
-        serviceConfig,
-        reconnectDelay,
-        timeoutSeconds).build();
-    return loadBalanceSenderContext;
-  }
-
-  @Bean
-  TccMessageSender tccLoadBalanceSender(@Qualifier("tccLoadContext") LoadBalanceContext loadBalanceSenderContext) {
-    final TccMessageSender tccMessageSender = new TccLoadBalanceSender(loadBalanceSenderContext, new FastestSender());
-    tccMessageSender.onConnected();
-    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
-      @Override
-      public void run() {
-        tccMessageSender.onDisconnected();
-        tccMessageSender.close();
-      }
-    }));
-    return tccMessageSender;
-  }
 }
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaTccSpringConfig.java
similarity index 53%
copy from omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java
copy to omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaTccSpringConfig.java
index 5f54972c..4e7b5831 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSpringConfig.java
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaTccSpringConfig.java
@@ -18,10 +18,11 @@
 package org.apache.servicecomb.pack.omega.spring;
 
 import com.google.common.collect.ImmutableList;
+import java.lang.invoke.MethodHandles;
 import org.apache.servicecomb.pack.common.AlphaMetaKeys;
 import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
-import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterDiscovery;
 import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterConfig;
+import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterDiscovery;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.FastestSender;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.LoadBalanceContext;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.LoadBalanceContextBuilder;
@@ -29,13 +30,13 @@ import org.apache.servicecomb.pack.omega.connector.grpc.core.TransactionType;
 import org.apache.servicecomb.pack.omega.connector.grpc.saga.SagaLoadBalanceSender;
 import org.apache.servicecomb.pack.omega.connector.grpc.tcc.TccLoadBalanceSender;
 import org.apache.servicecomb.pack.omega.context.AlphaMetas;
-import org.apache.servicecomb.pack.omega.transaction.CallbackContext;
 import org.apache.servicecomb.pack.omega.context.IdGenerator;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.context.ServiceConfig;
 import org.apache.servicecomb.pack.omega.context.UniqueIdGenerator;
 import org.apache.servicecomb.pack.omega.format.KryoMessageFormat;
 import org.apache.servicecomb.pack.omega.format.MessageFormat;
+import org.apache.servicecomb.pack.omega.transaction.CallbackContext;
 import org.apache.servicecomb.pack.omega.transaction.MessageHandler;
 import org.apache.servicecomb.pack.omega.transaction.SagaMessageSender;
 import org.apache.servicecomb.pack.omega.transaction.tcc.DefaultParametersContext;
@@ -46,45 +47,21 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-import java.lang.invoke.MethodHandles;
-
 @Configuration
-class OmegaSpringConfig {
+@ConditionalOnExpression("'${omega.spec.names}'.contains('tcc')")
+class OmegaTccSpringConfig {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  @ConditionalOnMissingBean
-  @Bean(name = {"omegaUniqueIdGenerator"})
-  IdGenerator<String> idGenerator() {
-    return new UniqueIdGenerator();
-  }
-
-  @Bean
-  OmegaContext omegaContext(@Qualifier("omegaUniqueIdGenerator") IdGenerator<String> idGenerator, SagaMessageSender messageSender) {
-    ServerMeta serverMeta = messageSender.onGetServerMeta();
-    boolean akkaEnabeld = Boolean.parseBoolean(serverMeta.getMetaMap().get(AlphaMetaKeys.AkkaEnabled.name()));
-    return new OmegaContext(idGenerator, AlphaMetas.builder().akkaEnabled(akkaEnabeld).build());
-  }
-
-  @Bean(name = {"compensationContext"})
-  CallbackContext compensationContext(OmegaContext omegaContext, SagaMessageSender sender) {
-    return new CallbackContext(omegaContext, sender);
-  }
-
-  @Bean(name = {"coordinateContext"})
-  CallbackContext coordinateContext(OmegaContext omegaContext, SagaMessageSender sender) {
-    return new CallbackContext(omegaContext, sender);
-  }
-
-  @Bean
-  ServiceConfig serviceConfig(@Value("${spring.application.name}") String serviceName, @Value("${omega.instance.instanceId:#{null}}") String instanceId) {
-    return new ServiceConfig(serviceName,instanceId);
+  public OmegaTccSpringConfig() {
+    LOG.info("Omega Specification TCC");
   }
 
   @Bean
@@ -92,67 +69,9 @@ class OmegaSpringConfig {
     return new DefaultParametersContext();
   }
 
-  @Bean
-  @ConditionalOnProperty(name = "alpha.cluster.register.type", havingValue = "default", matchIfMissing = true)
-  AlphaClusterDiscovery alphaClusterAddress(@Value("${alpha.cluster.address:0.0.0.0:8080}") String[] addresses){
-    return AlphaClusterDiscovery.builder().addresses(addresses).build();
-  }
-
-  @Bean
-  AlphaClusterConfig alphaClusterConfig(
-      @Value("${alpha.cluster.ssl.enable:false}") boolean enableSSL,
-      @Value("${alpha.cluster.ssl.mutualAuth:false}") boolean mutualAuth,
-      @Value("${alpha.cluster.ssl.cert:client.crt}") String cert,
-      @Value("${alpha.cluster.ssl.key:client.pem}") String key,
-      @Value("${alpha.cluster.ssl.certChain:ca.crt}") String certChain,
-      @Lazy AlphaClusterDiscovery alphaClusterDiscovery,
-      @Lazy MessageHandler handler,
-      @Lazy TccMessageHandler tccMessageHandler) {
-
-    LOG.info("Discovery alpha cluster address {} from {}",alphaClusterDiscovery.getAddresses() == null ? "" : String.join(",",alphaClusterDiscovery.getAddresses()), alphaClusterDiscovery.getDiscoveryType().name());
-    MessageFormat messageFormat = new KryoMessageFormat();
-    AlphaClusterConfig clusterConfig = AlphaClusterConfig.builder()
-        .addresses(ImmutableList.copyOf(alphaClusterDiscovery.getAddresses()))
-        .enableSSL(enableSSL)
-        .enableMutualAuth(mutualAuth)
-        .cert(cert)
-        .key(key)
-        .certChain(certChain)
-        .messageDeserializer(messageFormat)
-        .messageSerializer(messageFormat)
-        .messageHandler(handler)
-        .tccMessageHandler(tccMessageHandler)
-        .build();
-    return clusterConfig;
-  }
-
-  @Bean(name = "sagaLoadContext")
-  LoadBalanceContext sagaLoadBalanceSenderContext(
-      AlphaClusterConfig alphaClusterConfig,
-      ServiceConfig serviceConfig,
-      @Value("${omega.connection.reconnectDelay:3000}") int reconnectDelay,
-      @Value("${omega.connection.sending.timeout:8}") int timeoutSeconds) {
-    LoadBalanceContext loadBalanceSenderContext = new LoadBalanceContextBuilder(
-        TransactionType.SAGA,
-        alphaClusterConfig,
-        serviceConfig,
-        reconnectDelay,
-        timeoutSeconds).build();
-    return loadBalanceSenderContext;
-  }
-
-  @Bean
-  SagaMessageSender sagaLoadBalanceSender(@Qualifier("sagaLoadContext") LoadBalanceContext loadBalanceSenderContext) {
-    final SagaMessageSender sagaMessageSender = new SagaLoadBalanceSender(loadBalanceSenderContext, new FastestSender());
-    sagaMessageSender.onConnected();
-    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
-      @Override
-      public void run() {
-        sagaMessageSender.onDisconnected();
-        sagaMessageSender.close();
-      }
-    }));
-    return sagaMessageSender;
+  @Bean(name = {"coordinateContext"})
+  CallbackContext coordinateContext(OmegaContext omegaContext) {
+    return new CallbackContext(omegaContext, null);
   }
 
   @Bean(name = "tccLoadContext")
diff --git a/omega/omega-spring-tx/pom.xml b/omega/omega-spring-tx/pom.xml
index 0138783a..f15b6682 100644
--- a/omega/omega-spring-tx/pom.xml
+++ b/omega/omega-spring-tx/pom.xml
@@ -75,8 +75,12 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>persistence-jpa</artifactId>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>org.eclipse.persistence.jpa</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionAspectConfig.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionAspectConfig.java
index b9f5527e..87a4bf23 100644
--- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionAspectConfig.java
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionAspectConfig.java
@@ -31,6 +31,7 @@ import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccParticipatorAspect;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccStartAspect;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
@@ -40,21 +41,25 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
 public class TransactionAspectConfig {
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('saga')")
   MessageHandler messageHandler(SagaMessageSender sender,
       @Qualifier("compensationContext") CallbackContext context, OmegaContext omegaContext) {
     return new CompensationMessageHandler(sender, context);
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('saga')")
   SagaStartAspect sagaStartAspect(SagaMessageSender sender, OmegaContext context) {
     return new SagaStartAspect(sender, context);
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('saga')")
   TransactionAspect transactionAspect(SagaMessageSender sender, OmegaContext context) {
     return new TransactionAspect(sender, context);
   }
 
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('saga')")
   @Bean
   CompensableAnnotationProcessor compensableAnnotationProcessor(OmegaContext omegaContext,
       @Qualifier("compensationContext") CallbackContext compensationContext) {
@@ -62,6 +67,7 @@ public class TransactionAspectConfig {
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('tcc')")
   TccMessageHandler coordinateMessageHandler(
       TccMessageSender tccMessageSender,
       @Qualifier("coordinateContext") CallbackContext coordinateContext,
@@ -71,6 +77,7 @@ public class TransactionAspectConfig {
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('tcc')")
   TccStartAspect tccStartAspect(
       TccMessageSender tccMessageSender,
       OmegaContext context) {
@@ -78,6 +85,7 @@ public class TransactionAspectConfig {
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('tcc')")
   TccParticipatorAspect tccParticipatorAspect(
       TccMessageSender tccMessageSender,
       OmegaContext context, ParametersContext parametersContext) {
@@ -85,6 +93,7 @@ public class TransactionAspectConfig {
   }
 
   @Bean
+  @ConditionalOnExpression("'${omega.spec.names}'.contains('tcc')")
   ParticipateAnnotationProcessor participateAnnotationProcessor(OmegaContext omegaContext,
       @Qualifier("coordinateContext") CallbackContext coordinateContext) {
     return new ParticipateAnnotationProcessor(omegaContext, coordinateContext);
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/CompensableAnnotationCheckingTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/CompensableAnnotationCheckingTest.java
index 018d08c7..6884ba51 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/CompensableAnnotationCheckingTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/CompensableAnnotationCheckingTest.java
@@ -34,7 +34,8 @@ public class CompensableAnnotationCheckingTest {
     try {
       try (ConfigurableApplicationContext ignored = new SpringApplicationBuilder(TransactionTestMain.class)
           .profiles("annotation-checking")
-          .properties("spring.jpa.hibernate.ddl-auto=none",
+          .properties("omega.spec.names=saga",
+              "spring.jpa.hibernate.ddl-auto=none",
               "spring.datasource.driver-class-name=org.h2.Driver",
               "spring.datasource.url=jdbc:h2:mem:alpha;MODE=MYSQL")
           .run()) {
@@ -50,7 +51,8 @@ public class CompensableAnnotationCheckingTest {
     try {
       try (ConfigurableApplicationContext ignored = new SpringApplicationBuilder(TransactionTestMain.class)
           .profiles("annotation-retries-checking")
-          .properties("spring.jpa.hibernate.ddl-auto=none",
+          .properties("omega.spec.names=saga",
+              "spring.jpa.hibernate.ddl-auto=none",
               "spring.datasource.driver-class-name=org.h2.Driver",
               "spring.datasource.url=jdbc:h2:mem:alpha;MODE=MYSQL")
           .run()) {
@@ -66,7 +68,8 @@ public class CompensableAnnotationCheckingTest {
     try {
       try (ConfigurableApplicationContext ignored = new SpringApplicationBuilder(TransactionTestMain.class)
           .profiles("omega-context-aware-checking")
-          .properties("spring.jpa.hibernate.ddl-auto=none",
+          .properties("omega.spec.names=saga",
+              "spring.jpa.hibernate.ddl-auto=none",
               "spring.datasource.driver-class-name=org.h2.Driver",
               "spring.datasource.url=jdbc:h2:mem:alpha;MODE=MYSQL")
           .run()) {
diff --git a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/EclipseLinkJpaConfiguration.java
similarity index 96%
rename from persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
rename to omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/EclipseLinkJpaConfiguration.java
index 69dbf91a..7f9221dd 100644
--- a/persistence/persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/EclipseLinkJpaConfiguration.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.persistence.jpa;
+package org.apache.servicecomb.pack.omega.transaction.spring;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.sql.DataSource;
-
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
index 375ae71c..0a6bb30b 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
@@ -30,8 +30,6 @@ import java.util.List;
 import java.util.UUID;
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.omega.context.IdGenerator;
-import org.apache.servicecomb.pack.omega.transaction.TxCompensateAckFailedEvent;
-import org.apache.servicecomb.pack.omega.transaction.TxCompensateAckSucceedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.junit.After;
@@ -45,10 +43,11 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(properties = {
+    "omega.spec.names=tcc",
     "spring.jpa.hibernate.ddl-auto=none",
     "spring.datasource.driver-class-name=org.h2.Driver",
     "spring.datasource.url=jdbc:h2:mem:alpha;MODE=MYSQL"},
-    classes = {TransactionTestMain.class, MessageConfig.class})
+    classes = {TransactionTestMain.class, MessageConfig.class, EclipseLinkJpaConfiguration.class})
 public class TccInterceptorTest {
 
   private static final String globalTxId = UUID.randomUUID().toString();
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionInterceptionTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionInterceptionTest.java
index 69c9f9e3..cbac3722 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionInterceptionTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionInterceptionTest.java
@@ -67,10 +67,11 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(properties = {
+    "omega.spec.names=saga",
     "spring.jpa.hibernate.ddl-auto=none",
     "spring.datasource.driver-class-name=org.h2.Driver",
     "spring.datasource.url=jdbc:h2:mem:alpha;MODE=MYSQL"},
-    classes = {TransactionTestMain.class, MessageConfig.class})
+    classes = {TransactionTestMain.class, MessageConfig.class, EclipseLinkJpaConfiguration.class})
 @AutoConfigureMockMvc
 public class TransactionInterceptionTest {
   @SuppressWarnings("unchecked")
diff --git a/pack-dependencies/pom.xml b/pack-dependencies/pom.xml
index 8b57a995..85848772 100644
--- a/pack-dependencies/pom.xml
+++ b/pack-dependencies/pom.xml
@@ -279,7 +279,22 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb.pack</groupId>
-        <artifactId>alpha-fsm</artifactId>
+        <artifactId>alpha-spec-saga-fsm</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb.pack</groupId>
+        <artifactId>alpha-spec-saga-db</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb.pack</groupId>
+        <artifactId>alpha-spec-tcc-db</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb.pack</groupId>
+        <artifactId>alpha-persistence-jpa</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
@@ -325,7 +340,7 @@
       <!-- TODO rename this artifact -->
       <dependency>
         <groupId>org.apache.servicecomb.pack</groupId>
-        <artifactId>persistence-jpa</artifactId>
+        <artifactId>alpha-persistence-jpa</artifactId>
         <version>${project.version}</version>
       </dependency>
 
diff --git a/pom.xml b/pom.xml
index 5fba82b5..e78f7840 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,6 @@
     <module>pack-contracts</module>
     <module>pack-common</module>
     <module>integration-tests</module>
-    <module>persistence</module>
     <module>web</module>
   </modules>